CatBoost

Basic

CatBoost | Gradient boosting fuerte con variables categoricas

Creado: Última actualización: Tiempo de lectura: 3 min

CatBoost es un modelo de arboles por boosting desarrollado por Yandex, especialmente potente con variables categoricas. Con estadisticas objetivo ordenadas y arboles simetricos (oblivious), logra buena precision con poco preprocesamiento.

Converge rapido incluso con tasas de aprendizaje bajas y es robusto a valores faltantes y cambios de distribucion, por lo que se usa mucho en produccion y competencias.


1. Como funciona CatBoost #

  • Codificacion de categorias
    Usa Ordered Target Statistics al barajar los datos y actualizar promedios de forma secuencial, evitando leakage y limitaciones del one-hot o label encoding.

  • Arboles oblivious
    Cada nivel usa la misma caracteristica y umbral, creando (2^d) hojas en la profundidad (d). Es eficiente en GPU y rapido en inferencia.

  • Ordered boosting
    Estima gradientes con diferentes permutaciones para reducir overfitting y mejorar la estabilidad.

  • Funciones ricas
    Soporta pesos de clases, texto, restricciones monotoneas y metricas combinadas.


2. Entrenar un clasificador en Python #

from catboost import CatBoostClassifier, Pool
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score

# Datos de credito (categoricas y numericas)
data = fetch_openml(name="credit-g", version=1, as_frame=True)
X = data.data
y = (data.target == "good").astype(int)

categorical_features = X.select_dtypes(include="category").columns.tolist()

X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

train_pool = Pool(
    X_train,
    label=y_train,
    cat_features=categorical_features,
)
valid_pool = Pool(X_valid, label=y_valid, cat_features=categorical_features)

model = CatBoostClassifier(
    depth=6,
    iterations=1000,
    learning_rate=0.03,
    loss_function="Logloss",
    eval_metric="AUC",
    random_seed=42,
    early_stopping_rounds=50,
    verbose=100,
)
model.fit(train_pool, eval_set=valid_pool, use_best_model=True)

proba = model.predict_proba(X_valid)[:, 1]
pred = (proba >= 0.5).astype(int)
print("ROC-AUC:", roc_auc_score(y_valid, proba))
print(classification_report(y_valid, pred, digits=3))

Solo hay que pasar las columnas categoricas al Pool; el target encoding se aplica internamente.


3. Hiperparametros principales #

ParametroRol / consejos
depthProfundidad del arbol. En arboles oblivious, depth=6 da 64 hojas. Profundidades altas aumentan capacidad pero tambien overfitting.
iterationsNumero de iteraciones. Usar con early_stopping_rounds.
learning_rateTasas pequenas suelen mejorar precision, pero requieren mas iteraciones.
l2_leaf_regRegularizacion L2 en hojas; valores altos suavizan el modelo.
border_countNumero de bins para numericos (default 254). Menos bins es mas rapido pero menos preciso.
bagging_temperatureControla aleatoriedad del muestreo; cerca de 0 es determinista.
class_weightsAjusta pesos de clase para datos desbalanceados.

4. Importancia de variables y SHAP #

importance = model.get_feature_importance(type="PredictionValuesChange")
for name, score in sorted(zip(X.columns, importance), key=lambda x: -x[1])[:10]:
    print(f"{name}: {score:.3f}")

shap_values = model.get_feature_importance(valid_pool, type="ShapValues")
# shap_values[:, -1] es el baseline; matplotlib puede graficar resumentes.
  • PredictionValuesChange mide el cambio en predicciones; el signo indica direccion.
  • Los valores SHAP se obtienen con type="ShapValues" y sirven para explicar ejemplos.

5. Tecnicas propias de CatBoost #

  • Combinaciones de categorias: one_hot_max_size y combinations_ctypes crean interacciones.
  • Texto: text_features y text_processing (TF-IDF, BM25).
  • Restricciones monotoneas: monotone_constraints para modelos de precio o riesgo.
  • CV integrado: cv ejecuta validacion cruzada adaptada al ordered boosting.

6. Cuando elegir CatBoost #

  • Datos mayormente categoricos y poco preprocesamiento → CatBoost.
  • Datos numericos y muchas iteraciones rapidas → LightGBM suele ser mas veloz.
  • Datos dispersos y grandes → DMatrix de XGBoost puede ser eficiente.
  • En ensambles, añadir CatBoost mejora robustez en categorias.

7. Resumen #

  • CatBoost procesa categorias automaticamente y estabiliza el entrenamiento con ordered boosting.
  • El balance entre depth, iterations, learning_rate y l2_leaf_reg es clave.
  • SHAP y soporte de texto lo hacen muy util dentro de un ensemble.