Árboles de decisión con boosting del gradiente

Al igual que el aumento y la potenciación, el boosting de gradiente es una metodología que se aplica sobre otro algoritmo de aprendizaje automático. De manera informal, el aumento de gradiente implica dos tipos de modelos:

  • Un modelo de aprendizaje automático "débil" que suele ser un árbol de decisión.
  • Un modelo de aprendizaje automático "strong" que se compone de varios modelos débiles.

En el aumento de gradiente, en cada paso, se entrena un modelo débil nuevo para predecir el error del modelo fuerte actual (llamado pseudorespuesta). Detallaremos "error" más adelante. Por ahora, supongamos que “error” es la diferencia entre la predicción y una etiqueta de regresión. El modelo débil (es decir, el &error) se agrega al modelo seguro con un signo negativo para reducir su error.

El boosting de gradientes es iterativo. Cada iteración invoca la siguiente fórmula:

\[ F_{i+1} = F_i - f_i \]

Donde:

  • $F_i$ es el modelo sólido en el paso $i$.
  • $f_i$ es el modelo débil en el paso $i$.

Esta operación se repite hasta que se cumple un criterio de detención, como una cantidad máxima de iteraciones o si el modelo (fuerte) comienza a sobreajustar según lo medido en un conjunto de datos de validación por separado.

Veamos un aumento de gradiente en un conjunto de datos de regresión simple, en el que:

  • El objetivo es predecir $y$ a partir de $x$.
  • El modelo sólido se inicializa para que sea una constante cero: $F_0(x) = 0$.
# Simplified example of regressive gradient boosting.

y = ... # the labels
x = ... # the features

strong_model = []
strong_predictions = np.zeros_like(y) # Initially, the strong model is empty.

for i in range(num_iters):

    # Error of the strong model
    error = strong_predictions - y

    # The weak model is a decision tree (see CART chapter)
    # without pruning and a maximum depth of 3.
    weak_model = tfdf.keras.CartModel(
        task=tfdf.keras.Task.REGRESSION,
        validation_ratio=0.0,
        max_depth=3)
    weak_model.fit(x=x, y=error)

    strong_model.append(weak_model)

    weak_predictions = weak_model.predict(x)[:,0]

    strong_predictions -= weak_predictions

Apliquemos este código en el siguiente conjunto de datos:

Un diagrama de verdad fundamental para un atributo, x, y su etiqueta, y La trama es una serie de ondas sinusoidales amortiguadas.

Figura 25: Un conjunto de datos regresivo sintético con un atributo numérico.

 

A continuación, se muestran tres trazados después de la primera iteración del algoritmo de aumento de gradiente:

Tres trazados. El primer trazado muestra la predicción del modelo fuerte, que es una línea recta de la pendiente 0 y la intersección y 0. La segunda representación muestra el error del modelo fuerte, que es una serie de ondas sinusoidales. El tercer gráfico muestra la predicción del modelo débil, que es un conjunto de ondas cuadradas.

Figura 26: Tres trazados después de la primera iteración.

 

Ten en cuenta lo siguiente sobre las representaciones de la figura 26:

  • La primera representación muestra las predicciones del modelo potente, que actualmente es siempre 0.
  • La segunda representación muestra el error, que es la etiqueta del modelo débil.
  • La tercera representación muestra el modelo débil.

El primer modelo débil es aprender una representación general de la etiqueta y se enfoca principalmente en la parte izquierda del espacio de atributos (la parte con la mayor variación y, por lo tanto, el error más importante para el modelo incorrecto constante).

Las siguientes son las mismas para otra iteración del algoritmo:

Tres trazados. El primer trazado muestra la predicción del modelo fuerte, que es una inversa de la representación del modelo débil de la figura anterior. La segunda representación muestra el error del modelo potente, que es un conjunto ruidoso de ondas sinusoidales. El tercer gráfico muestra la predicción del modelo débil, que es un par de ondas cuadradas.

Figura 27: Tres trazados después de la segunda iteración.

 

Ten en cuenta lo siguiente sobre las representaciones de la figura 27:

  • El modelo seguro ahora contiene la predicción del modelo débil de la iteración anterior.
  • El nuevo error del modelo seguro es un poco más pequeño.
  • La nueva predicción del modelo débil ahora se enfoca en la parte derecha del espacio de atributos.

Ejecutamos el algoritmo para realizar 8 iteraciones más:

Los trazados muestran que el modelo fuerte se acerca gradualmente a la verdad fundamental, mientras que la predicción del modelo débil se vuelve, gradualmente, más débil.

Figura 28: Tres trazados después de la tercera y la décima iteración.

 

En la Figura 28, observa que la predicción de un modelo sólido comienza a parecerse a la representación del conjunto de datos.

Estas figuras ilustran el algoritmo de boosting de gradientes mediante árboles de decisión como alumnos débiles. Esta combinación se denomina árboles potenciados por gradientes (decisión).

Los trazados anteriores sugieren la esencia del aumento de gradiente. Sin embargo, este ejemplo carece de las dos operaciones reales siguientes:

  • La reducción
  • La optimización de los valores de hoja con un paso del método de Newton

Encogimiento

El modelo débil $f_i$ se multiplica por un valor pequeño de $\nu$ (por ejemplo, $\nu = 0.1$) antes de agregarse al modelo sólido $F_i$. Este valor pequeño se denomina reducción. En otras palabras, en lugar de cada iteración con la siguiente fórmula:

\[ F_{i+1} = F_i - f_i \]

Cada iteración usa la siguiente fórmula:

\[ F_{i+1} = F_i - \nu f_i \]

La reducción de la potenciación de gradiente es análoga a la tasa de aprendizaje en las redes neuronales. Shrinkage controla la rapidez con la que el modelo sólido aprende, lo que ayuda a limitar el sobreajuste. Es decir, un valor de reducción más cercano a 0.0 reduce el sobreajuste más que un valor de reducción más cercano a 1.0.

En nuestro código anterior, la reducción se implementaría de la siguiente manera:

shrinkage = 0.1   # 0.1 is a common shrinkage value.
strong_predictions -= shrinkage * weak_predictions