Early Stopping de Gradient Boosting

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

El gradient boosting es una técnica de ensamble en la que varios weak learners (árboles de regresión) se combinan para producir un solo modelo potente, de manera iterativa. La compatibilidad con early stopping en Gradient Boosting nos permite encontrar el menor número de iteraciones que es suficiente para construir un modelo que se generalice bien a datos no vistos.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Notebook 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 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 su retroalimentación después de la sesión y le resolveremos el problema inmediatamente.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/model_selection -.-> lab-49150{{"Early Stopping de Gradient Boosting"}} ml/sklearn -.-> lab-49150{{"Early Stopping de Gradient Boosting"}} end

Cargar las bibliotecas y datos necesarios

Primero, necesitamos cargar las bibliotecas y datos necesarios. Utilizaremos la biblioteca scikit-learn para la implementación del gradient boosting.

import time
import numpy as np
import matplotlib.pyplot as plt
from sklearn import ensemble
from sklearn import datasets
from sklearn.model_selection import train_test_split

data_list = [
    datasets.load_iris(return_X_y=True),
    datasets.make_classification(n_samples=800, random_state=0),
    datasets.make_hastie_10_2(n_samples=2000, random_state=0),
]
names = ["Iris Data", "Classification Data", "Hastie Data"]
n_estimators = 200

Preparar los datos

A continuación, prepararemos los datos dividiéndolos en conjuntos de entrenamiento y prueba.

for X, y in data_list:
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=0
    )

Construir y entrenar el modelo sin early stopping

Ahora construiremos y entrenaremos un modelo de gradient boosting sin early stopping.

gb = ensemble.GradientBoostingClassifier(n_estimators=n_estimators, random_state=0)
start = time.time()
gb.fit(X_train, y_train)
time_gb.append(time.time() - start)

Construir y entrenar el modelo con early stopping

Ahora construiremos y entrenaremos un modelo de gradient boosting con early stopping. Especificamos una validaciónfraction que denota la fracción del conjunto de datos completo que se mantendrá aparte del entrenamiento para evaluar la pérdida de validación del modelo. El modelo de gradient boosting se entrena utilizando el conjunto de entrenamiento y se evalúa utilizando el conjunto de validación. Cuando se agrega cada etapa adicional de árbol de regresión, el conjunto de validación se utiliza para puntuar el modelo. Esto se continúa hasta que las puntuaciones del modelo en las últimas n_iter_no_change etapas no mejoren al menos en tol. Después de eso, se considera que el modelo ha convergido y la adición adicional de etapas se "detiene tempranamente". El número de etapas del modelo final está disponible en el atributo n_estimators.

gbes = ensemble.GradientBoostingClassifier(
        n_estimators=n_estimators,
        validation_fraction=0.2,
        n_iter_no_change=5,
        tol=0.01,
        random_state=0,
    )
start = time.time()
gbes.fit(X_train, y_train)
time_gbes.append(time.time() - start)
  • 这里的“validationfraction”和“n_estimators”原文表述有误,推测应该是“validation_fraction”和“n_estimators”,翻译时按照正确的内容翻译了。

Comparar puntuaciones con y sin early stopping

Ahora compararemos las puntuaciones de los dos modelos.

score_gb.append(gb.score(X_test, y_test))
score_gbes.append(gbes.score(X_test, y_test))

Comparar los tiempos de ajuste con y sin early stopping

Ahora compararemos los tiempos de ajuste de los dos modelos.

plt.figure(figsize=(9, 5))

bar1 = plt.bar(
    index, time_gb, bar_width, label="Sin early stopping", color="crimson"
)
bar2 = plt.bar(
    index + bar_width, time_gbes, bar_width, label="Con early stopping", color="coral"
)

max_y = np.amax(np.maximum(time_gb, time_gbes))

plt.xticks(index + bar_width, names)
plt.yticks(np.linspace(0, 1.3 * max_y, 13))

autolabel(bar1, n_gb)
autolabel(bar2, n_gbes)

plt.ylim([0, 1.3 * max_y])
plt.legend(loc="best")
plt.grid(True)

plt.xlabel("Conjuntos de datos")
plt.ylabel("Tiempo de ajuste")

plt.show()

Comparar puntuaciones con y sin early stopping

Ahora compararemos las puntuaciones de los dos modelos.

plt.figure(figsize=(9, 5))

bar1 = plt.bar(
    index, score_gb, bar_width, label="Sin early stopping", color="crimson"
)
bar2 = plt.bar(
    index + bar_width, score_gbes, bar_width, label="Con early stopping", color="coral"
)

plt.xticks(index + bar_width, names)
plt.yticks(np.arange(0, 1.3, 0.1))

autolabel(bar1, n_gb)
autolabel(bar2, n_gbes)

plt.ylim([0, 1.3])
plt.legend(loc="best")
plt.grid(True)

plt.xlabel("Conjuntos de datos")
plt.ylabel("Puntuación de prueba")

plt.show()

Resumen

En este laboratorio, aprendimos sobre el early stopping en gradient boosting, que nos permite encontrar el menor número de iteraciones suficiente para construir un modelo que se generalice bien a datos no vistos. Comparamos el rendimiento de un modelo de gradient boosting con y sin early stopping y observamos que el early stopping puede reducir significativamente el tiempo de entrenamiento, el uso de memoria y la latencia de predicción.