Regularización de Gradient Boosting

Beginner

This tutorial is from open-source community. Access the source code

Introducción

En este laboratorio, aprenderá a implementar diferentes estrategias de regularización para el Gradient Boosting utilizando scikit-learn. La regularización es una técnica que ayuda a prevenir el sobreajuste, que es un problema común en los modelos de aprendizaje automático. Utilizaremos la función de pérdida de desviación binomial y el conjunto de datos make_hastie_10_2 para este laboratorio.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar bibliotecas

Comencemos importando las bibliotecas necesarias.

import numpy as np
import matplotlib.pyplot as plt

from sklearn import ensemble
from sklearn import datasets
from sklearn.metrics import log_loss
from sklearn.model_selection import train_test_split

Cargar y dividir los datos

Utilizaremos el conjunto de datos make_hastie_10_2 y lo dividiremos en conjuntos de entrenamiento y prueba.

X, y = datasets.make_hastie_10_2(n_samples=4000, random_state=1)

## map labels from {-1, 1} to {0, 1}
labels, y = np.unique(y, return_inverse=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)

Definir parámetros

Definiremos los parámetros para nuestro clasificador Gradient Boosting. Utilizaremos los siguientes parámetros:

  • n_estimators: número de etapas de potenciación a realizar
  • max_leaf_nodes: número máximo de nodos hoja en cada árbol
  • max_depth: profundidad máxima del árbol
  • random_state: semilla aleatoria para la consistencia
  • min_samples_split: número mínimo de muestras necesarias para dividir un nodo interno
original_params = {
    "n_estimators": 400,
    "max_leaf_nodes": 4,
    "max_depth": None,
    "random_state": 2,
    "min_samples_split": 5,
}

Implementar estrategias de regularización

Ahora implementaremos diferentes estrategias de regularización y compararemos su rendimiento.

Sin contracción

Comenzaremos sin contracción, lo que significa que la tasa de aprendizaje se establecerá en 1.

params = dict(original_params)
params.update({"learning_rate": 1.0, "subsample": 1.0})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Tasa de aprendizaje = 0.2

A continuación, estableceremos la tasa de aprendizaje en 0.2 y el submuestreo en 1.

params = dict(original_params)
params.update({"learning_rate": 0.2, "subsample": 1.0})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Submuestreo = 0.5

Ahora estableceremos el submuestreo en 0.5 y la tasa de aprendizaje en 1.

params = dict(original_params)
params.update({"learning_rate": 1.0, "subsample": 0.5})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Tasa de aprendizaje = 0.2 y Submuestreo = 0.5

A continuación, estableceremos la tasa de aprendizaje en 0.2 y el submuestreo en 0.5.

params = dict(original_params)
params.update({"learning_rate": 0.2, "subsample": 0.5})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Tasa de aprendizaje = 0.2 y Máximo de características = 2

Finalmente, estableceremos la tasa de aprendizaje en 0.2 y usaremos solo 2 características para cada árbol.

params = dict(original_params)
params.update({"learning_rate": 0.2, "max_features": 2})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)

Graficar la desviación del conjunto de prueba

Ahora graficaremos la desviación del conjunto de prueba para cada estrategia de regularización.

plt.figure()

for label, color, setting in [
    ("No shrinkage", "naranja", {"learning_rate": 1.0, "subsample": 1.0}),
    ("learning_rate=0.2", "turquesa", {"learning_rate": 0.2, "subsample": 1.0}),
    ("subsample=0.5", "azul", {"learning_rate": 1.0, "subsample": 0.5}),
    (
        "learning_rate=0.2, subsample=0.5",
        "gris",
        {"learning_rate": 0.2, "subsample": 0.5},
    ),
    (
        "learning_rate=0.2, max_features=2",
        "magenta",
        {"learning_rate": 0.2, "max_features": 2},
    ),
]:
    params = dict(original_params)
    params.update(setting)

    clf = ensemble.GradientBoostingClassifier(**params)
    clf.fit(X_train, y_train)

    ## compute test set deviance
    test_deviance = np.zeros((params["n_estimators"],), dtype=np.float64)

    for i, y_proba in enumerate(clf.staged_predict_proba(X_test)):
        test_deviance[i] = 2 * log_loss(y_test, y_proba[:, 1])

    plt.plot(
        (np.arange(test_deviance.shape[0]) + 1)[::5],
        test_deviance[::5],
        "-",
        color=color,
        label=label,
    )

plt.legend(loc="upper right")
plt.xlabel("Boosting Iterations")
plt.ylabel("Test Set Deviance")

plt.show()

Resumen

En este laboratorio, aprendimos cómo implementar diferentes estrategias de regularización para Gradient Boosting utilizando scikit-learn. Utilizamos la función de pérdida de desviación binomial y el conjunto de datos make_hastie_10_2. Implementamos diferentes estrategias de regularización como no contracción, tasa de aprendizaje = 0.2, submuestreo = 0.5 y máximo de características = 2. Finalmente, graficamos la desviación del conjunto de prueba para cada estrategia de regularización para comparar su rendimiento.