Métodos de Boosting en Aprendizaje Conjunto

El Boosting es una técnica de aprendizaje conjunto (ensemble) que entrena una secuencia de modelos débiles, donde cada modelo subsiguiente se enfoca en corregir los errores de su predecesor. A diferencia de métodos como Bagging, el entrenamiento en Boosting es secuencial, y los nuevos modelos asignan mayor importancia a las instancias que fueron clasificadas incorrectamente en las iteraciones anteriores. Este enfoque reduce eficazmente el sesgo del modelo y, mediante una combinación ponderada de múltiples predictores, logra una alta capacidad de generalización.

El principio fundamental consiste en incrementar los pesos de las muestras mal clasificadas en cada ronda, instruyendo al siguiente modelo para que se concentre en estos ejemplos difíciles. Algoritmos representativos incluyen AdaBoost, Gradient Boosting, y sus implementaciones modernas como XGBoost y LightGBM.

A continuación, se presentan cinco aplicaciones prácticas que ilustran cómo las técnicas de Boosting mejoran el rendimiento en problemas de clasificación y regresión.

Caso 1: Detección de Fraude Financiero

En el sector financiero, identificar transacciones fraudulentas es crítico. Se emplea XGBoost, un algoritmo robusto para datos desbalanceados, que construye un conjunto de árboles de decisión de manera iterativa.

Pasos del algoritmo:

  1. Preparar y dividir el conujnto de datos transaccionales.
  2. Configurar y entrenar un modelo de XGBoost.
  3. Evaluar el desempeño con métricas como precisión y recall.

Implementación en Python:


import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import classification_report
from sklearn.datasets import make_classification

# Crear un dataset sintético que simule fraudes
features, labels = make_classification(n_samples=1200, n_features=18, n_classes=2, weights=[0.96, 0.04], random_state=101)

# Separar datos para entrenamiento y prueba
X_entrena, X_prueba, y_entrena, y_prueba = train_test_split(features, labels, test_size=0.25, random_state=101)

# Instanciar el clasificador XGBoost
fraud_detector = XGBClassifier(eval_metric='logloss')

# Entrenar el modelo
fraud_detector.fit(X_entrena, y_entrena)

# Realizar predicciones en el conjunto de prueba
predicciones = fraud_detector.predict(X_prueba)

# Mostrar el reporte de clasificación
print(classification_report(y_prueba, predicciones))

La fortaleza de XGBoost radica en su capacidad para minimizar la función de pérdida de forma aditiva. Cada nuevo árbol intenta reducir el error residual (la diferencia entre la predicción y el valor real) del conjunto actual, prestando especial atención a las instancias con mayor error acumulado.

Caso 2: Predicción de Abandono de Clientes

Para reducir la tasa de abandono (churn), se utiliza AdaBoost, que consolida múltiples clasificadores débiles, típicamente árboles de decisión poco profundos.

Pasos del algoritmo:

  1. Cargar y preprocesar los datos del historial de clientes.
  2. Entrenar un modelo de AdaBoost.
  3. Analizar la precisión y el recall del modelo.

Implementación en Python:


from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
from sklearn.datasets import make_classification

# Generar datos simulados de clientes
X, y = make_classification(n_samples=900, n_features=15, n_classes=2, flip_y=0.05, random_state=55)

# Dividir el dataset
X_ent, X_val, y_ent, y_val = train_test_split(X, y, test_size=0.3, random_state=55)

# Definir un árbol de decisión simple como clasificador base
estimador_base = DecisionTreeClassifier(max_depth=1)

# Construir el clasificador AdaBoost
predictor_churn = AdaBoostClassifier(estimator=estimador_base, n_estimators=45, learning_rate=0.8)

# Entrenar el modelo
predictor_churn.fit(X_ent, y_ent)

# Predecir sobre los datos de validación
y_predicho = predictor_churn.predict(X_val)

# Evaluar el rendimiento
print(f"Accuracy: {accuracy_score(y_val, y_predicho):.3f}")
print(classification_report(y_val, y_predicho))

AdaBoost funciona ajustando iterativamente los pesos de las muestras. Los pesos de los ejemplos clasificados erróneamente se incrementan, obligando al siguiente clasificador base en la secuencia a enfocarse más en ellos.

Caso 3: Estimación del Valor de Propiedades

Predecir el precio de una vivienda es un problema de regresión donde Gradient Boosting destaca por su precisión, construyendo un ensamblaje de árboles de regresión.

Pasos del algoritmo:

  1. Obtener y preparar un dataset con características inmobiliarias.
  2. Entrenar un modelo de Gradient Boosting para regresión.
  3. Calcular el error cuadrático medio (MSE) para evaluar el modelo.

Implementación en Python:


