Clasificadores de aumento de gradiente en Scikit-Learn y Caret

Joshua Noble

Data Scientist

Clasificador de gradient boosting

El aumento de gradiente es un algoritmo de aprendizaje automático potente y ampliamente utilizado en ciencia de datos para tareas de clasificación. Es parte de una familia de métodos de aprendizaje por conjuntos, junto con el embolsado, que combinan las predicciones de múltiples modelos más simples para mejorar el rendimiento general. La regresión de aumento de gradiente utiliza el aumento de gradiente para generar mejor los datos de salida basados en una regresión lineal. Un clasificador de aumento de gradiente, que explorará en este tutorial, utiliza el aumento de gradiente para clasificar mejor los datos de entrada como pertenecientes a dos o más clases diferentes. 

Gradient boosting es una actualización del algoritmo adaboost que utiliza tocones de decisión en lugar de árboles. Estos tocones de decisión son similares a los árboles de un bosque aleatorio, pero solo tienen un nodo y dos hojas. El algoritmo de aumento de gradiente construye modelos secuencialmente, cada paso intenta corregir los errores de la iteración anterior. El proceso de entrenamiento a menudo comienza con la creación de un aprendiz débil como un árbol de decisión superficial para los datos de entrenamiento. Después de ese entrenamiento inicial, el impulso de gradiente calcula el error entre los valores reales y predichos (a menudo llamados residuales) y luego entrena un nuevo estimador para predecir este error. Ese nuevo árbol se agrega al conjunto para actualizar las predicciones y crear un aprendiz fuerte. El aumento de gradiente repite este proceso hasta que se detiene la mejora o hasta que se alcanza un número fijo de iteraciones. El impulso en sí mismo es similar al descenso del gradiente, pero "desciende" el gradiente mediante la introducción de nuevos modelos.

Boosting tiene varias ventajas: tiene un buen rendimiento en datos tabulares y puede manejar datos numéricos y categóricos. Funciona bien incluso con parámetros predeterminados y es resistente a los valores atípicos en el conjunto de datos. Sin embargo, puede ser lento de entrenar y, a menudo, muy sensible a los hiperparámetros establecidos para el proceso de entrenamiento. Mantener menor el número de árboles creados puede acelerar el proceso de entrenamiento cuando se trabaja con un gran conjunto de datos. Este paso generalmente se realiza a través del parámetro de profundidad máxima. El aumento de gradiente también puede ser propenso al sobreajuste si no se ajusta correctamente. Para evitar el sobreajuste, puede configurar la tasa de aprendizaje para el proceso de entrenamiento. Este proceso es aproximadamente el mismo para un clasificador o un regresor de aumento de gradiente y se utiliza en el popular xgboost, que se basa en el aumento de gradiente agregando regularización.

En este tutorial, aprenderá a usar dos lenguajes de programación diferentes y bibliotecas de aumento de gradiente para clasificar pingüinos mediante el popular conjunto de datos Palmer Penguins.

Puede descargar el cuaderno para este tutorial desde Github.

Paso 1 Cree un cuaderno R

Si bien puede elegir entre varias herramientas, este tutorial lo guiará a través de cómo configurar una cuenta de IBM para usar un Jupyter Notebook en watsonx.

Inicie sesión en watsonx.ai con su cuenta de IBM Cloud.

Cree un proyecto watsonx.ai.

Puede obtener su ID de proyecto desde dentro de su proyecto. Haga clic en la pestaña Administrar. Luego, copie el ID del proyecto de la sección Detalles de la página General. Necesita este ID para este tutorial.

Cree un Jupyter Notebook.

Asegúrese de seleccionar "Tiempo de ejecución 24.1 en R 4.3 S (4 vCPU 16 GB RAM)" cuando cree el notebook. Este paso abre un entorno de Jupyter Notebook donde puede copiar el código de este tutorial. También puede descargar este Notebook en su sistema local y cargarlo en su proyecto watsonx.ai como activo. Para ver más tutoriales de IBM Granite, consulte la comunidad de IBM Granite. Este Jupyter Notebook se puede encontrar en GitHub.

Paso 2 Configurar bibliotecas y datos

En R, la biblioteca de intercalación es una herramienta poderosa para la preparación de datos y para el ajuste de modelos. Lo utilizará para preparar los datos y entrenar el propio modelo.

install.packages('gbm')
install.packages('caret')
install.packages('palmerpenguins')

library(gbm)
library(caret)  
library(palmerpenguins)

head(penguins) # head() returns the top 6 rows of the dataframe
summary(penguins) # prints a statistical summary of the data columns

