XGBoost vs LightGBM en 2026: Gradient Boosting y Preguntas de Entrevista en Data Science
Domina XGBoost y LightGBM para entrevistas de data science. Compara algoritmos de gradient boosting, aprende optimización de hiperparámetros y prepárate con preguntas técnicas y ejemplos en Python.

XGBoost y LightGBM continúan siendo las implementaciones de gradient boosting más efectivas para datos tabulares en 2026, superando consistentemente al deep learning en conjuntos de datos estructurados. Ambas bibliotecas han madurado significativamente, con XGBoost 2.1 y LightGBM 4.5 introduciendo mejoras en aceleración GPU y mejor manejo de características categóricas.
Cuando preguntan "¿Por qué usar XGBoost en lugar de una red neuronal?", conviene enfatizar que el gradient boosting maneja datos tabulares con menos muestras de manera más efectiva, requiere menos ingeniería de características y proporciona importancia de variables integrada. Las redes neuronales destacan en datos no estructurados (imágenes, texto, audio) pero tienen dificultades con características tabulares heterogéneas.
Diferencias entre Gradient Boosting y Random Forests
Gradient boosting y Random Forests utilizan árboles de decisión, pero el enfoque de entrenamiento difiere fundamentalmente. Random Forests entrena árboles de forma independiente en paralelo y luego promedia las predicciones. Gradient boosting entrena árboles secuencialmente, con cada árbol corrigiendo los errores del conjunto anterior.
La formulación matemática clarifica esta distinción. En la iteración m, gradient boosting ajusta un nuevo árbol h_m(x) al gradiente negativo de la función de pérdida respecto a las predicciones del conjunto actual. Para pérdida de error cuadrático, este gradiente negativo equivale a los residuos.
# gradient_boosting_demo.py
import numpy as np
from sklearn.tree import DecisionTreeRegressor
def gradient_boosting_from_scratch(X, y, n_estimators=100, learning_rate=0.1, max_depth=3):
"""Gradient boosting simplificado para regresión, ilustrando el algoritmo."""
# Inicializar predicciones con la media (minimiza error cuadrático)
predictions = np.full(len(y), y.mean())
trees = []
for _ in range(n_estimators):
# Calcular gradiente negativo (residuos para pérdida MSE)
residuals = y - predictions
# Ajustar un árbol a los residuos
tree = DecisionTreeRegressor(max_depth=max_depth)
tree.fit(X, residuals)
trees.append(tree)
# Actualizar predicciones con shrinkage (learning rate)
predictions += learning_rate * tree.predict(X)
return trees, y.mean()Esta dependencia secuencial hace que el entrenamiento de gradient boosting sea más lento que Random Forests, pero generalmente más preciso en el mismo conjunto de datos.
Arquitectura de XGBoost y Parámetros Clave
XGBoost (eXtreme Gradient Boosting) introdujo varias optimizaciones que hicieron práctico el gradient boosting a gran escala. La biblioteca utiliza una función objetivo regularizada que combina la pérdida con penalizaciones L1 y L2 sobre los pesos de las hojas, reduciendo el sobreajuste sin validación cruzada extensiva.
# xgboost_classification.py
import xgboost as xgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# Generar datos de clasificación sintéticos
X, y = make_classification(n_samples=10000, n_features=20, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# XGBoost con hiperparámetros comúnmente optimizados
model = xgb.XGBClassifier(
n_estimators=500, # Número de rondas de boosting
max_depth=6, # Profundidad máxima del árbol (controla complejidad)
learning_rate=0.1, # Factor de shrinkage (eta en documentación XGBoost)
subsample=0.8, # Ratio de muestreo de filas por árbol
colsample_bytree=0.8, # Ratio de muestreo de columnas por árbol
reg_alpha=0.1, # Regularización L1 sobre pesos de hojas
reg_lambda=1.0, # Regularización L2 sobre pesos de hojas
tree_method='hist', # Algoritmo basado en histogramas (más rápido)
early_stopping_rounds=50, # Detener si no hay mejora después de 50 rondas
random_state=42
)
model.fit(
X_train, y_train,
eval_set=[(X_test, y_test)], # Conjunto de validación para early stopping
verbose=False
)
print(f"Mejor iteración: {model.best_iteration}")
print(f"Accuracy en test: {model.score(X_test, y_test):.4f}")El parámetro tree_method='hist' merece atención especial. La construcción de árboles basada en histogramas cuantifica las características continuas en bins discretos, reduciendo el uso de memoria y acelerando la búsqueda de divisiones. XGBoost 2.0+ utiliza este método por defecto.
LightGBM: Crecimiento Leaf-Wise y Manejo de Categóricas
LightGBM (Light Gradient Boosting Machine) de Microsoft introdujo dos innovaciones que frecuentemente lo hacen más rápido que XGBoost: crecimiento leaf-wise y Gradient-based One-Side Sampling (GOSS).
Los árboles de decisión tradicionales crecen nivel por nivel, dividiendo todos los nodos a una profundidad dada antes de ir más profundo. LightGBM crece hoja por hoja, siempre dividiendo la hoja con mayor ganancia potencial. Este enfoque asimétrico produce árboles más complejos con menos divisiones, frecuentemente alcanzando menor pérdida de entrenamiento más rápido.
# lightgbm_with_categorical.py
import lightgbm as lgb
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# Crear dataset con características categóricas
np.random.seed(42)
df = pd.DataFrame({
'category_a': np.random.choice(['low', 'medium', 'high'], 10000),
'category_b': np.random.choice(['type1', 'type2', 'type3', 'type4'], 10000),
'numeric_1': np.random.randn(10000),
'numeric_2': np.random.randn(10000),
'target': np.random.randint(0, 2, 10000)
})
# Convertir a dtype categórico (LightGBM lo detecta automáticamente)
df['category_a'] = df['category_a'].astype('category')
df['category_b'] = df['category_b'].astype('category')
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# LightGBM maneja características categóricas nativamente
model = lgb.LGBMClassifier(
n_estimators=500,
max_depth=-1, # Sin límite (crecimiento leaf-wise controla complejidad)
num_leaves=31, # Hojas máximas por árbol (parámetro clave LightGBM)
learning_rate=0.1,
subsample=0.8,
colsample_bytree=0.8,
min_child_samples=20, # Muestras mínimas en una hoja
reg_alpha=0.1,
reg_lambda=1.0,
random_state=42,
verbose=-1
)
model.fit(
X_train, y_train,
eval_set=[(X_test, y_test)],
callbacks=[lgb.early_stopping(50, verbose=False)]
)
print(f"Mejor iteración: {model.best_iteration_}")
print(f"Accuracy en test: {model.score(X_test, y_test):.4f}")El manejo nativo de categóricas de LightGBM supera al one-hot encoding para características de alta cardinalidad. El algoritmo encuentra divisiones óptimas entre valores categóricos sin crear matrices dispersas.
¿Listo para aprobar tus entrevistas de Data Science & ML?
Practica con nuestros simuladores interactivos, flashcards y tests técnicos.
XGBoost vs LightGBM: Comparación Práctica
La elección entre XGBoost y LightGBM depende de las características del dataset y las restricciones. A continuación se presenta una comparación directa basada en benchmarks y experiencia práctica:
| Aspecto | XGBoost 2.1 | LightGBM 4.5 |
|---|---|---|
| Velocidad de entrenamiento | Más lento en datasets grandes | 2-5x más rápido con GOSS |
| Uso de memoria | Mayor | Menor (binning de histograma) |
| Características categóricas | Requiere codificación | Soporte nativo |
| Crecimiento de árboles | Level-wise (por defecto) | Leaf-wise |
| Soporte GPU | CUDA, método histograma | CUDA, soporte nativo |
| Riesgo de sobreajuste | Menor (level-wise) | Mayor (leaf-wise, ajustar num_leaves) |
| Datasets pequeños (<10k filas) | Frecuentemente mejor | Comparable |
| Datasets grandes (>1M filas) | Más lento | Preferido |
Para tareas de ingeniería de características donde el tiempo de entrenamiento importa, la ventaja de velocidad de LightGBM se vuelve significativa durante experimentación iterativa.
Estrategia de Optimización de Hiperparámetros para Entrevistas
Los entrevistadores preguntan frecuentemente cómo optimizar modelos de gradient boosting. Un enfoque estructurado demuestra pensamiento sistemático en lugar de búsqueda aleatoria en grilla.
# hyperparameter_tuning.py
import optuna
import xgboost as xgb
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=5000, n_features=20, n_informative=10, random_state=42)
def objective(trial):
"""Función objetivo Optuna para optimización de hiperparámetros XGBoost."""
params = {
# Comenzar con learning rate y n_estimators
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3, log=True),
'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
# Complejidad del árbol (más importante para trade-off sesgo-varianza)
'max_depth': trial.suggest_int('max_depth', 3, 10),
'min_child_weight': trial.suggest_int('min_child_weight', 1, 10),
# Regularización (reducir sobreajuste)
'reg_alpha': trial.suggest_float('reg_alpha', 1e-8, 10.0, log=True),
'reg_lambda': trial.suggest_float('reg_lambda', 1e-8, 10.0, log=True),
# Muestreo (gradient boosting estocástico)
'subsample': trial.suggest_float('subsample', 0.5, 1.0),
'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1.0),
'tree_method': 'hist',
'random_state': 42
}
model = xgb.XGBClassifier(**params)
scores = cross_val_score(model, X, y, cv=5, scoring='roc_auc')
return scores.mean()
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50, show_progress_bar=True)
print(f"Mejor ROC-AUC: {study.best_value:.4f}")
print(f"Mejores parámetros: {study.best_params}")El orden de prioridad de optimización importa: learning rate y número de estimadores primero, luego complejidad del árbol (max_depth, num_leaves), después regularización, finalmente ratios de muestreo. Esto refleja cómo los parámetros afectan el trade-off sesgo-varianza.
Preguntas Comunes de Entrevista sobre Gradient Boosting
Las entrevistas de data science evalúan tanto comprensión teórica como habilidades prácticas de depuración. Estas preguntas aparecen frecuentemente en entrevistas de empresas que trabajan con datos tabulares.
P: ¿Por qué gradient boosting sobreajusta más fácilmente que Random Forests?
Gradient boosting entrena secuencialmente, con cada árbol ajustando explícitamente los errores del conjunto. Los árboles tardíos pueden memorizar ruido en los residuos. Random Forests entrena árboles independientemente sobre muestras bootstrap, y el promediado reduce varianza. La regularización (learning rate, subsampling, restricciones de árboles) mitiga esto en gradient boosting.
P: ¿Qué causa que XGBoost dé resultados diferentes en los mismos datos?
El no-determinismo proviene de tres fuentes: muestreo de filas (subsample), muestreo de columnas (colsample_bytree) y construcción paralela de histogramas. Establecer random_state fija los dos primeros. Para reproducibilidad exacta, también establecer n_jobs=1, aunque esto ralentiza el entrenamiento.
P: ¿Cómo manejar desbalance de clases en XGBoost?
Tres enfoques funcionan:
scale_pos_weight: Establecer a(conteo_negativos / conteo_positivos)para clasificación binariasample_weight: Pasar pesos de instancias afit()- Remuestreo: SMOTE o submuestreo aleatorio antes del entrenamiento
El enfoque scale_pos_weight modifica la función de pérdida y preserva la distribución original de datos, frecuentemente preferido sobre remuestreo.
P: ¿Cuándo elegir CatBoost sobre XGBoost o LightGBM?
CatBoost destaca cuando el dataset contiene muchas características categóricas de alta cardinalidad, y cuando reducir sobreajuste con mínima optimización es prioridad. Su boosting ordenado y estructura de árbol simétrica lo hacen más resistente al sobreajuste en datasets pequeños. El trade-off es entrenamiento más lento que LightGBM.
Para profundizar en fundamentos de clasificación, revisar el módulo de clasificación supervisada.
Importancia de Características e Interpretabilidad del Modelo
Explicar predicciones importa en industrias reguladas y construye confianza con stakeholders. Tanto XGBoost como LightGBM proporcionan importancia de características integrada, pero la interpretación requiere cuidado.
# feature_importance.py
import xgboost as xgb
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=5000, n_features=20, n_informative=10, random_state=42)
feature_names = [f'feature_{i}' for i in range(20)]
model = xgb.XGBClassifier(n_estimators=100, random_state=42)
model.fit(X, y)
# Tres tipos de importancia disponibles
importance_types = ['weight', 'gain', 'cover']
for imp_type in importance_types:
importance = model.get_booster().get_score(importance_type=imp_type)
print(f"\nImportancia {imp_type.upper()} (top 5):")
sorted_imp = sorted(importance.items(), key=lambda x: x[1], reverse=True)[:5]
for feat, score in sorted_imp:
print(f" {feat}: {score:.2f}")- Weight: Número de veces que una característica aparece en divisiones a través de todos los árboles
- Gain: Mejora promedio en la función objetivo cuando la característica se usa para dividir
- Cover: Número promedio de muestras afectadas por divisiones en esta característica
Gain típicamente proporciona la medida de importancia más significativa, ya que se relaciona directamente con la mejora del modelo. Sin embargo, características correlacionadas pueden tener importancia subestimada ya que el modelo puede dividir en cualquiera de ellas.
Para interpretación causal, los valores SHAP (disponibles vía la biblioteca shap) proporcionan atribuciones de características consistentes y teóricamente fundamentadas por predicción.
Consideraciones de Despliegue en Producción
Desplegar modelos de gradient boosting introduce preocupaciones de latencia y serialización diferentes del entrenamiento.
# model_serialization.py
import xgboost as xgb
import json
# Entrenar un modelo
model = xgb.XGBClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# Guardar en formato binario nativo de XGBoost (recomendado para producción)
model.save_model('model.ubj') # Formato Universal Binary JSON
# Cargar para inferencia
loaded_model = xgb.XGBClassifier()
loaded_model.load_model('model.ubj')
# Para versionado del modelo, guardar con metadatos
metadata = {
'version': '1.0.0',
'trained_at': '2026-09-17',
'features': feature_names,
'best_iteration': model.best_iteration
}
with open('model_metadata.json', 'w') as f:
json.dump(metadata, f)La latencia de inferencia depende de la profundidad y cantidad de árboles. Para aplicaciones en tiempo real con requisitos estrictos de latencia (menos de 10ms), considerar:
- Reducir
n_estimatorscon learning rate más alto - Limitar
max_deptha 4-5 - Usar el método
predict()coniteration_rangepara usar menos árboles
Puntos Clave para Entrevistas de XGBoost y LightGBM
- Gradient boosting entrena árboles secuencialmente sobre residuos, a diferencia de Random Forests que entrena en paralelo y promedia
- XGBoost agrega regularización L1/L2 a la función objetivo, reduciendo sobreajuste sin validación cruzada extensiva
- LightGBM usa crecimiento leaf-wise y muestreo GOSS, haciéndolo 2-5x más rápido en datasets grandes
- El manejo nativo de categóricas en LightGBM supera al one-hot encoding para características de alta cardinalidad
- Optimizar en orden: learning rate, complejidad de árbol, regularización, ratios de muestreo
scale_pos_weightmaneja desbalance de clases modificando la función de pérdida, preservando la distribución original- La importancia basada en gain mide mejora real del modelo, pero características correlacionadas pueden parecer menos importantes
- Para producción, usar formato
.ubjy considerar reducir cantidad de árboles para aplicaciones sensibles a latencia
¡Empieza a practicar!
Pon a prueba tu conocimiento con nuestros simuladores de entrevista y tests técnicos.
¿Sabrías detectar el bug en Data Science & ML?
Un fragmento real, un bug oculto, un intento al día. Sin cuenta para probar.

Escrito por
Anthony Fillion-MailletFundador de SharpSkill
Desarrollador fullstack desde hace más de 10 años. Dirige SharpSkill y responde por todo lo que se publica aquí.
Actualizado el 17 de septiembre de 2026
Etiquetas
Compartir
Artículos relacionados

MLOps en 2026: MLflow, Model Registry y preguntas de entrevista técnica
Preguntas de entrevista sobre MLOps que abarcan el ciclo de vida del ML, el seguimiento de experimentos con MLflow, la promoción en el model registry, los patrones de despliegue, el monitoreo de drift y el diseño de sistemas para 2026, con código Python y respuestas.

PyTorch vs TensorFlow en 2026: qué framework de deep learning elegir
Comparación detallada entre PyTorch y TensorFlow en 2026: rendimiento, despliegue, ecosistema y experiencia de desarrollo para elegir el framework adecuado.

Algoritmos de Machine Learning Explicados: Guia Completa para Entrevistas Tecnicas
Guia completa de algoritmos de machine learning para entrevistas tecnicas. Cubre modelos lineales, arboles de decision, metodos de ensamble, clustering, metricas de evaluacion y regularizacion con scikit-learn.