CatBoost
CatBoost is a gradient-boosting library with native categorical features, ordered target statistics and symmetric trees. Learn how it works and how it fits tabular AI.
Overview
CatBoost is a gradient-boosting library that is built to handle categorical columns well. Instead of asking you to one-hot encode or hand-craft target encodings, it converts categories into numbers internally using ordered target statistics, a method designed to avoid leaking the label into the features. It also uses ordered boosting to reduce a subtle bias called prediction shift, and it builds symmetric (oblivious) decision trees, which are fast to evaluate and act as a mild regularizer.
For tables rich in categories such as product codes, city names, device types or customer segments, CatBoost often gives strong accuracy with very little tuning. Its default settings are known to be good, which makes it a popular first choice for teams that want a reliable model quickly. In the context of tabular foundation models like TabPFN and TabICL, a CatBoost model is one of the standard baselines they are compared against. See /model/benchmarks for how those comparisons are framed.
What it is
CatBoost is an open-source implementation of gradient-boosted decision trees (GBDT). The name joins "category" and "boosting".
Core identity
- A gradient-boosting library that adds trees one after another, each correcting the current ensemble.
- A library with first-class categorical feature support.
- A user of ordered boosting and ordered target statistics to fight target leakage.
- A builder of symmetric trees, where every node on the same level uses the same split condition.
- Available for Python, R, the command line, and other languages, with a scikit-learn style API.
Features in practice
- Classification (binary and multiclass), regression, ranking, and several specialized objectives.
- Native handling of numeric, categorical, text and embedding features.
- Native handling of missing values.
- Automatic feature combinations (for example, pairs of categorical columns).
- Built-in cross-validation, early stopping, and overfitting detection.
- CPU and GPU training, with distributed options.
- Model analysis tools: feature importance, interaction strength and SHAP values.
- Export of fast applier models for production serving.
The kind of data it suits
Structured tables where at least some columns are categories, especially when those categories have many levels. It also performs well on mixed tables and small to medium datasets where careful tuning is not available.
Where it came from
Gradient boosting background
- Boosting methods developed in the 1990s showed that many weak learners could combine into a strong one.
- The 2001 paper "Greedy Function Approximation: A Gradient Boosting Machine" framed boosting as gradient descent over functions, and that framing underlies all modern GBDT libraries.
- XGBoost (the 2016 paper "XGBoost: A Scalable Tree Boosting System") and LightGBM (the 2017 paper "LightGBM: A Highly Efficient Gradient Boosting Decision Tree") pushed speed, scale and regularization.
The CatBoost contribution
The paper "CatBoost: unbiased boosting with categorical features" (2018) targeted two issues:
- Target leakage in categorical encoding. If you replace a category with the average label for that category, computed on the same rows you train on, the feature secretly contains the answer for those rows. The model looks good in training and fails in use.
- Prediction shift in boosting. Standard boosting computes gradients using a model that was trained on the very same rows. That makes the gradient estimates biased relative to what the model will see on new data.
The proposed remedy for both was an ordering principle: for each row, only use information from rows that came earlier in a random permutation. This is the idea behind ordered target statistics and ordered boosting.
Since then
- CatBoost expanded to text and embedding features, richer ranking losses, and better GPU support.
- Neural tabular models such as TabNet, SAINT and FT-Transformer were compared with CatBoost in benchmark studies, where it often placed near the top among tree models.
- Pre-trained tabular models appeared in the 2020s, and CatBoost remained a common baseline. See /model/research.
How it works
The analogy: grading a quiz without peeking
Imagine you want to estimate how well students from each school do on a test, to use as a feature. If you include the student's own score in the school average, you are letting the answer leak into the feature. A fairer approach is to compute each student's school average using only the students who took the test before them. No one's own result affects their own feature. CatBoost does the same for categories, using a random ordering of rows.
Step by step
- Shuffle the rows into one or more random permutations.
- Encode categories with ordered target statistics. For each row, the category value is replaced by a smoothed average of the labels of earlier rows that share the same category.
- Build features combinations. The algorithm greedily combines categorical columns (and binned numeric columns) into pairs or triples, and encodes those too, so that interactions are available.
- Quantize numeric features into borders (a histogram-style binning), as in other modern boosting libraries.
- Start with a base prediction.
- Compute gradients using ordered boosting. Instead of using a single model trained on all rows, use models that only saw earlier rows in the permutation to compute each row's gradient.
- Grow a symmetric tree. Pick one split condition per level and apply it to every node on that level.
- Compute leaf values and add the tree to the ensemble, scaled by the learning rate.
- Repeat until the iteration count is reached or overfitting detection stops training.
Ordered target statistics in detail
A basic target statistic for a category is the average label among rows with that category. The ordered version computes, for row i, the average over earlier rows only. A prior is added to stabilize rare categories:
encoded(i) = (sum of labels of earlier rows with same category + prior * a) / (count of earlier rows with same category + a)
- The prior is usually the overall label mean.
- The weight
acontrols how strongly rare categories are pulled toward the prior. - Early rows in a permutation have little history, so their statistics lean on the prior.
- Using several permutations reduces the noise that this causes.
Ordered boosting
In standard boosting, the gradient for row i is computed with a model trained including row i. That model has partly memorized row i, so its error on row i is optimistic. Ordered boosting maintains models that are trained only on rows before i in the permutation. The gradient for row i then comes from a model that has not seen it, which mimics what happens at prediction time. This reduces prediction shift and tends to help most on small datasets.
CatBoost offers two boosting modes. The ordered mode is more careful and slower, while the plain mode is closer to classic boosting and is used by default on larger data.
Symmetric (oblivious) trees
In an ordinary tree, each node picks its own best split. In a symmetric tree, all nodes on one level share the same split. A tree of depth 6 is therefore defined by just 6 conditions, and it has exactly 64 leaves.
| Property | Symmetric tree | Ordinary tree |
|---|---|---|
| Description | One split per level | One split per node |
| Structure | Balanced, fixed shape | Flexible, unbalanced possible |
| Prediction speed | Very fast, index lookup by bit pattern | Slower, path traversal |
| Regularization | Strong built-in | Weaker |
| Flexibility | Lower per tree | Higher per tree |
Think of a tournament bracket where every match in a round uses the same rule. It is rigid, but quick to evaluate and hard to overfit.
CatBoost also supports other growth policies, such as depth-wise and loss-guided, for cases where more flexibility helps.
Categorical feature combinations
Many real effects live in combinations: a certain device type in a certain city, a product category for a certain age group. CatBoost builds combinations of categorical columns during tree construction and encodes them with the same ordered statistics. Because this happens automatically, you rarely need to craft cross features by hand.
Text and embedding features
Newer versions can handle text columns by tokenizing them and building bag-of-words or similar numeric features internally, and can accept embedding vectors as inputs. This is convenient when a table has a short free-text field.
Missing values
Missing numeric values can be treated as the smallest value, the largest value, or as a separate category, controlled by the nan_mode setting. Missing categories are treated as their own level.
Overfitting detector
CatBoost can watch a validation metric and stop training when it fails to improve for a number of iterations (od_type, od_wait, or early_stopping_rounds). It can then keep the best model found (use_best_model).
Key concepts and terms
| Term | Plain meaning |
|---|---|
| Categorical feature | A column whose values are labels, not quantities |
| Target statistic | A category encoded by label statistics for that category |
| Ordered target statistic | A target statistic computed only from earlier rows in a permutation |
| Target leakage | A feature that carries information about the label it should predict |
| Prediction shift | Bias from computing gradients with a model trained on the same rows |
| Ordered boosting | Boosting where each row's gradient comes from a model that did not see it |
| Symmetric tree | A tree that uses one shared split per level |
iterations |
Number of trees |
depth |
Depth of each tree, commonly 4 to 10 |
learning_rate |
Shrinkage on each tree |
l2_leaf_reg |
L2 regularization on leaf values |
one_hot_max_size |
Categories with at most this many levels are one-hot encoded |
cat_features |
List of columns to treat as categorical |
border_count |
Number of bins for numeric features |
boosting_type |
Ordered or plain |
grow_policy |
Symmetric, depth-wise or loss-guided trees |
Pool |
CatBoost's data container with labels and feature types |
bootstrap_type |
Row sampling method, such as Bayesian or Bernoulli |
A worked example
A numeric walk-through of an ordered statistic
Take six rows with a category "city" and a binary label. The prior is 0.5 (the overall mean) and the smoothing weight a is 1.
| Row | City | Label | Earlier rows with same city | Encoded value |
|---|---|---|---|---|
| 1 | A | 1 | none | (0 + 0.5 * 1) / (0 + 1) = 0.50 |
| 2 | B | 0 | none | 0.50 |
| 3 | A | 0 | row 1 (label 1) | (1 + 0.5) / (1 + 1) = 0.75 |
| 4 | A | 1 | rows 1, 3 (labels 1, 0) | (1 + 0.5) / (2 + 1) = 0.50 |
| 5 | B | 0 | row 2 (label 0) | (0 + 0.5) / (1 + 1) = 0.25 |
| 6 | A | 1 | rows 1, 3, 4 (labels 1, 0, 1) | (2 + 0.5) / (3 + 1) = 0.625 |
Notice that no row's own label appears in its own encoding. That is the key property. A naive encoding of city A would include every A label, including the row's own, and so would leak.
A realistic Python example
import pandas as pd
from catboost import CatBoostClassifier, Pool
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
df = pd.read_csv("orders.csv")
y = df.pop("returned")
cat_cols = list(df.select_dtypes(["object", "category"]).columns)
df[cat_cols] = df[cat_cols].fillna("missing")
X_train, X_valid, y_train, y_valid = train_test_split(
df, y, test_size=0.2, stratify=y, random_state=7
)
train_pool = Pool(X_train, y_train, cat_features=cat_cols)
valid_pool = Pool(X_valid, y_valid, cat_features=cat_cols)
model = CatBoostClassifier(
iterations=3000,
learning_rate=0.05,
depth=6,
l2_leaf_reg=3,
eval_metric="AUC",
random_seed=7,
early_stopping_rounds=150,
verbose=200,
)
model.fit(train_pool, eval_set=valid_pool, use_best_model=True)
pred = model.predict_proba(X_valid)[:, 1]
print("AUC:", roc_auc_score(y_valid, pred))
print("Trees used:", model.get_best_iteration() + 1)
Why this needs so little code
- No one-hot encoding step.
- No target encoding step and no worries about leakage inside it.
- No imputation step for missing numeric values.
- Early stopping picks the number of trees.
Inspecting what the model learned
imp = model.get_feature_importance(prettified=True)
print(imp.head(10))
# Pairs of features that interact strongly
inter = model.get_feature_importance(type="Interaction", prettified=True)
print(inter.head(5))
# Per-row explanations
shap_vals = model.get_feature_importance(valid_pool, type="ShapValues")
The last column of the SHAP matrix is the expected value, and the rest are per-feature contributions for each row.
Cross-validation inside the library
from catboost import cv
params = {"loss_function": "Logloss", "depth": 6, "learning_rate": 0.05,
"iterations": 2000, "eval_metric": "AUC"}
results = cv(train_pool, params, fold_count=5, stratified=True,
early_stopping_rounds=100, verbose=False)
print(results.tail(1))
Strengths and limitations
Strengths
- Excellent categorical handling. Ordered target statistics and automatic combinations are built in.
- Strong defaults. Often competitive with minimal tuning, which saves time.
- Resists overfitting. Symmetric trees and ordered boosting add regularization.
- Good on small and medium data. Ordered boosting helps most when data is limited.
- Fast prediction. Symmetric trees are quick to evaluate in production.
- Handles missing values natively.
- Text and embedding support inside the same model.
- Rich analysis tools. Interaction strength, SHAP and feature statistics.
- GPU training is mature.
Limitations
- Slower training in some settings. Ordered mode and category combinations add cost, especially with many high-cardinality columns.
- Memory use can be high with many category combinations.
- Less flexible trees. Symmetric trees may need more depth or more iterations to capture some patterns.
- Smaller ecosystem than the most widespread boosting library, though it integrates well with common tools.
- Per-table training. Like all boosting libraries, it learns each table from scratch.
- No extrapolation. Predictions are piecewise constant.
- Probabilities may need calibration.
- Unusual parameters. Some options, such as
bootstrap_typeandgrow_policy, interact in ways that need care.
How it compares with alternatives
| Method | Handles categories | Tree shape | Typical strength | Typical weakness |
|---|---|---|---|---|
| CatBoost | Native, ordered statistics | Symmetric by default | Categorical data, strong defaults | Slower on some large workloads |
| XGBoost | Encoding or native category option | Depth-wise or leaf-wise | Mature, flexible, widely supported | Needs more tuning |
| LightGBM | Native, gradient-based grouping | Leaf-wise | Speed on large data | Overfits small data without limits |
| Random forest | Needs encoding | Deep independent trees | Robust, simple | Usually less accurate |
| Scikit-learn gradient boosting | Needs encoding | Standard trees | Simple API | Slower, fewer features |
| FT-Transformer | Learned embeddings | Transformer layers | Strong with tuning on some data | Costly, data hungry |
| TabPFN | Handled in the pre-trained model | In-context transformer | No training on small tables | Size limits |
| TabSTAR | Text-aware encoding | Transformer | Mixed text and categories | Heavier compute |
If your table is dominated by high-cardinality categories, try CatBoost early. If it is huge and mostly numeric, LightGBM is a natural first choice. In practice, run two or three and compare on your own validation split.
Role in tabular foundation models
What the comparison is really about
A tabular foundation model is pre-trained on many tables so it can handle a new table quickly, often without updating its weights. CatBoost is the opposite style: a model trained from scratch on one table. The two meet in benchmarks, where the key questions are whether the pre-trained model reaches the accuracy of a tuned CatBoost model, at what cost, and on which kinds of tables. Read /model/benchmarks and /model/research for the framing.
Categories are a special case in raw tables
Raw tables come with mixed types, missing cells, and columns whose names may be unhelpful or missing. Categories are the hardest of these for classic models, because they have no natural order or scale.
| Raw-table property | CatBoost | Tabular foundation model |
|---|---|---|
| Row and column structure | Columns are separate features, split one at a time | Rows and columns modeled jointly with attention (see Axial attention) |
| Categorical values | Ordered target statistics and combinations | Learned embeddings per value, or text embeddings of the value |
| Mixed types | Numeric bins plus categorical encodings | Type-specific cell encoders |
| Missing values | Min, max or separate category | Masked cells, learned through masked cell modeling |
| No column names | Positions only | Works from values and statistics, names can add signal |
| Unseen categories | Falls back to the prior | Can generalize through the meaning of the value, especially in text-aware models like TabSTAR |
| Pre-training | None | Synthetic and/or real tables |
Why the ordered idea still matters for foundation models
CatBoost's central insight is that a feature must not carry information about its own label. The same principle appears in in-context learning. When a pre-trained model sees labeled rows as context and predicts a query row, the query's label must not appear in the context. Evaluation protocols for tabular foundation models also depend on strict separation between context and query rows, which echoes the permutation-based logic in ordered statistics.
In-context learning versus categorical statistics
- CatBoost summarizes a category by a smoothed label average computed from earlier rows.
- An in-context model sees the labeled rows directly and can learn, inside its attention layers, a similar smoothing for each category, plus more complex relations.
- For a category with only a handful of rows, both approaches rely on shrinkage toward a prior. In the foundation model that shrinkage is learned from pre-training on many tables.
Synthetic pre-training
Models such as TabPFN are pre-trained on synthetic tables, which include categorical columns created by discretizing latent variables. This teaches the model what categories typically do: they split rows into groups with different label behavior. A boosting library infers that from scratch on every dataset, using statistics. A pre-trained model brings a prior that is helpful when data is scarce, and that is the regime in which CatBoost's ordered boosting also shines. See /model/architecture for how such priors can be organized.
Imputation
CatBoost can serve as the per-column learner inside an iterative imputer, especially for categorical columns with gaps, since it can predict a category directly. A foundation model handles missing cells by predicting masked cells during pre-training, so imputation of both numbers and categories is a native task. See Imputation networks and Masked cell modeling. For a fair test, mask a known fraction of cells, impute with both, and compare error for numbers and accuracy for categories.
Anomaly detection
CatBoost needs labels to detect anomalies, such as fraud. It can also help in a different way: train a model to predict a column from the others, then flag rows with a large residual. Unsupervised detectors such as Isolation forest need no labels, and foundation models can score the surprise of a cell given the rest of the row. See Anomaly detection.
Semantic and sector classification
When a column holds a category with meaning, such as an industry or product class, the label text carries information that a pure statistic ignores. CatBoost treats categories as opaque labels, apart from text features if you provide them. Foundation models that embed column names and values can use meaning directly, which helps classify records or columns into sectors with little labeled data. See Semantic sector heads.
Continual learning
CatBoost supports training from an existing model (init_model), which adds trees to a prior model. That is a simple way to refresh a model, but the ordered statistics for categories are recomputed with the new data, so earlier behavior may shift. Neural foundation models handle new tasks with approaches such as EWC and experience replay.
A practical pairing
- Run a CatBoost baseline with default settings and early stopping.
- Run a tabular foundation model on the same split.
- Compare accuracy, calibration, training time and prediction time.
- Consider averaging the two, which often helps because the error patterns differ.
Practical guidance and best practices
A reliable workflow
- Mark categorical columns explicitly with
cat_features. Fill missing categories with a placeholder string. - Choose a split that mirrors production. Use time-based splits for time-dependent data.
- Train with defaults and early stopping, and note the validation score.
- Check feature importance and SHAP for leakage.
- Tune depth, learning rate and regularization.
- Fix the iteration count from early stopping and refit if you want to use all data.
- Evaluate once on a held-out test set.
- Track runs with a tool such as MLflow.
Parameters to tune
| Parameter | Typical range | Effect |
|---|---|---|
learning_rate |
0.01 to 0.2 | Lower is safer, needs more trees |
depth |
4 to 10 | Higher means more interactions, more time |
l2_leaf_reg |
1 to 30 | Higher shrinks leaf values |
random_strength |
0 to 5 | Adds noise to split scores, reduces overfitting |
bagging_temperature |
0 to 5 | Strength of Bayesian bootstrap |
border_count |
32 to 254 | Resolution of numeric bins |
one_hot_max_size |
2 to 25 | Threshold for one-hot encoding |
min_data_in_leaf |
tune | Used with depth-wise or loss-guided growth |
max_ctr_complexity |
1 to 4 | Size of categorical combinations |
Handling high-cardinality categories
- Leave them as categories and let CatBoost encode them.
- Reduce
max_ctr_complexityif training is slow or memory-heavy. - Group very rare levels into an "other" bucket if they add noise.
- Do not use IDs that are unique per row, because they carry no general pattern and invite overfitting.
Class imbalance
- Use
auto_class_weightsorscale_pos_weight. - Monitor AUC-PR or log loss.
- Choose the decision threshold on validation data.
Speed
- Use the GPU for large data.
- Reduce
border_countandmax_ctr_complexity. - Use the plain boosting type on large data, and the ordered type on small data.
- Prefer a larger learning rate during exploration.
Choosing a loss function
| Task | Loss function | Notes |
|---|---|---|
| Binary classification | Logloss |
Pair with AUC for monitoring |
| Multiclass | MultiClass |
Gives class probabilities |
| Regression | RMSE, MAE, Huber |
Pick by outlier sensitivity |
| Quantile prediction | Quantile |
For prediction intervals |
| Counts | Poisson |
For non-negative counts |
| Ranking | YetiRank, PairLogit |
For ordered result lists |
Feature engineering that still helps
- Date parts such as month, weekday and hour.
- Ratios and differences between numeric columns.
- Counts and frequencies of categories, computed on training data only.
- Aggregates over groups, computed carefully to avoid leakage.
- Text length or token counts for short text fields.
Reproducibility
- Set
random_seedand keepthread_countfixed. - On GPU, results can differ slightly between runs even with a fixed seed.
- Save the model in the native format, which keeps categorical handling intact.
Diagnosing problems
| Symptom | Likely cause | What to try |
|---|---|---|
| Train score much higher than validation | Too complex | Lower depth, raise l2_leaf_reg, increase random_strength |
| Validation score unstable | Small validation set | Use cross-validation and several seeds |
| Very slow training | Many categorical combinations | Lower max_ctr_complexity, reduce border_count, use a GPU |
| Poor result on categories | Columns not declared | Pass cat_features explicitly |
| Great validation, poor production | Leakage or drift | Audit features and use time-based splits |
Common mistakes
- Forgetting to declare categorical columns. Integer-coded categories then get treated as numbers.
- Passing missing categories as NaN in some versions. Fill them with a placeholder string so they form a clear level.
- Adding row IDs as categories. Unique values lead to memorization.
- Doing your own target encoding before CatBoost. This double-encodes and may leak labels.
- Ignoring row order assumptions. Ordered statistics use random permutations, but if the data has a meaningful time order, keep a time-based validation split.
- Setting depth too high. Symmetric trees grow exponentially in leaf count, so depth 10 means 1,024 leaves per tree.
- Using accuracy on imbalanced data. Use AUC-PR, log loss or recall at a fixed precision.
- Tuning on the test set. Keep it untouched until the end.
- Comparing against a foundation model with default settings only on one side. Tune both fairly.
- Reading importance as cause. Importance reflects model use, not causation.
- Mixing library versions. Defaults for boosting type and growth policy can change.
- Skipping a simple baseline. A basic linear model shows whether boosting adds real value.
Frequently asked questions
What is CatBoost used for?
CatBoost is used to predict outcomes from tables, especially tables with many categorical columns. Common uses include churn, fraud and risk scoring, product return prediction, click-through modeling, pricing and ranking. It supports classification, regression and ranking, and it is popular for good accuracy without heavy tuning.
Why does CatBoost handle categorical features better than other libraries?
It converts categories using ordered target statistics, where each row's encoding uses only earlier rows in a random permutation, so a row's own label never leaks into its feature. It also builds combinations of categories automatically. Together this gives accurate, leak-resistant encodings without manual work.
What is ordered boosting?
Ordered boosting is a variant of gradient boosting that reduces prediction shift. For each row, the gradient is computed with a model that has not seen that row, using the order given by a random permutation. This gives a more honest error estimate during training and tends to help most when data is limited.
What are symmetric trees and why does CatBoost use them?
In a symmetric tree every node on the same level uses the same split condition, so the tree is balanced and defined by one split per level. This acts as regularization and makes predictions very fast, because a row's leaf can be found by evaluating a few conditions and looking up an index.
Do I need to encode categorical variables before using CatBoost?
No. You list the categorical columns with the cat_features option, and CatBoost encodes them internally. You should fill missing categories with a placeholder string and avoid applying your own target encoding first, as that can duplicate or leak information.
Is CatBoost better than XGBoost or LightGBM?
Not universally. CatBoost often wins on tables dominated by categorical features and on small to medium data, and it needs less tuning. LightGBM can be faster on very large data, and XGBoost is very mature and flexible. After tuning, results are usually close, so test on your own data.
How does CatBoost handle missing values?
Missing numeric values are handled by a setting that can treat them as the lowest value, the highest value, or a separate category. Missing categorical values should be filled with a placeholder so they form their own level. No separate imputation step is required.
What depth should I use?
Depth between 4 and 8 works for most problems, with 6 as a common default. Because symmetric trees have two to the power of depth leaves, higher values grow expensive and can overfit. Raise depth only if validation performance keeps improving.
How does CatBoost relate to tabular foundation models?
CatBoost is a per-table learner with a strong method for categories, while tabular foundation models are pre-trained across many tables and predict in context. CatBoost is a standard baseline for those models. The two are complementary: boosting is dependable on larger tables, and foundation models are strong on small tables and fast to apply.
Can CatBoost be used on GPUs?
Yes. CatBoost supports GPU training, which can greatly speed up large datasets. Small datasets may not benefit because of setup overhead, and results on GPU can differ slightly between runs even with a fixed seed.
Glossary
- Categorical feature: a column holding labels with no natural order.
- Target statistic: a category summarized by label values for that category.
- Ordered target statistic: a target statistic using only rows earlier in a permutation.
- Target leakage: information about the label sneaking into a feature.
- Prediction shift: bias that arises when gradients come from a model trained on the same rows.
- Ordered boosting: boosting that avoids prediction shift using permutations.
- Symmetric tree: a tree with one shared split per level.
- Oblivious tree: another name for a symmetric tree.
- Prior: a default value used to stabilize rare categories.
- Learning rate: a factor scaling each tree's contribution.
- Regularization: a penalty that discourages complexity.
- Early stopping: stopping when validation performance stops improving.
- SHAP value: a per-feature contribution to a prediction.
- In-context learning: predicting from labeled examples placed in the model input.
- Tabular foundation model: a network pre-trained on many tables.
Summary
CatBoost is a gradient-boosting library designed around categorical data. Ordered target statistics prevent label leakage when categories are encoded, ordered boosting reduces prediction shift, and symmetric trees give regularization and fast prediction. The result is a model with strong defaults that does well on tables with many categories and on small to medium datasets.
Its trade-offs are slower training in some settings, higher memory use with many category combinations, and the usual limits of per-table boosting: no transfer between datasets and no extrapolation. Within tabular foundation models, CatBoost is a key baseline, and its central lesson, that a feature must never carry its own label, also guides how pre-trained models are evaluated. Compare it with TabPFN or TabICL on identical splits, tune both fairly, and use whichever, or a blend, serves your accuracy, latency and cost needs. Related reading: XGBoost, LightGBM, Random forest, /model/architecture and /model/benchmarks.
Related
It belongs to Classical ML in my stack, under Foundation models and applied ML. Others in the same group: