# 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. - Published: 2026-09-17 - Updated: 2026-09-17 - Author: Anthony Fillion-Maillet - Tags: xgboost, lightgbm, gradient-boosting, machine-learning, data-science-interview - Reading time: 9 min --- 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. > **Consejo para la Entrevista** > > 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. ```python # 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](https://xgboost.readthedocs.io/en/stable/) (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. ```python # 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](https://lightgbm.readthedocs.io/en/stable/) (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. ```python # 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. ## 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](/blog/data-science/feature-engineering-machine-learning-techniques-interview-2026) 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. ```python # 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: 1. `scale_pos_weight`: Establecer a `(conteo_negativos / conteo_positivos)` para clasificación binaria 2. `sample_weight`: Pasar pesos de instancias a `fit()` 3. 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](https://catboost.ai/en/docs/) 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](/technologies/data-science/interview-questions/ml-supervised-classification). ## 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. ```python # 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](https://shap.readthedocs.io/en/latest/)) 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. ```python # 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_estimators` con learning rate más alto - Limitar `max_depth` a 4-5 - Usar el método `predict()` con `iteration_range` para 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_weight` maneja 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 `.ubj` y considerar reducir cantidad de árboles para aplicaciones sensibles a latencia --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/es/blog/data-science/xgboost-lightgbm-gradient-boosting-interview-2026