Contenido del curso

- Gradient Boosting: Principios y Algoritmo

Gradient Boosting: Principios y Algoritmo

Odisea Algorítmica Unidad: De la Regresión al Aprendizaje Profundo

Gradient Boosting representa una de las familias de modelos más potentes y versátiles dentro del aprendizaje supervisado. Se trata de una generalización del algoritmo AdaBoost que, en lugar de ponderar muestras, utiliza la optimización basada en gradientes para minimizar una función de pérdida diferenciable. En esta lección exploraremos sus fundamentos, el algoritmo paso a paso y los hiperparámetros esenciales que controlan su comportamiento, como el learning rate y el número de iteraciones.

De AdaBoost al gradiente: la idea central

Mientras que AdaBoost ajusta pesos a las observaciones y combina modelos débiles mediante votación ponderada, Gradient Boosting adopta una visión más general: cada nuevo modelo se entrena para predecir los residuos (errores) del modelo actual. Específicamente, en cada iteración m se calcula el gradiente negativo de la función de pérdida con respecto a las predicciones actuales, y un aprendiz débil (generalmente un árbol de decisión pequeño) se ajusta a ese gradiente. Esto permite extender el boosting a cualquier función de pérdida diferenciable, incluyendo regresión (error cuadrático), clasificación (devianza) o pérdidas personalizadas.

💡 Intuición clave: Si piensas en el modelo como un predictor que comete errores, el gradiente nos dice la dirección y magnitud del error para cada punto. El nuevo modelo aprende a corregir esos errores, acercándose iterativamente al objetivo.

Algoritmo general de Gradient Boosting (con árboles)

A continuación se presenta la formulación clásica para regresión con pérdida cuadrática. La generalización a clasificación o pérdidas arbitrarias es inmediata reemplazando la función de pérdida y su gradiente.

  1. Inicialización: \( F_0(x) = \arg\min_\gamma \sum_{i=1}^n L(y_i, \gamma) \), donde \(L\) es la función de pérdida. Para regresión cuadrática, \( F_0(x) = \bar{y} \).
  2. Para cada iteración \(m = 1, \dots, M\):
    • Calcular residuos / gradiente negativo: \( r_{im} = -\left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right]_{F=F_{m-1}} \). En el caso de pérdida cuadrática, \( r_{im} = y_i - F_{m-1}(x_i) \).
    • Ajustar un aprendiz débil (árbol de decisión) a los residuos: entrenar un árbol de regresión \( h_m(x) \) sobre los pares \((x_i, r_{im})\).
    • Encontrar el paso óptimo: \( \gamma_m = \arg\min_\gamma \sum_{i=1}^n L\left(y_i, F_{m-1}(x_i) + \gamma h_m(x_i)\right) \). En la práctica, para árboles, se asigna un valor distinto a cada hoja.
    • Actualizar el modelo: \( F_m(x) = F_{m-1}(x) + \nu \cdot \gamma_m h_m(x) \) (donde \(\nu\) es el learning rate).
  3. Salida final: \( F_M(x) \) como modelo aditivo.

En el caso de clasificación binaria, se utiliza la pérdida logística (devianza) y el gradiente adopta una forma ligeramente distinta, pero la estructura del algoritmo se mantiene idéntica.

Árboles de decisión como aprendices débiles

Aunque en teoría cualquier modelo de baja complejidad puede usarse, en la práctica los árboles de decisión de poca profundidad (por ejemplo, entre 3 y 8 niveles) son la elección estándar. Estos árboles, a menudo llamados "stumps" cuando son muy pequeños, capturan interacciones simples entre características y son rápidos de entrenar. Cada árbol se ajusta a los residuos del paso anterior, y el conjunto final combina cientos o miles de árboles.

El uso de árboles permite manejar automáticamente variables categóricas, valores faltantes y relaciones no lineales, lo que convierte a Gradient Boosting en un método extremadamente robusto para datos tabulares. Las implementaciones modernas (XGBoost, LightGBM, CatBoost) añaden regularización, manejo de sparse data y optimizaciones de hardware.

Hiperparámetros clave: learning rate y número de iteraciones

Dos parámetros controlan el equilibrio entre velocidad de aprendizaje y sobreajuste:

