Add AutoGluon-resolved validation wrappers (V2) and preset-driven model-specific preprocessing - #465
Open
Innixma wants to merge 2 commits into
Open
Add AutoGluon-resolved validation wrappers (V2) and preset-driven model-specific preprocessing#465Innixma wants to merge 2 commits into
Innixma wants to merge 2 commits into
Conversation
`generate_all_figs` builds the composite from each subset's compact website-format leaderboard, which by default renames partially-imputed methods to `<method> [X% IMPUTED]`. The imputation rate differs per subset, so the same method arrived under a different name per subset and the composite's name-keyed alignment fragmented it into per-subset rows that never joined: EXAONE-Tabular showed an Elo only in the `all` column with NaN everywhere else, despite having un-imputed results on every classification subset. The composite input is now built with `include_imputed_in_name=False`. Imputed rates stay visible in the per-subset website CSVs and as their own column; the composite loses only the in-name annotation, in exchange for methods aligning. Remaining NaN cells are real: fully-imputed subsets are filtered, so a blank means the method cannot run there (e.g. a classification-only model on regression), not a failed join. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ELdutHiUqkvynzEP7EnPsi
…el-specific preprocessing Two related additions for running AutoGluon presets through the TabArena benchmark framework: AGWrapperV2 / AGSingleWrapperV2 / AGSingleBagWrapperV2 (plus the AGExperimentV2 and AGModelBagExperimentV2 flavours that fix them) declare a task's grouped / temporal structure to TabularPredictor.fit via validation_structure instead of resolving folds in TabArena and passing custom_splits. This is the path for full-predictor preset runs on non-IID data, where one fit trains many models and TabArena cannot pre-resolve splits per model. TabArenaExperimentBundle and generate_bag_experiments gain an experiment-class knob to opt into the V2 flavour. AGExperiment._apply_model_specific_preprocessing now resolves the hyperparameters the same way TabularPredictor.fit does before injecting the model-specific preprocessing: a named config string (e.g. a preset's "noncommercial_2026_08_05") is expanded via get_hyperparameter_config, a bare presets= run takes the hyperparameters entry from the preset dict(s) with AutoGluon's merge semantics (aliases, first-to-last, explicit key blocks the presets), and nothing from either source falls back to "default". Previously any non-dict hyperparameters silently skipped the injection, so preset-driven runs lost the object-to-category encoding and models whose encoders only handle category dtype (e.g. TabDPT) crashed on raw string columns. Unresolvable shapes now warn instead of passing silently. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ELdutHiUqkvynzEP7EnPsi
LennartPurucker
requested changes
Aug 6, 2026
| SPLIT_RANDOM_STATE = 4267 | ||
|
|
||
|
|
||
| class AGWrapperV2(AGWrapper): |
Collaborator
There was a problem hiding this comment.
Mhm, I am not sure we would want to support it in this way. We dont want to have more diverging pipelines for how models are benchmarked. IMO a bigger discussion. If this is just for running AutoGluon, then we can go to the systems API. If this is for benchmarking, we shoud talk more about it
Collaborator
Author
There was a problem hiding this comment.
Note: I haven't actually looked over this code myself very closely, but it was what I was using for running AG on BeyondArena
Collaborator
There was a problem hiding this comment.
Should be fine for now, but I would argue against committing this for long-term use IMO.
The new system's API is better suited then for fairness and our own sanity to avoid more divering pipelines
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Two related additions for running AutoGluon presets through the TabArena benchmark framework.
V2 wrappers: AutoGluon resolves the validation splits
AGWrapperV2/AGSingleWrapperV2/AGSingleBagWrapperV2(plus theAGExperimentV2andAGModelBagExperimentV2experiment flavours that fix them) declare a task's grouped / temporal structure toTabularPredictor.fit(validation_structure=...)instead of resolving folds in TabArena and passingcustom_splits. This is the path for full-predictor preset runs on non-IID data, where one fit trains many models and TabArena cannot pre-resolve splits per model.TabArenaExperimentBundleandgenerate_bag_experimentsgain abag_experiment_cls/experiment_clsknob to opt into the V2 flavour. This is the infrastructure the AutoGluon 1.6 release benchmark runs (TabArena-Full and BeyondArena-Core) used.Preset-driven runs now get the model-specific preprocessing
AGExperiment._apply_model_specific_preprocessingpreviously skipped injection wheneverfit_kwargs["hyperparameters"]was not a dict, which is exactly what a preset-driven run looks like (the shipped presets carry a named portfolio string such as"noncommercial_2026_08_05"). Every model then silently missed the model-specific step, most importantly theNoCatAsStringCategoryFeatureGeneratorencoding of string columns. Models whose encoders only handlecategorydtype crashed on raw object columns: in the 1.6 release benchmark, TabDPT-Turbo failed deterministically on the 5 TabArena datasets that carry object-dtype columns (seismic-bumps, in_vehicle_coupon_recommendation, coil2000_insurance_policies, bank-marketing, HR_Analytics_Job_Change_of_Data_Scientists), 90 model skips across both arms.The method now resolves the hyperparameters the same way
TabularPredictor.fitdoes before injecting:get_hyperparameter_config(a typo raises the valid-namesValueErrorat experiment-preprocessing time instead of inside the fit)presets=run takes thehyperparametersentry from the preset dict(s), with AutoGluon's exact merge semantics: aliases resolve, presets apply first-to-last with the last one setting the key winning, and an explicithyperparameterskey (evenNone) blocks the presets' valuefit's own"default"The resolved dict is written back to the per-run copy of
fit_kwargs. Explicit fit kwargs take precedence over presets in AutoGluon and the value equals what the preset would have resolved to, so the fit itself is unchanged; it only gains the per-model preprocessing. Shapes that cannot be resolved (for example an int) warn instead of passing silently.Verification
tests/tabarena/benchmark/experiment/test_build_config_pipeline.pycover the named-config expansion, the typo error, bare presets with alias resolution, a preset without ahyperparametersentry (falls back to"default"), the explicit-None-blocks-preset precedence, last-preset-wins on preset lists, and the unresolvable-shape warning. 459 tests pass across the experiment and preprocessing suites.AGExperimentV2plus a deep-copiednoncommercialpreset): all portfolio configs get wrapped, TabDPT-Turbo receives theIdentity+NoCatAsStringCategoryFeatureGeneratorstack, and PrepLightGBM composes the default stage with its own TabPrep pipeline instead of losing either.fit_kwargsstill carries the original string (resolution happens on the per-run deepcopy), so cache identity is unaffected.🤖 Generated with Claude Code
https://claude.ai/code/session_01ELdutHiUqkvynzEP7EnPsi