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 鈥嬧媝rincipalmente 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 *