Clasificadores Gradient Boosting en Python con Scikit-Learn

    Introducción

    Los clasificadores de aumento de gradiente son un grupo de algoritmos de Machine Learning que combinan muchos modelos de aprendizaje débiles para crear un modelo predictivo sólido. Los árboles de decisión se utilizan generalmente cuando se realiza un aumento de gradiente. Los modelos de aumento de gradientes se están volviendo populares debido a su efectividad para clasificar conjuntos de datos complejos y recientemente se han utilizado para ganar muchas competencias de ciencia de datos de Kaggle .

    La biblioteca de Machine Learning de Python, Scikit-Learn , admite diferentes implementaciones de clasificadores que aumentan el gradiente, incluido XGBoost .

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

    Definición de términos

    Comencemos por definir algunos términos en relación con el Machine Learning y los clasificadores de aumento de gradiente.

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

    La clasificación se refiere a la tarea de otorgar características a un algoritmo de Machine Learning y hacer que el algoritmo coloque las instancias / puntos de datos en una de las muchas clases discretas. Las clases son de naturaleza categórica, no es posible que una instancia se clasifique como parcialmente una clase y parcialmente otra. Un ejemplo clásico de una tarea de clasificación es clasificar los correos electrónicos como “spam” o “no spam”; no hay un correo electrónico “un poco spam”.

    Las regresiones se realizan cuando la salida del modelo de Machine Learning 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 altura, peso, ingresos, etc.

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

    Las características son las entradas que se le dan al algoritmo de Machine Learning, 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 el objetivo, que son las clases en las que se categorizarán las instancias. Debido a que las etiquetas contienen los valores objetivo para el clasificador de Machine Learning, 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 Machine Learning creada para Python, destinada a acelerar las tareas de Machine Learning al facilitar la implementación de algoritmos de Machine Learning. Tiene funciones fáciles de usar para ayudar a dividir datos en conjuntos de entrenamiento y prueba, así como a entrenar un modelo, hacer predicciones y evaluar el modelo.

    Cómo surgió el aumento de gradiente

    La idea detrás del “aumento de gradiente” es tomar una hipótesis débil o un algoritmo de aprendizaje débil y hacer una serie de ajustes que mejorarán la solidez de la hipótesis / alumno. Este tipo de Impulso de hipótesis se basa en la idea de Probabilidad Aproximadamente Aprendizaje Correcto (PAC).

    Este método de aprendizaje PAC investiga problemas de Machine Learning para interpretar qué tan complejos son, y se aplica un método similar a Hypothesis Boosting.

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

    Esta idea se realizó en el algoritmo Adaptive Boosting (AdaBoost). Para AdaBoost, muchos aprendices débiles se crean inicializando muchos algoritmos de árbol de decisión que solo tienen una sola división, como el “muñón” en la imagen de abajo.

    El algoritmo pondera las instancias / observaciones en el conjunto de entrenamiento 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 secuencialmente y se les asigna 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 estudiantes débiles.

    Los clasificadores de aumento de gradiente son el método AdaBoosting combinado con minimización ponderada, después de lo cual se recalculan 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 comprender el proceso para reducir la pérdida del clasificador, pero funciona de manera similar al descenso de gradiente en una red neuronal.

    Se realizaron refinamientos en 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 aprendices anteriores se congelan o cementan 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 problemas de regresión.

    Teoría detrás de Gradient Boost

    El clasificador de aumento de gradiente depende de una función de pérdida . Se puede utilizar 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 utilizan con frecuencia pérdidas logarítmicas, mientras que los algoritmos de regresión pueden utilizar errores al cuadrado. 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 al sistema cualquier función de pérdida diferenciable.

    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 estudiantes al modelo, los resultados de los árboles de regresión se pueden sumar para corregir los 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. Necesitaremos:

    • Encajar el modelo
    • Ajustar los parámetros y los hiperparámetros del modelo
    • Hacer predicciones
    • Interpreta los resultados

    Ajustar modelos con Scikit-Learn es bastante fácil, ya que normalmente solo tenemos que llamar al fit()comando 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. Queremos comprobar el rendimiento del modelo en el conjunto de entrenamiento a diferentes velocidades de aprendizaje y luego usar la mejor velocidad de aprendizaje para hacer predicciones.

    Las predicciones se pueden hacer en Scikit-Learn de manera muy simple usando la predict()función 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

    Debido al hecho de que los algoritmos de aumento de calificación pueden sobreajustarse fácilmente en un conjunto de datos de entrenamiento, se pueden utilizar diferentes restricciones o métodos de regularización para mejorar el rendimiento del algoritmo y combatir el sobreajuste. El aprendizaje penalizado, las restricciones de árboles, el muestreo aleatorio y la contracció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 decisiones. El tipo de árbol de decisión que se utiliza en el aumento de gradiente 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 árboles

    El árbol de decisión se puede restringir de numerosas formas, como limitar la profundidad del árbol, imponer un límite al número de hojas o nodes del árbol, limitar el número de observaciones por división y limitar el número 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 / Impulso 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 reduce esencialmente la fuerza de la correlación entre á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 filas de submuestreo antes de crear un árbol. En general, el submuestreo a tasas grandes que no superen el 50% de los datos parece ser beneficioso para el modelo.

    Actualizaciones ponderadas / por contracción

    Debido a que las predicciones de cada árbol se suman, las contribuciones de los árboles pueden inhibirse o ralentizarse mediante una técnica llamada contracción. Se ajusta una “tasa de aprendizaje”, y cuando se reduce la tasa de aprendizaje, se deben agregar más árboles al modelo. Esto hace que el modelo necesite más tiempo para entrenarse.

    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 los valores pequeños menores a 0.1 o valores entre 0.1 y 0.3 a menudo funcionan bien.

    XGBoost

    XGBoost es una versión refinada y personalizada de un sistema de árbol de decisiones que impulsa el 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 llevar 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 de refuerzo simple.

    Clasificador de refuerzo regular

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

    Comencemos importando todas nuestras bibliotecas:

    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 carguemos nuestros datos de entrenamiento:

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

    Es posible que debamos hacer un procesamiento previo de los datos. Establezcamos el índice como PassengerIdy luego seleccionemos nuestras características y etiquetas. Nuestros datos de etiqueta, los ydatos son la Survivedcolumna. Así que crearemos su propio marco de datos y luego lo eliminaremos de las funciones:

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

    Ahora tenemos que crear un nuevo conjunto de datos concatenados:

    full_data = train_data.append(test_data)
    

    Eliminemos las columnas que no sean necesarias o útiles para el entrenamiento, aunque puede dejarlas y ver cómo afectan las cosas:

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

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

    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:

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

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

    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. También establezcamos una semilla (para que pueda replicar los resultados) y seleccionemos el porcentaje de datos para probar en:

    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.

    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:

    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 da 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. Creemos un nuevo clasificador y especifiquemos la mejor tasa de aprendizaje que descubrimos.

    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:

    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 por importar las bibliotecas que necesitamos.

    from xgboost import XGBClassifier
    

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

    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 scorecomando.

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

    Aquí está el resultado:

    0.7761194029850746
    

    Alternativamente, puede predecir los X_valdatos y luego verificar la precisión con el y_valuso de 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.

    Conclusión

    Los modelos de aumento de gradiente son algoritmos poderosos que se pueden usar 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 a sobreajustarse, lo 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í . Es posible que también desee saber más sobre los otros clasificadores que admite Scikit-Learn, para que pueda comparar su rendimiento. Obtenga más información sobre los clasificadores de Scikit-Learn aquí .

    Si quieres jugar con el código, ¡está en GitHub !

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *