#################################
3.1.3 Patch Release (Jan 08 2026)
#################################

- Scikit-learn 1.8 compatibility fix (:pr:`11858`)
- Add ARM CUDA wheels for PyPI. (:pr:`11827`) Add nccl as dep for aarch64. (:pr:`11753`)
- [R] Fix off-by-one bug: nrounds=0 resulted in 2 iterations :pr:`11856`
- [R] Fix mingw warnings, winbuilder check warnings, memory safety issues. (:pr:`11859`, :pr:`11847`, :pr:`11830`, :pr:`11906`)
- Avoid overflow in rounding estimation. (:pr:`11910`)
- Workaround compiler issue on Windows, affects the use of max_delta_step with CUDA. (:pr:`11916`)

#################################
3.1.2 Patch Release (Nov 20 2025)
#################################

- Fix loading nccl 2.28. (:pr:`11806`)
- Fix ordering of Python callbacks. (:pr:`11812`)
- Infer the ``enable_categorical`` during model load. (:pr:`11816`)

#################################
3.1.1 Patch Release (Oct 22 2025)
#################################

- Emit correct error when performing inplace-predict using a CPU-only version of XGBoost,
  but with a GPU input. (:pr:`11761`)
- Enhance the error message for loading the removed binary model format. (:pr:`11760`)
- Use the correct group ID for SHAP when the intercept is a vector. (:pr:`11764`)

###################
3.1.0 (2025 Sep 22)
###################

We are delighted to share the latest 3.1.0 update for XGBoost.

********************
Categorical Re-coder
********************

This release features a major update to categorical data support by introducing a
re-coder. This re-coder saves categories in the trained model and re-codes the data during
inference, to keep the categorical encoding consistent. Aside from primitive types like
integers, it also supports string-based categories. The implementation works with all
supported Python DataFrame implementations. (:pr:`11609`, :pr:`11665`, :pr:`11605`,
:pr:`11628`, :pr:`11598`, :pr:`11591`, :pr:`11568`, :pr:`11561`, :pr:`11650`, :pr:`11621`,
:pr:`11611`, :pr:`11313`, :pr:`11311`, :pr:`11310`, :pr:`11315`, :pr:`11303`, :pr:`11612`,
:pr:`11098`, :pr:`11347`) See :ref:`cat-recode` for more information. (:pr:`11297`)

In addition, categorical support for Polars data frames is now available (:pr:`11565`).

Lastly, we removed the experimental tag for categorical feature support in this
release. (:pr:`11690`)

***************
External Memory
***************

We continue the work on external memory support on 3.1. In this release, XGBoost features
an adaptive cache for CUDA external memory. The improved cache can split the data between
CPU memory and GPU memory according to the underlying hardware and data
size. (:pr:`11556`, :pr:`11465`, :pr:`11664`, :pr:`11594`, :pr:`11469`, :pr:`11547`,
:pr:`11339`, :pr:`11477`, :pr:`11453`, :pr:`11446`, :pr:`11458`, :pr:`11426`, :pr:`11566`,
:pr:`11497`)

Also, there's an optional support (opt-in) for using ``nvcomp`` and the GB200
decompression engine to handle sparse data (requires nvcomp as a plugin) (:pr:`11451`,
:pr:`11464`, :pr:`11460`, :pr:`11512`, :pr:`11520`). We improved the memory usage of
quantile sketching with external memory (:pr:`11641`) and optimized the predictor for
training (:pr:`11548`). To help ensure the training performance, the latest XGBoost
features detection for NUMA (Non-Uniform Memory Access) node (:pr:`11538`, :pr:`11576`) for checking cross-socket data
access. We are working on additional tooling to enhance NUMA node performance. Aside from
features, we have also added various documentation improvements. (:pr:`11412`,
:pr:`11631`)

Lastly, external memory support with text file input has been removed
(:pr:`11562`). Moving forward, we will focus on iterator inputs.


****************************
Multi-Target/Class Intercept
****************************

Starting with 3.1, the base-score (intercept) is estimated and stored as a vector when the
model has multiple outputs, be it multi-target regression or multi-class
classification. This change enhances the initial estimation for multi-output models and
will be the starting point for future work on vector-leaf. (:pr:`11277`, :pr:`11651`,
:pr:`11625`, :pr:`11649`, :pr:`11630`, :pr:`11647`, :pr:`11656`, :pr:`11663`)

********
Features
********