from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import make_regression

# Crear un dataset sintético de precios de vivienda
datos_X, precios = make_regression(n_samples=1100, n_features=8, noise=15.0, random_state=77)

# Particionar los datos
X_train, X_test, y_train, y_test = train_test_split(datos_X, precios, test_size=0.2, random_state=77)

# Definir el regresor Gradient Boosting
modelo_regresion = GradientBoostingRegressor(n_estimators=150, max_depth=4, learning_rate=0.1, random_state=77)

# Ajustar el modelo a los datos de entrenamiento
modelo_regresion.fit(X_train, y_train)

# Predecir los precios en el conjunto de prueba
predicciones_precio = modelo_regresion.predict(X_test)

# Calcular métricas de error
mse = mean_squared_error(y_test, predicciones_precio)
r2 = r2_score(y_test, predicciones_precio)
print(f"Error Cuadrático Medio (MSE): {mse:.2f}")
print(f"Coeficiente R²: {r2:.3f}")

En Gradient Boosting, cada árbol nuevo se entrena para predecir los residuos (errores) del modelo acumulado anterior. El modelo final es la suma de todas las contribuciones de los árboles, optimizando una función de pérdida diferenciable.

Caso 4: Evaluación de Riesgo Crediticio

En la banca, se aplica XGBoost para clasificar a los solicitantes de préstamos según su probabilidad de impago, manejando eficientemente características complejas y datos desequilibrados.

Pasos del algoritmo:

  1. Procesar los datos de solicitud de crédito.
  2. Ajustar un modelo de XGBoost con parámetros optimizados.
  3. Analizar las métricas de clasificación resultantes.

Implementación en Python:


import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score
from sklearn.datasets import make_classification

# Simular un dataset de riesgo crediticio
caracteristicas, objetivo = make_classification(n_samples=800, n_features=12, n_classes=2, random_state=33)

# Separar entrenamiento y prueba
X_entreno, X_prueba, y_entreno, y_prueba = train_test_split(caracteristicas, objetivo, test_size=0.3, random_state=33)

# Construir el clasificador
clasificador_riesgo = xgb.XGBClassifier(objective='binary:logistic', n_estimators=80, max_depth=3, use_label_encoder=False, eval_metric='auc')

# Entrenar el modelo
clasificador_riesgo.fit(X_entreno, y_entreno)

# Predecir probabilidades y clases
probabilidades = clasificador_riesgo.predict_proba(X_prueba)[:, 1]
clases_predichas = clasificador_riesgo.predict(X_prueba)

# Evaluar
print(classification_report(y_prueba, clases_predichas))
print(f"AUC-ROC: {roc_auc_score(y_prueba, probabilidades):.3f}")

XGBoost incorpora regularización (términos L1 y L2) en su función objetivo para controlar el sobreajuste, además de paralelización y manejo eficiente de valores faltantes, lo que lo hace muy efectivo para problemas tabulares de gran escala.

Caso 5: Pronóstico de Series Temporales Financieras

Para predecir el precio de acciones, se utiliza LightGBM, conocido por su velocidad y eficiencia en datasets grandes, basado en el algoritmo Gradient Boosting Decision Tree (GBDT).

Pasos del algoritmo:

  1. Obtener y formatear los datos históricos del mercado.
  2. Entrenar un modelo de LightGBM para regresión.
  3. Medir el error de la predicción.

Implementación en Python:


import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.datasets import make_regression

# Generar datos sintéticos de series temporales
serie_X, serie_y = make_regression(n_samples=950, n_features=6, noise=0.5, random_state=88)

# División temporal simple (para ejemplo)
X_tr, X_te, y_tr, y_te = train_test_split(serie_X, serie_y, test_size=0.2, shuffle=False, random_state=88)

# Configurar y crear el dataset de LightGBM
train_data = lgb.Dataset(X_tr, label=y_tr)

# Definir parámetros del modelo
params = {
    'objective': 'regression',
    'metric': 'mae',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9
}

# Entrenar el modelo
modelo_lgbm = lgb.train(params, train_data, num_boost_round=100)

# Realizar predicciones
predicciones_serie = modelo_lgbm.predict(X_te)

# Evaluar
mae = mean_absolute_error(y_te, predicciones_serie)
print(f"Error Absoluto Medio (MAE): {mae:.3f}")

LightGBM crece los árboles por nivel (leaf-wise) en lugar de por profundidad (level-wise), seleccionando la hoja con mayor ganancia de reducción de pérdida. Esto, junto con el muestreo de características, acelera significativamente el entrenamiento sin sacrificar demasiada precisión.

Etiquetas: XGBoost AdaBoost Gradient Boosting lightgbm Aprendizaje Conjunto

Publicado el 7-8 01:49