Parámetro Rol Valores típicos
Learning rate (\(\nu\)) Escala la contribución de cada árbol. Un valor pequeño obliga al modelo a dar pasos más cautelosos, requiriendo más árboles pero generalizando mejor. 0.01 – 0.3
Número de iteraciones (M) Cantidad de árboles añadidos. Mayor M reduce el error de entrenamiento, pero puede causar sobreajuste si no se combina con regularización o early stopping. 100 – 2000 (o más con learning rate bajo)

La interacción entre ambos es fundamental: un learning rate pequeño (ej. 0.01) necesita muchas iteraciones para alcanzar un buen rendimiento, pero suele producir modelos más precisos y robustos. En la práctica se recomienda usar early stopping sobre un conjunto de validación para determinar el M óptimo.

Ejemplo conceptual: regresión con Gradient Boosting

Supongamos que tenemos datos unidimensionales con una relación sinusoidal ruidosa. Iniciamos con \(F_0\) igual a la media de los \(y\). En la primera iteración calculamos residuos \(y_i - \bar{y}\). Ajustamos un árbol de profundidad 2 que prediga esos residuos. El árbol divide el espacio en regiones y asigna un valor en cada hoja (por ejemplo, +2.5 en una región, -1.8 en otra). Luego actualizamos: \(F_1(x) = \bar{y} + \nu \cdot \text{árbol}_1(x)\). Con \(\nu=0.1\), la corrección es pequeña. Este proceso se repite, y cada nuevo árbol refina la predicción, enfocándose en los patrones no capturados.

Visualización: tras 50 iteraciones, el modelo captura la forma sinusoidal casi a la perfección; tras 500 iteraciones con early stopping, generaliza sin ruido excesivo.

Regularización y variantes modernas

El algoritmo base puede extenderse con técnicas de regularización para mejorar la generalización:

  • Subsampling (stochastic gradient boosting): usar una fracción aleatoria de los datos en cada iteración, lo que reduce la correlación entre árboles y el sobreajuste.
  • Profundidad máxima del árbol: limitar la complejidad de cada aprendiz débil (ej. max_depth=3).
  • Minimum samples per leaf: evitar hojas con muy pocas observaciones.
  • Penalizaciones L1/L2 sobre los pesos de las hojas (como en XGBoost).
  • Learning rate adaptativo o schedules.

Estas extensiones han dado lugar a implementaciones de altísimo rendimiento que dominan competiciones de machine learning y aplicaciones industriales.

Ejemplo de código: esqueleto del algoritmo en Python (ilustrativo)

import numpy as np
from sklearn.tree import DecisionTreeRegressor

def gradient_boosting_regressor(X, y, n_estimators=100, learning_rate=0.1, max_depth=3):
    # Inicialización
    F = np.full(y.shape, np.mean(y))
    trees = []
    for _ in range(n_estimators):
        # Calcular gradiente negativo (residuos para pérdida cuadrática)
        residuals = y - F
        # Ajustar árbol a los residuos
        tree = DecisionTreeRegressor(max_depth=max_depth)
        tree.fit(X, residuals)
        # Predicción del árbol
        h = tree.predict(X)
        # Actualización (step size optimizado se simplifica como 1)
        F += learning_rate * h
        trees.append(tree)
    return F, trees

Nota: Este código simplifica el cálculo del paso óptimo (gamma) y la regularización, pero captura la esencia del algoritmo.

Resumen y conexión con el aprendizaje profundo

Gradient Boosting es un método secuencial de ensamble que construye un predictor potente a partir de modelos simples, utilizando el gradiente de la función de pérdida como guía. Aunque conceptualmente diferente a las redes neuronales, comparte la idea de optimización basada en gradientes y representación jerárquica. Mientras que el deep learning aprende representaciones internas mediante capas, Gradient Boosting combina múltiples expertos débiles enfocados en los errores residuales. Ambos enfoques son complementarios: Gradient Boosting destaca en datos tabulares, mientras que las redes profundas brillan en datos no estructurados. Entender Gradient Boosting proporciona una base sólida para abordar problemas de regresión, clasificación y ranking en la práctica profesional.

Lección: Gradient Boosting: Principios y Algoritmo — Odisea Algorítmica.

Se introduce Gradient Boosting como generalización de AdaBoost mediante optimización basada en gradientes. Se explica cómo se ajusta un modelo débil a los residuos (errores) del modelo actual, utilizando la derivada de la función de pérdida. Se detalla el algoritmo con árboles de decisión como aprendices débiles. Se discuten parámetros como learning rate y número de iteraciones.
Calificación
0 0

No hay comentarios por ahora.