La función createDataPartition del paquete caret para dividir el conjunto de datos original en un conjunto de entrenamiento y prueba y dividir los datos en un conjunto de entrenamiento (70 %) y prueba (30 %).


dim(penguins)

# get rid of any NA

penguins <- na.omit(penguins)
parts = caret::createDataPartition(penguins$species, p = 0.7, list = F)

train = penguins[parts, ]
test = penguins[-parts, ]

Ahora está listo para entrenar y probar .

Paso 3 Capacitar y probar

El método de tren de la biblioteca de intercalación utiliza fórmulas R, donde la variable dependiente (a menudo también llamada objetivo) está en el lado izquierdo de una tilde '~'. Las variables independientes (a menudo también llamadas característica) están en el lado derecho del '~'. Por ejemplo:

height ~ age

este paso predice la altura en función de la edad.

Para entrenar, se pasa la fórmula, los datos de entrenamiento y el método que se utilizará. La biblioteca de intercalación proporciona métodos para muchos tipos diferentes de entrenamiento, por lo que establecer el método como "gbm" es donde especificará usar el refuerzo de gradiente. El siguiente parámetro configura el proceso de entrenamiento. El método "repeatedcv" realiza una validación cruzada X-fold en submuestras de los puntos de datos del conjunto de entrenamiento. Aquí, especifica 3 repeticiones de validación cruzada de 5 pliegues mediante el uso de un conjunto diferente de pliegues para cada validación cruzada.

model_gbm <- caret::train("species ~ .",
                          data = train,
                          method = "gbm", # gbm for gradient boosting machine
                          trControl = trainControl(method = "repeatedcv", 
                                                   number = 5, 
                                                   repeats = 3, 
                                                   verboseIter = FALSE),
                          verbose = 0)

Ahora puede usar el modelo predictivo para hacer predicciones sobre datos de prueba:

pred_test = caret::confusionMatrix(
  data = predict(model_gbm, test),
  reference = test$species
)

print(pred_test)

Este paso imprime:

Confusion Matrix and Statistics
           Reference
Prediction  Adelie Chinstrap Gentoo
  Adelie        42         0      0
  Chinstrap      0        20      0
  Gentoo         1         0     35

Overall Statistics
                                          
               Accuracy : 0.9898          
                 95% CI : (0.9445, 0.9997)
    No Information Rate : 0.4388          
    P-Value [Acc > NIR] : < 2.2e-16       
                  Kappa : 0.984           

 Mcnemar's Test P-Value : NA              

Statistics by Class:
                     Class: Adelie Class: Chinstrap Class: Gentoo
Sensitivity                 0.9767           1.0000        1.0000
Specificity                 1.0000           1.0000        0.9841
Pos Pred Value              1.0000           1.0000        0.9722
Neg Pred Value              0.9821           1.0000        1.0000
Prevalence                  0.4388           0.2041        0.3571
Detection Rate              0.4286           0.2041        0.3571
Detection Prevalence        0.4286           0.2041        0.3673
Balanced Accuracy           0.9884           1.0000        0.9921

Debido a la naturaleza de la validación cruzada con pliegues, la sensibilidad y especificidad para cada clase puede ser ligeramente diferente de lo que se observa aquí, aunque la precisión será la misma. La precisión es bastante buena, incluso con el pingüino barbijo, que constituye el 20 % del conjunto de datos de entrenamiento.

Paso 4 Crear un cuaderno de Python

Ahora aprenderá a crear un modelo de aumento de gradiente en Python. En el mismo proyecto que creó anteriormente, cree un Jupyter Notebook.

Asegúrese de crear un Jupyter Notebook mediante Python 3.11 en IBM Watson Studio. Asegúrese de seleccionar "Tiempo de ejecución 24.1 en Python 3.11 XXS (1 vCPU 4 GB RAM)" cuando cree el notebook. Ahora está listo para crear un clasificador de aumento de gradiente con Python.

Paso 5 Configurar bibliotecas y datos

En este paso se instalan las bibliotecas que utilizará para entrenar y probar su clasificador de aumento de gradiente. El entrenamiento en sí se realiza con scikit-learn y los datos provienen de la biblioteca palmerpenguins.

!pip install seaborn pandas scikit-learn palmerpenguins

Ahora instale las bibliotecas en el entorno del cuaderno:

import pandas as pd
import seaborn as sns
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from palmerpenguins import load_penguins

al igual que en el código R, hay algunas NA en el conjunto de datos de pingüinos que deben eliminarse. Este fragmento de código carga el conjunto de datos, elimina las filas de NA y luego divide los datos en características y objetivo.

