Python Data Science Program
📓 Abrir notebook en GitHub

Clase 089 — XGBoost, LightGBM y CatBoost

Parte: 1 — Machine Learning Clásico · Fuente: docs XGBoost/LightGBM/CatBoost + Géron, cap. 7. ⏱️ Duración estimada: 80 min.

🎯 Objetivo

Conocer las tres librerías de gradient boosting moderno que dominan tabular ML —XGBoost, LightGBM y CatBoost—, entender sus diferencias algorítmicas (level-wise vs leaf-wise, manejo de categóricas, regularización) y saber elegir la adecuada según el problema, usando sus APIs sklearn-compatibles con early_stopping_rounds.

📚 Resultados de aprendizaje

Al terminar la clase, vas a poder:

  1. Instalar y usar xgboost, lightgbm y catboost con la API sklearn (fit/predict/predict_proba).
  2. Explicar la diferencia entre crecimiento level-wise (XGBoost por defecto) y leaf-wise (LightGBM) y sus implicancias en velocidad y overfitting.
  3. Configurar early stopping con eval_set y early_stopping_rounds para evitar overfitting y ahorrar tiempo.
  4. Manejar features categóricas: encoding manual para XGBoost, categorical_feature en LightGBM, cat_features nativo en CatBoost con ordered boosting.
  5. Elegir la librería apropiada según tamaño de dataset, presencia de categóricas y necesidad de velocidad de entrenamiento o inferencia.

🗺️ Temas

  1. Repaso: gradient boosting como ensemble secuencial (de clase 078).
  2. XGBoost: histogram-based, level-wise, regularización L1+L2, sparse-aware.
  3. LightGBM: leaf-wise growth, GOSS (Gradient-based One-Side Sampling), EFB (Exclusive Feature Bundling).
  4. CatBoost: ordered boosting, manejo nativo de categóricas, symmetric trees.
  5. Tabla comparativa de los 3.
  6. Instalación: pip install xgboost lightgbm catboost.
  7. API sklearn unificada: XGBClassifier, LGBMClassifier, CatBoostClassifier.
  8. early_stopping_rounds con eval_set.
  9. Categorical features en cada uno.
  10. Cuándo cada uno: heurísticas prácticas.

Tabla comparativa

Aspecto XGBoost LightGBM CatBoost
Crecimiento del árbol Level-wise (default) Leaf-wise Symmetric (oblivious)
Velocidad entrenamiento Media Muy rápida Media
Velocidad inferencia Rápida Rápida Muy rápida
Categóricas nativas ❌ (requiere encoding) ⚠️ (índices, ordinal) ✅ (ordered boosting)
Manejo de NaN
Overfitting en datasets chicos Bajo Más riesgo (leaf-wise) Bajo
Hiperparámetro clave max_depth num_leaves depth
GPU

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Instalación y smoke test: instalar las 3 librerías, importarlas e imprimir versiones. Confirmar que cargan sin error.
  2. XGBoost básico: entrenar XGBClassifier sobre adult (con OneHotEncoder para categóricas), usar eval_set y early_stopping_rounds=20, reportar accuracy en test y la mejor iteración.
  3. LightGBM con leaf-wise: entrenar LGBMClassifier pasando categorical_feature con los índices de columnas categóricas (encoding ordinal previo). Comparar tiempo de entrenamiento vs XGBoost.
  4. CatBoost nativo: entrenar CatBoostClassifier pasando cat_features con los nombres de columnas — sin encoding manual. Verificar que la accuracy se mantiene o mejora respecto a 2 y 3.
  5. Comparativa final: entrenar los 3 modelos sobre el mismo dataset con los mismos splits, reportar en una tabla: accuracy test, tiempo de fit, tiempo de predict y mejor iteración. Concluir cuál elegirías.

📝 Homework verificable

Construí un script boosting_showdown.py que reciba --dataset <nombre openml> y entrene los tres modelos (XGBoost, LightGBM, CatBoost) con early_stopping_rounds=50, los mismos train/test_split(random_state=42), y emita un CSV resultados.csv con columnas: modelo, accuracy_test, tiempo_fit_seg, tiempo_predict_seg, mejor_iter.

Criterio de aprobado:

⚠️ Errores comunes

  1. Olvidar early_stopping_rounds con eval_set: si pasás eval_set pero no early_stopping_rounds, entrenás las n_estimators completas sin parar — desperdiciás tiempo y podés overfittear.
  2. Usar max_depth alto en LightGBM: como crece leaf-wise, num_leaves es el parámetro de control real; max_depth=-1 (sin límite) con num_leaves alto explota en overfit.
  3. Pasar strings a XGBoost: XGBoost no maneja categóricas como strings por default (sí desde 1.5 con enable_categorical=True, pero limitado); olvidarse y obtener ValueError: could not convert string to float.
  4. OneHotEncodear para CatBoost: anula su ventaja principal —el ordered boosting—; pasale las categóricas crudas con cat_features.
  5. Comparar con n_estimators distintos: si XGBoost para en 200 y LightGBM en 800 por early stopping, comparar tiempos absolutos sin normalizar es injusto; reportá también iteraciones.

❓ Preguntas frecuentes

  1. ¿XGBoost, LightGBM o CatBoost? - LightGBM si tenés dataset grande (>100k filas) y querés velocidad. - CatBoost si tenés muchas categóricas de alta cardinalidad. - XGBoost si necesitás máxima madurez del ecosistema, integración con Spark/Dask, o ya tenés pipeline montado.

  2. ¿Cuál gana competencias de Kaggle? Históricamente XGBoost, hoy mezclado: LightGBM y CatBoost ganan terreno. Stacking de los tres suele rendir mejor que cualquiera solo.

  3. ¿Son sklearn-compatibles? Sí — todos exponen XGBClassifier/LGBMClassifier/CatBoostClassifier con fit/predict/predict_proba/score, usables en Pipeline, GridSearchCV, cross_val_score.

  4. ¿Soportan GPU? Sí los tres. XGBoost con tree_method='gpu_hist', LightGBM con device='gpu', CatBoost con task_type='GPU'. Útil con datasets grandes.

  5. ¿Cómo elijo num_leaves en LightGBM? Regla práctica: num_leaves < 2^max_depth. Empezá con 31 (default) y subí gradualmente monitoreando val loss.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 090 — Stacking (stacked generalization)