Skip to content

CTBoost 0.1.61

Published 8 September 2026 on PyPI and GitHub. For earlier versions, see the release history.

This release reduces CPU prediction overhead and corrects two regression-loss edge cases. Conditional-inference feature selection still precedes cut-point optimization. Learning defaults remain unchanged.

CPU prediction

  • Fitted preprocessing no longer serializes its metadata on every prediction. Numeric input uses typed conversion, and multiclass categorical target statistics reuse category lookups across output columns.
  • Native prediction uses a compact traversal cache. Scalar multiclass trees with identical topology share traversal; root-only trees add their updates directly. Physical trees and leaf-index columns retain their original order.
  • The cache is built lazily and invalidated when model state changes. It adds memory and first-call work. Fast-math builds and GCC targets with native FMA use the original score path to preserve their rounding behavior.
  • GPU leaf-index prediction retains its CPU traversal without building the otherwise unused CPU score cache.

The finalized local Windows CPU wheel measured a geometric 1.79x warm-prediction speedup over public 0.1.60 across 14 fixed saved models, including input preprocessing for 1,000-row batches. All 14 improved with bit-for-bit identical predictions. The two ordering-specific comparisons measured 1.83x and 1.76x. The summary uses geometric means across the two passes and then across tasks.

CTBoost was faster than the separately fitted CatBoost models on 11 of 14 tasks. Model sizes and accuracy differ, and concurrent workloads affected individual timings; this is not an accuracy-matched comparison or an official TabArena result. The final protocol, per-task timings and controls retain all four public/candidate/candidate/public passes. Earlier development measurements remain in the separate historical archive.

Compatibility hardening retains object conversion for float16 inputs and mixed numeric DataFrames that contain float32 columns. Uniform float32 frames and other supported numeric NumPy arrays retain typed conversion. This tradeoff preserves the original NumPy warning, callback and exception behavior. Conversion cost therefore depends on the input dtypes as well as the model.

Correctness and compatibility

  • Huber initialization ignores zero-weight target extrema and converges across the finite target range instead of stopping after 100 bisections.
  • Quantile loss uses a zero subgradient at an exact fit, so training does not move constant targets away from an already optimal prediction.
  • Numeric preprocessing retains the old signaling-NaN behavior under NumPy error policies, including errors raised from pandas numeric conversion.
  • CPU training on GNU FMA targets uses the same score-update arithmetic as prediction. Previously, different rounding in the training shortcut could change resumed training and later split decisions. The fix traverses each newly built tree once on these targets, adding some training work.
  • Direct C++ tree prediction preserves bounds checks when a histogram does not contain every feature referenced by the tree.

These loss fixes affect training, including continued Quantile training. Saved model and preprocessing formats are unchanged; existing scalar/vector models, prefix prediction, exports and physical leaf-index outputs remain supported. Applications linking native headers or the static core must rebuild.

Warm start with a nonzero Pool.baseline is still not guaranteed to reproduce uninterrupted training exactly: floating-point summation order can change later split decisions. This existing limitation is separate from the GNU FMA fix.

Accuracy evidence

The development studies do not establish an Elo increase or a general win over default XGBoost. Existing grouped feature tests and joint multiclass tests showed gains on some tasks and regressions on others, so they remain opt-in. The experimental joint-cut change failed its quality gate and is excluded. The loss fixes above do not explain or close the measured RMSE gap.

As of 9 September 2026, a fresh Full HPO25 evaluation on public 0.1.61 is prepared but has not started. The 0.1.60 run is retired; no historical result has been relabeled. The latest downloadable author-run TabArena bundle measures 0.1.58 on the Lite suite.

Release validation

The final installed Windows/Python 3.12 CPU wheel passed 1,916 tests, with 38 skips for optional dependencies, GPU capabilities or checkout-only checks. The native API fixture passed 230 checks. All 14 public-0.1.60 saved models retain bit-for-bit raw and prepared predictions across 6,610 development rows, with unchanged serialized states.

Focused preprocessing suites passed 323 cases on both NumPy 1.26/pandas 2.1 and NumPy 2.5/pandas 3.0. All 13 CPU platform/compiler jobs passed, including Linux ARM, GNU FMA with and without contraction, and the scoped MSVC fast-math compatibility check. The pre-release dry run built and smoke-tested all 26 wheels, validated the complete matrix and strict package metadata, passed R/JVM checks, and rebuilt and smoke-tested the source distribution. Both publication jobs were skipped. CUDA-enabled wheel checks did not execute on GPU hardware. The pre-release verification archive retains original failures, corrective checks and artifact identities.

The subsequent tag publication workflow completed all 19 jobs, including both PyPI and GitHub publication. The release contains 26 wheels and one source distribution; all 27 filenames, sizes and SHA-256 digests match across the two public catalogs. The CPU workflow for the released source also passed all 13 jobs.