- Support leaf prediction with QDM on CPU. (:pr:`11620`)
- Improve seed with mean sampling for the first iteration. (:pr:`11639`)
- Optionally include git hash in CMake build. (:pr:`11587`)

****************************
Removing Deprecated Features
****************************

This version removes some deprecated features, notably, the binary IO format, along with
features deprecated in 2.0.

- Binary serialization format has been removed in 3.1. The format has been formally
  deprecated in `1.6 <https://github.com/dmlc/xgboost/issues/7547>`__. (:pr:`11307`,
  :pr:`11553`, :pr:`11552`, :pr:`11602`)

- Removed old GPU-related parameters including ``use_gpu`` (pyspark), ``gpu_id``,
  ``gpu_hist``, and ``gpu_coord_descent``. These parameters have been deprecated in
  2.0. Use the ``device`` parameter instead. (:pr:`11395`, :pr:`11554`, :pr:`11549`,
  :pr:`11543`, :pr:`11539`, :pr:`11402`)

- Remove deprecated C functions: ``XGDMatrixCreateFromCSREx``,
  ``XGDMatrixCreateFromCSCEx``. (:pr:`11514`, :pr:`11513`)

- XGBoost starts emit warning for text inputs. (:pr:`11590`)


*************
Optimizations
*************

- Optimize CPU inference with Array-Based Tree Traversal (:pr:`11519`)
- Specialize for GPU dense histogram. (:pr:`11443`)
- [sycl] Improve L1 cache locality for histogram building. (:pr:`11555`)
- [sycl] Reduce predictor memory consumption and improve L2 locality (:pr:`11603`)

*****
Fixes
*****

- Fix static linking C++ libraries on macOS (:pr:`11522`)
- Rename param.hh/cc to hist_param.hh/cc to fix xcode build (:pr:`11378`)
- [sycl] Fix build with updated compiler (:pr:`11618`)
- [sycl] Various fixes for fp32-only devices. (:pr:`11527`, :pr:`11524`)
- Fix compilation on android older than API 26 (:pr:`11366`)
- Fix loading Gamma model from 1.3. (:pr:`11377`)

**************
Python Package
**************

- Support mixing Python metrics and built-in metrics for the skl interface. (:pr:`11536`)
- CUDA 13 Support for PyPI with the new ``xgboost-cu13`` package. (:pr:`11677`, :pr:`11662`)
- Remove wheels for manylinux2014. (:pr:`11673`)
- Initial support for building variant wheels (:pr:`11531`, :pr:`11645`, :pr:`11294`)
- Minimum PySpark version is now set to 3.4 (:pr:`11364`). In addition, the PySpark
  interface now checks the validation indicator column type and has a fix for None column
  input. (:pr:`11535`, :pr:`11523`)
- [dask] Small cleanup for the predict function. (:pr:`11423`)

*********
R Package
*********

Now that most of the deprecated features have been removed in this release, we will try to
bring the latest R package back to CRAN.

- Implement Booster reset. (:pr:`11357`)
- Improvements for documentation, including having code examples in XGBoost's sphinx
  documentation side, and notes for R-universe release. (:pr:`11369`, :pr:`11410`,
  :pr:`11685`, :pr:`11316`)

************
JVM Packages
************

- Support columnar inputs for cpu pipeline (:pr:`11352`)
- Rewrite the `LabeledPoint` as a Java class (:pr:`11545`)
- Various fixes and document updates. (:pr:`11525`, :pr:`11508`, :pr:`11489`, :pr:`11682`)

*********
Documents
*********

Changes for general documentation:

- Update notes about GPU memory usage. (:pr:`11375`)
- Various fixes and updates. (:pr:`11503`, :pr:`11532`, :pr:`11328`, :pr:`11344`, :pr:`11626`)


******************
CI and Maintenance
******************

- Code cleanups. (:pr:`11367`, :pr:`11342`, :pr:`11658`, :pr:`11528`, :pr:`11585`,
  :pr:`11672`, :pr:`11642`, :pr:`11667`, :pr:`11495`, :pr:`11567`)
- Various cleanup and fixes for tests. (:pr:`11405`, :pr:`11389`, :pr:`11396`, :pr:`11456`)
- Support CMake 4.0 (:pr:`11382`)
- Various CI updates and fixes (:pr:`11318`, :pr:`11349`, :pr:`11653`, :pr:`11637`,
  :pr:`11683`, :pr:`11638`, :pr:`11644`, :pr:`11306`, :pr:`11560`, :pr:`11323`, :pr:`11617`,
  :pr:`11341`, :pr:`11693`)
