XGBoost 3.3.0 adds reg:expectileerror, turns categorical support on by default, raises Python to 3.12+, and deprecates gblinear—upgrade notes for after-work data/ML practice.
XGBoost 3.3.0 is a practical release for after-work data and ML practice. It adds expectile regression (reg:expectileerror), turns categorical feature support on by default, raises the minimum Python version to 3.12+, and deprecates the gblinear booster. The release blog is dated 21 July 2026; the docs changes for v3.3.0 land around 17 June 2026. Artifacts are on the usual package channels.
This article is for evening learners who already fit models with scikit-learn-style APIs or who are ready to try gradient boosting on a small CSV. It is upgrade notes and a short practice plan — not a full textbook on boosting theory, and not a trading-system pitch. The only course CTA is SoloQuant Academy’s Introduction to Python Programming.
From the XGBoost 3.3.0 release post:
reg:expectileerror, an expectile metric, and expectile_alpha. Multiple expectiles are supported. Unlike quantile curves, expectiles do not suffer from crossing.enable_categorical=True in the common case. The flag remains if you need to turn categorical handling off.gblinear deprecated, with removal planned later. Prefer tree boosters; plan migrations if you still depend on the linear booster.If you only remember three things after a long day: expectiles for asymmetric squared-style targets, categoricals without an opt-in flag, and Python 3.12 as the floor.
Quantile regression is the familiar sibling: estimate a conditional percentile. Expectile regression is the asymmetric squared-loss analogue. XGBoost exposes it through:
reg:expectileerrorexpectileexpectile_alpha (controls which expectile you target)Why evening practitioners care:
You do not need a finance desk to try this. A toy regression on housing prices, bike counts, or any skewed continuous target is enough. Pick one expectile_alpha, fit, compare residuals to a plain squared-error model, and write three sentences in your notes. That is a complete after-work experiment.
Conceptual sketch (check current docs for exact parameter names in your install):
import xgboost as xgb
# Pseudocode-style: confirm params against your 3.3 docs
params = {
"objective": "reg:expectileerror",
"eval_metric": "expectile",
"expectile_alpha": 0.8,
"tree_method": "hist",
}
# Build DMatrix / use sklearn API as you usually do, then train.
Treat the snippet as a prompt to open the 3.3 docs — preview your installed version with import xgboost; print(xgboost.__version__) before copying parameters from memory.
Categorical support matured enough that 3.3 turns it on by default. Dataframes with categorical columns can pass into XGBoost without an extra opt-in step. If you need the old behaviour, enable_categorical is still there to disable.
For after-work learners this removes a common footgun: “I one-hot encoded everything because a tutorial from 2021 said so.” You can still encode manually when it helps. You no longer must flip a special flag just to let native categorical splits work in the usual hist workflow.
Related note from the release: CPU hist also gained one-hot categorical split support for the work-in-progress vector-leaf model. Vector-leaf trees remain under active development; treat that as a “watch the changelog” item, not tonight’s homework.
gblinear deprecationPython floor: 3.3.0 requires Python 3.12 or newer. If your evening environment is still on 3.10 or 3.11, upgrade the interpreter (or a dedicated study venv) before you pip install --upgrade xgboost into it. Mixing an old Python with a new wheel is a classic late-night failure mode.
gblinear: deprecated in 3.3.0, removal later. XGBoost is primarily a decision-tree library; the linear booster did not keep pace with categorical splits, interaction/monotone constraints, or TreeSHAP-style explanations. If your old notebooks set booster=gblinear, schedule a migration night: switch to tree boosters or another linear estimator outside XGBoost.
Upgrade paths from the release post:
pip install --upgrade xgboost
# or
conda install -c conda-forge xgboost
Do not spend your whole evening here, but know they exist:
Glance, then return to expectiles + categoricals + Python version. Those three change how you write tonight’s notebook.
Prerequisites: Python 3.12+, a small tabular CSV with at least one categorical column and one continuous target, and a working XGBoost install you are ready to upgrade.
python --version ≥ 3.12. Upgrade XGBoost. Print xgboost.__version__ and confirm 3.3.x.XGBRegressor (or classifier) without setting enable_categorical=True. Confirm training runs. Optionally flip the flag off once to see the contrast.reg:expectileerror, set expectile_alpha (try 0.5 then 0.9 on a second run if time remains), and compare a simple error summary to your usual squared-error baseline. No hyperparameter sweep.gblinear. If found, open a tracked issue or README checkbox: migrate before removal. Stop.Success is a notebook that trains under 3.3 defaults and one expectile run logged in your notes — not a Kaggle score chase.
Solid Python — environments, syntax, and first libraries — still comes before fancy objectives. When you want guided short lessons after work, use SoloQuant Academy’s Introduction to Python Programming. Come back to XGBoost 3.3 when your interpreter is on 3.12+ and you have a tiny tabular project ready for expectiles and native categoricals.
reg:expectileerror, expectile, expectile_alpha, multi-expectile, no crossing), categorical on by default, Python ≥ 3.12, gblinear deprecation, GPU quantile sketch memory, SHAP for vector-leaf, and related performance notes (blog 21 July 2026; v3.3.0 docs changes 17 June 2026).