# Load the penguins
penguins = load_penguins() #initialize the dataset
penguins = penguins.dropna()
X = penguins.drop("species", axis=1)
y = penguins["species"]

Ahora crear una división de entrenamiento y prueba del conjunto de datos, con el 70 % de los datos extraídos para entrenamiento y el 30 % reservados para pruebas.

X_train, X_test, y_train, y_test = train_test_split(
   X, y, test_size=0.3, random_state=42
)

A continuación, reunirá dos listas de nombres de columnas, una para las características categóricas de X y otra para las características numéricas, por ejemplo float64 o int64. Luego, use ColumnTransformer de scikit-learn para aplicar diferentes preprocesamientos a diferentes tipos de columnas. Se aplica un OneHotEncoder a las características categóricas para convertirlas en vectores binarios. Se aplica un StandardScaler a las características numéricas para estandarizarlas en torno a una media f 0 y una varianza de 1.


# Define categorical and numerical features
categorical_features = X.select_dtypes(
   include=["object"]
).columns.tolist()

numerical_features = X.select_dtypes(
   include=["float64", "int64"]
).columns.tolist()

preprocessor = ColumnTransformer(
   transformers=[
       ("cat", OneHotEncoder(), categorical_features),
       ("num", StandardScaler(), numerical_features),
   ]
)

Paso 6 Capacitar y probar

Ahora que ha creado los conjuntos de características y el preprocesador, puede crear una canalización para entrenar el modelo. Esa canalización utiliza el preprocesador en los datos de entrada y luego los pasa al algoritmo Gradient Boosting para construir el clasificador. Con un conjunto de datos más grande o más complejo, hay otros parámetros de entrenamiento que quizás desee configurar. Por ejemplo, max_features, que establece el número de características a considerar al buscar la mejor división o max_ depth, que limita el número de nodos en el árbol. Este fragmento de código establece el parámetro de criterio, que mide la calidad de una división para el entrenamiento. En este caso, estamos utilizando el error cuadrático medio con puntaje de mejora de Jerry Friedman (reside fuera de IBM)

pipeline = Pipeline([
       ("preprocessor", preprocessor),
       ("classifier", GradientBoostingClassifier(random_state=42, 
         criterion='friedman_mse', max_features=2)),
   ])

A continuación, realice cross-validación para evaluar qué tan bien funciona su pipeline de machine learning en los datos de entrenamiento. Llamar al método de ajuste de la canalización que creó entrena el modelo. La función de pérdida utiliza el error cuadrático medio (o MSE) de forma predeterminada.

# Perform 5-fold cross-validation
cv_scores = cross_val_score(pipeline, X_train, y_train, cv=5)

# Fit the model on the training data
pipeline.fit(X_train, y_train)

Ahora que el modelo se ha entrenado, predecir el conjunto de pruebas y comprobar el rendimiento:


# Predict on the test set
y_pred = pipeline.predict(X_test)

# Generate classification report
report = classification_report(y_test, y_pred)

Imprimir los resultados:

print(f"Mean Cross-Validation Accuracy: {cv_scores.mean():.4f}")
print("\nClassification Report:")
print(report)

Este paso imprime los siguientes resultados:

Mean Cross-Validation Accuracy: 0.9775
Classification Report:
              precision    recall  f1-score   support
      Adelie       1.00      1.00      1.00        31
   Chinstrap       1.00      1.00      1.00        18
      Gentoo       1.00      1.00      1.00        18
    accuracy                           1.00        67
   macro avg       1.00      1.00      1.00        67
weighted avg       1.00      1.00      1.00        67

Estos resultados están muy cerca de la precisión informada por los métodos R en la primera parte de este tutorial.

Soluciones relacionadas
IBM watsonx.ai

Entrene, valide, ajuste y despliegue IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de próxima generación para creadores de IA. Diseñe aplicaciones de IA en menos tiempo y con menos datos.

Descubra watsonx.ai
Soluciones de inteligencia artificial

Ponga la IA a trabajar en su negocio con la experiencia en IA líder en la industria y la cartera de soluciones de IBM a su lado.

Explore las soluciones de IA
Consultoría y servicios de IA

Reinvente los flujos de trabajo y las operaciones críticas añadiendo IA para maximizar las experiencias, la toma de decisiones en tiempo real y el valor empresarial.

Conozca los servicios de IA
Dé el siguiente paso

Obtenga acceso único a capacidades que abarcan el ciclo de vida del desarrollo de IA. Produzca potentes soluciones de IA con interfaces fáciles de usar, flujos de trabajo y acceso a API y SDK estándar de la industria.

Explore watsonx.ai Reserve una demostración en vivo