Clasificadores de aumento de gradiente en Python con Scikit-Learn

Los clasificadores de aumento de gradiente son un grupo de algoritmos de aprendizaje automático que combinan muchos modelos de aprendizaje débiles para crear un modelo predictivo fuerte. D...

Introducción

Clasificadores de aumento de gradiente son un grupo de algoritmos de aprendizaje automático que combinan muchos modelos de aprendizaje débiles para crear un modelo predictivo sólido. Los árboles de decisión generalmente se usan cuando se hace un aumento de gradiente. Los modelos de aumento de gradiente se están volviendo populares debido a su eficacia en la clasificación de conjuntos de datos complejos y recientemente se han utilizado para ganar muchos concursos de ciencia de datos de Kaggle.

La biblioteca de aprendizaje automático de Python, Scikit-Aprender, admite diferentes implementaciones de clasificadores de aumento de gradiente, incluido [XGBoost](https://xgboost.readthedocs.io/en /más reciente/).

En este artículo, repasaremos la teoría detrás de los modelos/clasificadores de aumento de gradiente y veremos dos formas diferentes de llevar a cabo la clasificación con clasificadores de aumento de gradiente en Scikit-Learn.

Definición de términos

Comencemos definiendo algunos términos en relación con el aprendizaje automático y los clasificadores de aumento de gradiente.

Para empezar, ¿qué es la clasificación? En el aprendizaje automático, hay dos tipos de problemas de aprendizaje supervisado: clasificación y regresión.

Clasificación se refiere a la tarea de otorgar características a un algoritmo de aprendizaje automático y hacer que el algoritmo coloque las instancias/puntos de datos en una de muchas clases discretas. Las clases son categóricas por naturaleza, no es posible que una instancia se clasifique parcialmente como una clase y parcialmente como otra. Un ejemplo clásico de una tarea de clasificación es la clasificación de correos electrónicos como "spam" o "no spam": no hay correo electrónico "un poco de spam".

Las regresiones se realizan cuando la salida del modelo de aprendizaje automático es un valor real o un valor continuo. Un ejemplo de estos valores continuos sería "peso" o "longitud". Un ejemplo de una tarea de regresión es predecir la edad de una persona en función de características como la altura, el peso, los ingresos, etc.

Los clasificadores de aumento de gradiente son tipos específicos de algoritmos que se utilizan para tareas de clasificación, como sugiere el nombre.

Características son las entradas que se dan al algoritmo de aprendizaje automático, las entradas que se utilizarán para calcular un valor de salida. En un sentido matemático, las características del conjunto de datos son las variables utilizadas para resolver la ecuación. La otra parte de la ecuación es la etiqueta o destino, que son las clases en las que se clasificarán las instancias. Debido a que las etiquetas contienen los valores objetivo para el clasificador de aprendizaje automático, al entrenar un clasificador debe dividir los datos en conjuntos de entrenamiento y prueba. El conjunto de entrenamiento tendrá objetivos/etiquetas, mientras que el conjunto de prueba no contendrá estos valores.

Scikit-Learn, o "sklearn", es una biblioteca de aprendizaje automático creada para Python, destinada a acelerar las tareas de aprendizaje automático al facilitar la implementación de algoritmos de aprendizaje automático. Tiene funciones fáciles de usar para ayudar a dividir los datos en conjuntos de entrenamiento y prueba, así como entrenar un modelo, hacer predicciones y evaluar el modelo.

Cómo llegó a ser el aumento de gradiente

La idea detrás de "intensificación de gradiente" es tomar una hipótesis débil o un algoritmo de aprendizaje débil y hacerle una serie de ajustes que mejorarán la fuerza de la hipótesis/alumno. Este tipo de Impulso de Hipótesis se basa en la idea de Probabilidad aproximadamente Correcto Aprendizaje (PAC).

Este método de aprendizaje PAC investiga problemas de aprendizaje automático para interpretar qué tan complejos son, y se aplica un método similar a Potenciamiento de hipótesis.

En el impulso de hipótesis, observa todas las observaciones en las que se entrena el algoritmo de aprendizaje automático y deja solo las observaciones que el método de aprendizaje automático clasificó con éxito, eliminando las otras observaciones. Se crea un nuevo alumno débil y se prueba en el conjunto de datos que se clasificó de manera deficiente, y luego solo se conservan los ejemplos que se clasificaron con éxito.

Esta idea se materializó en el algoritmo Impulso adaptativo (AdaBoost). Para AdaBoost, se crean muchos alumnos débiles al inicializar muchos algoritmos de árboles de decisión que solo tienen una única división, como el "muñón" en la imagen a continuación.

Las instancias/observaciones en el conjunto de entrenamiento son ponderadas por el algoritmo y se asigna más peso a las instancias que son difíciles de clasificar. Los alumnos más débiles se agregan al sistema de forma secuencial y se asignan a las instancias de capacitación más difíciles.

En AdaBoost, las predicciones se realizan por mayoría de votos, y las instancias se clasifican según la clase que recibe la mayor cantidad de votos de los alumnos débiles.

Los clasificadores de aumento de gradiente son el método AdaBoosting combinado con la minimización ponderada, después de lo cual se vuelven a calcular los clasificadores y las entradas ponderadas. El objetivo de los clasificadores Gradient Boosting es minimizar la pérdida, o la diferencia entre el valor de clase real del ejemplo de entrenamiento y el valor de clase predicho. No es necesario entender el proceso para reducir la pérdida del clasificador, pero funciona de manera similar a descenso de gradiente en una red neuronal.

Se realizaron refinamientos a este proceso y se crearon Máquinas de aumento de gradiente.

En el caso de Gradient Boosting Machines, cada vez que se agrega un nuevo alumno débil al modelo, los pesos de los alumnos anteriores se congelan o consolidan en su lugar, sin cambios a medida que se introducen las nuevas capas. Esto es distinto de los enfoques utilizados en AdaBoosting, donde los valores se ajustan cuando se agregan nuevos alumnos.

El poder de las máquinas de aumento de gradiente proviene del hecho de que se pueden usar en más problemas de clasificación binaria, se pueden usar en problemas de clasificación de clases múltiples e incluso en problemas de regresión.

Teoría detrás del aumento de gradiente

El clasificador de aumento de gradiente depende de una [función de pérdida] (https://en.wikipedia.org/wiki/Loss_function). Se puede usar una función de pérdida personalizada, y muchas funciones de pérdida estandarizadas son compatibles con clasificadores de aumento de gradiente, pero la función de pérdida tiene que ser diferenciable.

Los algoritmos de clasificación suelen utilizar pérdidas logarítmicas, mientras que los algoritmos de regresión pueden utilizar errores cuadráticos. Los sistemas de aumento de gradiente no tienen que derivar una nueva función de pérdida cada vez que se agrega el algoritmo de aumento, sino que se puede aplicar cualquier función de pérdida diferenciable al sistema.

Los sistemas de aumento de gradiente tienen otras dos partes necesarias: un alumno débil y un componente aditivo. Los sistemas de aumento de gradiente utilizan árboles de decisión como sus aprendices débiles. Los árboles de regresión se utilizan para los estudiantes débiles y estos árboles de regresión generan valores reales. Debido a que los resultados son valores reales, a medida que se agregan nuevos alumnos al modelo, los resultados de los árboles de regresión se pueden sumar para corregir errores en las predicciones.

El componente aditivo de un modelo de aumento de gradiente proviene del hecho de que los árboles se agregan al modelo con el tiempo, y cuando esto ocurre, los árboles existentes no se manipulan, sus valores permanecen fijos.

Se utiliza un procedimiento similar al descenso de gradiente para minimizar el error entre parámetros dados. Esto se hace tomando la pérdida calculada y realizando un descenso de gradiente para reducir esa pérdida. Posteriormente, se modifican los parámetros del árbol para reducir la pérdida residual.

La salida del nuevo árbol se agrega luego a la salida de los árboles anteriores utilizados en el modelo. Este proceso se repite hasta que se alcanza un número de árboles previamente especificado, o la pérdida se reduce por debajo de un cierto umbral.

Pasos para aumentar el gradiente

Para implementar un clasificador de aumento de gradiente, necesitaremos llevar a cabo una serie de pasos diferentes. Tendremos que:

  • Ajustar el modelo
  • Ajuste los parámetros e hiperparámetros del modelo
  • Hacer predicciones
  • Interpretar los resultados

Ajustar modelos con Scikit-Learn es bastante fácil, ya que normalmente solo tenemos que llamar al comando fit() después de configurar el modelo.

Sin embargo, ajustar los hiperparámetros del modelo requiere una toma de decisiones activa de nuestra parte. Hay varios argumentos/hiperparámetros que podemos ajustar para intentar obtener la mejor precisión para el modelo. Una de las formas en que podemos hacer esto es alterando la tasa de aprendizaje del modelo. Querremos verificar el rendimiento del modelo en el conjunto de entrenamiento a diferentes tasas de aprendizaje y luego usar la mejor tasa de aprendizaje para hacer predicciones.

Las predicciones se pueden hacer en Scikit-Learn de manera muy simple usando la función predict() después de ajustar el clasificador. Querrá predecir las características del conjunto de datos de prueba y luego comparar las predicciones con las etiquetas reales. El proceso de evaluación de un clasificador generalmente implica verificar la precisión del clasificador y luego ajustar los parámetros/hiperparámetros del modelo hasta que el clasificador tenga una precisión con la que el usuario esté satisfecho.

Diferentes clasificadores de aumento de gradiente mejorados {# differentimprovedgradientboostingclassifiers}

Debido al hecho de que los algoritmos de aumento de calificación pueden sobreajustarse fácilmente en un conjunto de datos de entrenamiento, diferentes restricciones o [métodos de regularización] (https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html/ ) se puede utilizar para mejorar el rendimiento del algoritmo y combatir el sobreajuste. El aprendizaje penalizado, las restricciones de árboles, el muestreo aleatorio y la reducción se pueden utilizar para combatir el sobreajuste.

Aprendizaje penalizado

Se pueden utilizar ciertas restricciones para evitar el sobreajuste, según la estructura del árbol de decisión. El tipo de árbol de decisión que se utiliza en la potenciación de gradientes es un árbol de regresión, que tiene valores numéricos como hojas o pesos. Estos valores de peso se pueden regularizar utilizando los diferentes métodos de regularización, como los pesos de regularización L1 o L2, lo que penaliza el algoritmo de refuerzo radiante.

Restricciones de árbol {#restricciones de árbol}

El árbol de decisión se puede restringir de muchas maneras, como limitar la profundidad del árbol, imponer un límite en la cantidad de hojas o nodos del árbol, limitar la cantidad de observaciones por división y limitar la cantidad de observaciones entrenadas. En general, cuantas más restricciones utilice al crear árboles, más árboles necesitará el modelo para ajustar correctamente los datos.

Muestreo aleatorio/refuerzo estocástico

Tomar submuestras aleatorias del conjunto de datos de entrenamiento, una técnica conocida como aumento de gradiente estocástico, también puede ayudar a prevenir el sobreajuste. Esta técnica esencialmente reduce la fuerza de la correlación entre los árboles.

Hay varias formas de submuestrear el conjunto de datos, como submuestrear columnas antes de cada división, submuestrear columnas antes de crear un árbol, como submuestrear filas antes de crear un árbol. En general, el submuestreo a tasas grandes que no excedan el 50% de los datos parece ser beneficioso para el modelo.

Reducción/Actualizaciones ponderadas

Debido a que las predicciones de cada árbol se suman, las contribuciones de los árboles se pueden inhibir o ralentizar mediante una técnica denominada reducción. Se ajusta una "tasa de aprendizaje", y cuando la tasa de aprendizaje se reduce, se deben agregar más árboles al modelo. Esto hace que el modelo necesite más tiempo para entrenar.

Existe una compensación entre la tasa de aprendizaje y la cantidad de árboles necesarios, por lo que tendrá que experimentar para encontrar los mejores valores para cada uno de los parámetros, pero a menudo valores pequeños menores a 0.1 o valores entre 0.1 y 0.3 trabajar bien.

XGBoost

XGBoost es una versión refinada y personalizada de un sistema de árbol de decisión de aumento de gradiente, creado teniendo en cuenta el rendimiento y la velocidad. XGBoost en realidad significa "eXtreme Gradient Boosting", y se refiere al hecho de que los algoritmos y métodos se han personalizado para superar el límite de lo que es posible para los algoritmos de aumento de gradiente.

Compararemos un clasificador de refuerzo regular y un clasificador XGBoost en la siguiente sección.

Implementación de un clasificador de aumento de gradiente

Ahora repasaremos la implementación de un clasificador de aumento de gradiente simple y un clasificador XGBoost. Comenzaremos con el clasificador boosting simple.

Clasificador potenciador regular

Para empezar, debemos elegir un conjunto de datos en el que trabajar y, para este ejemplo, usaremos el conjunto de datos Titanic. Puedes descargar los datos aquí.

Comencemos por importar todas nuestras bibliotecas:

1
2
3
4
5
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.ensemble import GradientBoostingClassifier

Ahora vamos a cargar nuestros datos de entrenamiento:

1
2
train_data = pd.read_csv("train.csv")
test_data = pd.read_csv("test.csv")

Es posible que tengamos que hacer un preprocesamiento de los datos. Establezcamos el índice como PassengerId y luego seleccionemos nuestras características y etiquetas. Nuestros datos de etiqueta, los datos y son la columna Sobrevividos. Así que haremos que sea su propio marco de datos y luego lo eliminaremos de las características:

1
2
y_train = train_data["Survived"]
train_data.drop(labels="Survived", axis=1, inplace=True)

Ahora tenemos que crear un nuevo conjunto de datos concatenados:

1
full_data = train_data.append(test_data)

Descartemos las columnas que no sean necesarias o útiles para el entrenamiento, aunque podría dejarlas y ver cómo afectan las cosas:

1
2
drop_columns = ["Name", "Age", "SibSp", "Ticket", "Cabin", "Parch", "Embarked"]
full_data.drop(labels=drop_columns, axis=1, inplace=True)

Todos los datos de texto deben convertirse en números que nuestro modelo pueda usar, así que cambiemos eso ahora. También llenaremos las celdas vacías con 0:

1
2
full_data = pd.get_dummies(full_data, columns=["Sex"])
full_data.fillna(value=0.0, inplace=True)

Dividamos los datos en conjuntos de entrenamiento y prueba:

1
2
X_train = full_data.values[0:891]
X_test = full_data.values[891:]

Ahora escalaremos nuestros datos creando una instancia del escalador y escalando:

1
2
3
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

Ahora podemos dividir los datos en conjuntos de entrenamiento y prueba. Establezcamos también una semilla (para que pueda replicar los resultados) y seleccione el porcentaje de los datos para probar en:

1
2
3
4
5
state = 12  
test_size = 0.30  
  
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train,  
    test_size=test_size, random_state=state)

Ahora podemos intentar establecer diferentes tasas de aprendizaje, de modo que podamos comparar el rendimiento del clasificador a diferentes tasas de aprendizaje.

1
2
3
4
5
6
7
8
9
lr_list = [0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1]

for learning_rate in lr_list:
    gb_clf = GradientBoostingClassifier(n_estimators=20, learning_rate=learning_rate, max_features=2, max_depth=2, random_state=0)
    gb_clf.fit(X_train, y_train)

    print("Learning rate: ", learning_rate)
    print("Accuracy score (training): {0:.3f}".format(gb_clf.score(X_train, y_train)))
    print("Accuracy score (validation): {0:.3f}".format(gb_clf.score(X_val, y_val)))

Veamos cuál fue el rendimiento para diferentes tasas de aprendizaje:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Learning rate:  0.05
Accuracy score (training): 0.801
Accuracy score (validation): 0.731

Learning rate:  0.075
Accuracy score (training): 0.814
Accuracy score (validation): 0.731

Learning rate:  0.1
Accuracy score (training): 0.812
Accuracy score (validation): 0.724

Learning rate:  0.25
Accuracy score (training): 0.835
Accuracy score (validation): 0.750

Learning rate:  0.5
Accuracy score (training): 0.864
Accuracy score (validation): 0.772

Learning rate:  0.75
Accuracy score (training): 0.875
Accuracy score (validation): 0.754

Learning rate:  1
Accuracy score (training): 0.875
Accuracy score (validation): 0.739

Estamos interesados ​​principalmente en la precisión del clasificador en el conjunto de validación, pero parece que una tasa de aprendizaje de 0,5 nos brinda el mejor rendimiento en el conjunto de validación y un buen rendimiento en el conjunto de entrenamiento.

Ahora podemos evaluar el clasificador comprobando su precisión y creando una matriz de confusión. Vamos a crear un nuevo clasificador y especificar la mejor tasa de aprendizaje que descubrimos.

1
2
3
4
5
6
7
8
9
gb_clf2 = GradientBoostingClassifier(n_estimators=20, learning_rate=0.5, max_features=2, max_depth=2, random_state=0)
gb_clf2.fit(X_train, y_train)
predictions = gb_clf2.predict(X_val)

print("Confusion Matrix:")
print(confusion_matrix(y_val, predictions))

print("Classification Report")
print(classification_report(y_val, predictions))

Aquí está la salida de nuestro clasificador sintonizado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Confusion Matrix:
[[142  19]
 [ 42  65]]
Classification Report
              precision    recall  f1-score   support

           0       0.77      0.88      0.82       161
           1       0.77      0.61      0.68       107

    accuracy                           0.77       268
   macro avg       0.77      0.74      0.75       268
weighted avg       0.77      0.77      0.77       268

Clasificador XGBoost

Ahora experimentaremos con el clasificador XGBoost.

Como antes, comencemos importando las bibliotecas que necesitamos.

1
from xgboost import XGBClassifier

Como nuestros datos ya están preparados, solo necesitamos ajustar el clasificador con los datos de entrenamiento:

1
2
xgb_clf = XGBClassifier()
xgb_clf.fit(X_train, y_train)

Ahora que el clasificador ha sido ajustado y entrenado, podemos verificar el puntaje que logra en el conjunto de validación usando el comando score.

1
2
score = xgb_clf.score(X_val, y_val)
print(score)

Aquí está la salida:

1
0.7761194029850746

Alternativamente, puede predecir los datos de X_val y luego verificar la precisión contra y_val usando accuracy_score. Debería darte el mismo tipo de resultado.

La comparación de la precisión de XGboost con la precisión de un clasificador de gradiente regular muestra que, en este caso, los resultados fueron muy similares. Sin embargo, este no siempre será el caso y, en diferentes circunstancias, uno de los clasificadores podría funcionar mejor que el otro. Intente variar los argumentos en este modelo para ver cómo difiere el resultado.

Yendo más lejos: proyecto de extremo a extremo portátil

¿Tu naturaleza inquisitiva te hace querer ir más allá? Recomendamos consultar nuestro Proyecto guiado: ["Predicción práctica del precio de la vivienda: aprendizaje automático en Python"](https://wikihtp.com/courses/hands-on-house- precio-predicción-aprendizaje-máquina-en-python/#cta){target="_blank"}.

[](https://wikihtp.com/ cursos/predicción-de-precio-de-la-casa-práctica-aprendizaje-de-máquina-en-python/#cta)

En este proyecto guiado, aprenderá a crear potentes modelos tradicionales de aprendizaje automático, así como modelos de aprendizaje profundo, utilizar Ensemble Learning y capacitar a los meta-aprendices para predecir los precios de la vivienda a partir de una bolsa de modelos Scikit-Learn y Keras.

Con Keras, la API de aprendizaje profundo creada sobre Tensorflow, experimentaremos con arquitecturas, crearemos un conjunto de modelos apilados y entrenaremos una red neuronal meta-aprendizaje (modelo de nivel 1) para averiguar el precio de un casa.

El aprendizaje profundo es sorprendente, pero antes de recurrir a él, se recomienda intentar resolver el problema con técnicas más simples, como los algoritmos de aprendizaje superficial. Nuestro rendimiento de referencia se basará en un algoritmo de Regresión de bosque aleatorio. Además, exploraremos la creación de conjuntos de modelos a través de Scikit-Learn a través de técnicas como embalaje y votación.

Este es un proyecto integral y, como todos los proyectos de aprendizaje automático, comenzaremos con Análisis exploratorio de datos, seguido de Preprocesamiento de datos y, finalmente, Creación de modelos de aprendizaje superficial y Profundo para ajustarse a los datos que hemos explorado y limpiado previamente.

Conclusión

Los modelos de aumento de gradiente son potentes algoritmos que se pueden utilizar tanto para tareas de clasificación como de regresión. Los modelos de aumento de gradiente pueden funcionar increíblemente bien en conjuntos de datos muy complejos, pero también son propensos al sobreajuste, que se puede combatir con varios de los métodos descritos anteriormente. Los clasificadores de aumento de gradiente también son fáciles de implementar en Scikit-Learn.

Ahora que hemos implementado un clasificador de refuerzo regular y un clasificador XGBoost, intente implementarlos en el mismo conjunto de datos y vea cómo se compara el rendimiento de los dos clasificadores.

Si desea obtener más información sobre la teoría detrás de Gradient Boosting, puede leer más sobre eso [aquí] (http://blog.kaggle.com/2017/01/23/a-kaggle-master-explains- potenciador de gradiente/). Es posible que también desee saber más sobre los otros clasificadores compatibles con Scikit-Learn, para que pueda comparar su rendimiento. Obtenga más información sobre los clasificadores de Scikit-Learn [aquí] (https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html).

Si desea jugar con el código, está disponible en GitHub.