El aumento de gradiente es un conjunto de algoritmos de árboles de decisión.
Puede ser una de las técnicas más populares para la clasificación estructurada (tabular) y los problemas de modelado predictivo de regresión, dado que funciona muy bien en una amplia gama de conjuntos de datos en la práctica.
Un problema importante del aumento de gradiente es que es lento entrenar el modelo. Esto es particularmente un problema cuando se usa el modelo en grandes conjuntos de datos con decenas de miles de ejemplos (filas).
El entrenamiento de los árboles que se agregan al conjunto se puede acelerar drásticamente al discretizar (agrupar) las variables de entrada continuas en unos pocos cientos de valores únicos. Los conjuntos de aumento de gradiente que implementan esta técnica y adaptan el algoritmo de entrenamiento en torno a las variables de entrada bajo esta transformación se denominan conjuntos de aumento de gradiente basados en histogramas.
En este tutorial, descubrirá cómo desarrollar conjuntos de árboles de aumento de gradiente basados en histogramas.
Después de completar este tutorial, sabrá:
- El aumento de gradiente basado en histogramas es una técnica para entrenar árboles de decisión más rápidos que se utilizan en el conjunto de aumento de gradiente.
- Cómo utilizar la implementación experimental del aumento de gradiente basado en histogramas en la biblioteca scikit-learn.
- Cómo usar conjuntos de aumento de gradiente basados en histogramas con las bibliotecas de terceros XGBoost y LightGBM.
Empecemos.
Descripción general del tutorial
Este tutorial se divide en cuatro partes; son:
- Aumento de gradiente de histograma
- Aumento de gradiente de histograma con Scikit-Learn
- Aumento de gradiente de histograma con XGBoost
- Aumento de gradiente de histograma con LightGBM
Aumento de gradiente de histograma
El aumento de gradiente es un algoritmo conjunto de aprendizaje automático.
Impulsar se refiere a una clase de algoritmos de aprendizaje de conjuntos que agregan modelos de árbol a un conjunto de forma secuencial. Cada modelo de árbol agregado al conjunto intenta corregir los errores de predicción cometidos por los modelos de árbol ya presentes en el conjunto.
El aumento de gradiente es una generalización de algoritmos de impulso como AdaBoost a un marco estadístico que trata el proceso de entrenamiento como un modelo aditivo y permite el uso de funciones de pérdida arbitrarias, mejorando en gran medida la capacidad de la técnica. Como tal, los conjuntos de aumento de gradiente son la técnica de referencia para la mayoría de las tareas de modelado predictivo estructuradas (por ejemplo, datos tabulares).
Aunque el aumento de gradiente funciona muy bien en la práctica, los modelos pueden tardar en entrenarse. Esto se debe a que los árboles deben crearse y agregarse secuencialmente, a diferencia de otros modelos de conjunto, como el bosque aleatorio, donde los miembros del conjunto se pueden entrenar en paralelo, explotando múltiples núcleos de CPU. Como tal, se ha realizado un gran esfuerzo en técnicas que mejoran la eficiencia del algoritmo de entrenamiento de aumento de gradiente.
Dos bibliotecas notables que engloban muchas técnicas modernas de eficiencia para entrenar algoritmos de aumento de gradiente incluyen Extreme Gradient Boosting (XGBoost) y Light Gradient Boosting Machines (LightGBM).
Un aspecto del algoritmo de entrenamiento que se puede acelerar es la construcción de cada árbol de decisión, cuya velocidad está limitada por el número de ejemplos (filas) y el número de características (columnas) en el conjunto de datos de entrenamiento. Grandes conjuntos de datos, p. Ej. decenas de miles de ejemplos o más, pueden resultar en la construcción muy lenta de árboles como puntos de división en cada valor, ya que cada característica debe ser considerada durante la construcción de los árboles.
Si podemos reducir #data o #feature, podremos acelerar sustancialmente el entrenamiento de GBDT.
– LightGBM: un árbol de decisiones de aumento de gradientes altamente eficiente, 2017.
La construcción de árboles de decisión se puede acelerar significativamente reduciendo el número de valores para las características de entrada continua. Esto se puede lograr mediante la discretización o la agrupación de valores en un número fijo de depósitos. Esto puede reducir el número de valores únicos para cada característica de decenas de miles a unos pocos cientos.
Esto permite que el árbol de decisiones opere en el grupo ordinal (un número entero) en lugar de valores específicos en el conjunto de datos de entrenamiento. Esta aproximación burda de los datos de entrada a menudo tiene poco impacto en la habilidad del modelo, si no mejora la habilidad del modelo, y acelera dramáticamente la construcción del árbol de decisiones.
Además, se pueden utilizar estructuras de datos eficientes para representar el agrupamiento de los datos de entrada; por ejemplo, se pueden usar histogramas y el algoritmo de construcción de árboles se puede adaptar aún más para el uso eficiente de histogramas en la construcción de cada árbol.
Estas técnicas se desarrollaron originalmente a fines de la década de 1990 para desarrollar de manera eficiente árboles de decisión únicos en grandes conjuntos de datos, pero se pueden usar en conjuntos de árboles de decisión, como el aumento de gradiente.
Como tal, es común referirse a un algoritmo de aumento de gradiente que admite «histogramas”En las bibliotecas modernas de aprendizaje automático como aumento de gradiente basado en histograma.
En lugar de encontrar los puntos de división en los valores de características ordenados, el algoritmo basado en histogramas agrupa los valores de características continuas en contenedores discretos y utiliza estos contenedores para construir histogramas de características durante el entrenamiento. Dado que el algoritmo basado en histogramas es más eficiente tanto en el consumo de memoria como en la velocidad de entrenamiento, desarrollaremos nuestro trabajo sobre esta base.
– LightGBM: un árbol de decisiones de aumento de gradientes altamente eficiente, 2017.
Ahora que estamos familiarizados con la idea de agregar histogramas a la construcción de árboles de decisión en el aumento de gradiente, revisemos algunas implementaciones comunes que podemos usar en nuestros proyectos de modelado predictivo.
Hay tres bibliotecas principales que apoyan la técnica; son Scikit-Learn, XGBoost y LightGBM.
Echemos un vistazo más de cerca a cada uno de ellos.
Nota: No estamos compitiendo con los algoritmos; en cambio, solo estamos demostrando cómo configurar cada implementación para usar el método de histograma y mantener constantes todos los demás hiperparámetros no relacionados en sus valores predeterminados.
Aumento de gradiente de histograma con Scikit-Learn
La biblioteca de aprendizaje automático scikit-learn proporciona una implementación experimental de aumento de gradiente que admite la técnica del histograma.
Específicamente, esto se proporciona en las clases HistGradientBoostingClassifier e HistGradientBoostingRegressor.
Para usar estas clases, debe agregar una línea adicional a su proyecto que indique que está feliz de usar estas técnicas experimentales y que su comportamiento puede cambiar con versiones posteriores de la biblioteca.
... # requieren explícitamente esta función experimental desde sklearn.experimental importar enable_hist_gradient_boosting |
La documentación de scikit-learn afirma que estas implementaciones de aumento de gradiente basadas en histogramas son órdenes de magnitud más rápidas que la implementación predeterminada de aumento de gradiente proporcionada por la biblioteca.
Estos estimadores basados en histogramas pueden ser órdenes de magnitud más rápidos que GradientBoostingClassifier y GradientBoostingRegressor cuando el número de muestras es mayor que decenas de miles de muestras.
– Aumento de gradiente basado en histogramas, Guía del usuario de Scikit-Learn.
Las clases se pueden usar como cualquier otro modelo de scikit-learn.
De forma predeterminada, el conjunto utiliza 255 contenedores para cada función de entrada continua, y esto se puede configurar a través de la opción «max_bins» argumento. Establecer esto en valores más pequeños, como 50 o 100, puede resultar en mejoras de eficiencia adicionales, aunque quizás a costa de alguna habilidad de modelo.
El número de árboles se puede configurar mediante el «max_iter”Argumento y el valor predeterminado es 100.
... # definir el modelo modelo = HistGradientBoostingClassifier(max_bins=255, max_iter=100) |
El siguiente ejemplo muestra cómo evaluar un algoritmo de aumento de gradiente de histograma en un conjunto de datos de clasificación sintético con 10,000 ejemplos y 100 características.
El modelo se evalúa mediante la validación cruzada estratificada repetida de k veces y se informa la precisión media en todos los pliegues y repeticiones.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 |
# evaluar el algoritmo de aumento de gradiente de histograma sklearn para la clasificación desde numpy importar media desde numpy importar std desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar cross_val_score desde sklearn.model_selection importar Repetido estratificado desde sklearn.experimental importar enable_hist_gradient_boosting desde sklearn.conjunto importar HistGradientBoostingClassifier # definir conjunto de datos X, y = make_classification(n_samples=10000, n_features=100, n_informativo=50, n_redundante=50, estado_aleatorio=1) # definir el modelo modelo = HistGradientBoostingClassifier(max_bins=255, max_iter=100) # definir el procedimiento de evaluación CV = Repetido estratificado KFold(n_splits=10, n_repeats=3, estado_aleatorio=1) # evaluar el modelo y recopilar las puntuaciones n_scores = cross_val_score(modelo, X, y, puntuación=‘exactitud’, CV=CV, n_jobs=–1) # informe de rendimiento impresión(‘Precisión:% .3f (% .3f)’ % (media(n_scores), std(n_scores))) |
La ejecución del ejemplo evalúa el rendimiento del modelo en el conjunto de datos sintéticos e informa la precisión de la clasificación de la desviación estándar y la media.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.
En este caso, podemos ver que el algoritmo de aumento de gradiente de histograma de scikit-learn logra una precisión media de alrededor del 94,3 por ciento en el conjunto de datos sintéticos.
También podemos explorar el efecto del número de bins en el rendimiento del modelo.
El siguiente ejemplo evalúa el rendimiento del modelo con un número diferente de contenedores para cada característica de entrada continua de 50 a (aproximadamente) 250 en incrementos de 50.
El ejemplo completo se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# comparar el número de contenedores para aumentar el gradiente del histograma de sklearn desde numpy importar media desde numpy importar std desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar cross_val_score desde sklearn.model_selection importar Repetido estratificado KFold desde sklearn.experimental importar enable_hist_gradient_boosting desde sklearn.conjunto importar HistGradientBoostingClassifier desde matplotlib importar pyplot # obtener el conjunto de datos def get_dataset(): X, y = make_classification(n_samples=10000, n_features=100, n_informativo=50, n_redundante=50, estado_aleatorio=1) regreso X, y # obtener una lista de modelos para evaluar def get_models(): modelos = dictar() para yo en [[10, 50, 100, 150, 200, 255]: modelos[[str(yo)] = HistGradientBoostingClassifier(max_bins=yo, max_iter=100) regreso modelos # evaluar un modelo dado mediante validación cruzada def evaluar_modelo(modelo, X, y): # definir el procedimiento de evaluación CV = Repetido estratificado KFold(n_splits=10, n_repeats=3, estado_aleatorio=1) # evaluar el modelo y recopilar las puntuaciones puntuaciones = cross_val_score(modelo, X, y, puntuación=‘exactitud’, CV=CV, n_jobs=–1) regreso puntuaciones # definir conjunto de datos X, y = get_dataset() # obtener los modelos para evaluar modelos = get_models() # evaluar los modelos y almacenar los resultados resultados, nombres = lista(), lista() para nombre, modelo en modelos.artículos(): # evaluar el modelo y recopilar las puntuaciones puntuaciones = evaluar_modelo(modelo, X, y) # almacena los resultados resultados.adjuntar(puntuaciones) nombres.adjuntar(nombre) # informar sobre el rendimiento en el camino impresión(‘>% s% .3f (% .3f)’ % (nombre, media(puntuaciones), std(puntuaciones))) # trazar el rendimiento del modelo para comparar pyplot.diagrama de caja(resultados, etiquetas=nombres, mostrar significa=Cierto) pyplot.show() |
La ejecución del ejemplo evalúa cada configuración, informa la precisión de la clasificación de la desviación estándar y la media a lo largo del camino y finalmente crea un gráfico de la distribución de puntuaciones.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.
En este caso, podemos ver que aumentar el número de bins puede disminuir la precisión media del modelo en este conjunto de datos.
Podríamos esperar que un aumento en el número de contenedores también requiera un aumento en el número de árboles (max_iter) para garantizar que el modelo pueda explorar y aprovechar de forma eficaz los puntos de división adicionales.
Es importante destacar que ajustar un conjunto donde los árboles usan 10 o 50 contenedores por variable es dramáticamente más rápido que 255 contenedores por variable de entrada.
> 10 0,945 (0,009) > 50 0,944 (0,007) > 100 0,944 (0,008) > 150 0,944 (0,008) > 200 0,944 (0,007) > 255 0,943 (0,007) |
Se crea una figura que compara la distribución en las puntuaciones de precisión para cada configuración utilizando diagramas de caja y bigotes.
En este caso, podemos ver que aumentar el número de bins en el histograma parece reducir la extensión de la distribución, aunque puede reducir el rendimiento medio del modelo.
Aumento de gradiente de histograma con XGBoost
Extreme Gradient Boosting, o XGBoost para abreviar, es una biblioteca que proporciona una implementación altamente optimizada del aumento de gradiente.
Una de las técnicas implementadas en la biblioteca es el uso de histogramas para las variables de entrada continuas.
La biblioteca XGBoost se puede instalar usando su administrador de paquetes favorito de Python, como Pip; por ejemplo:
Podemos desarrollar modelos XGBoost para usar con la biblioteca scikit-learn a través de las clases XGBClassifier y XGBRegressor.
El algoritmo de entrenamiento se puede configurar para utilizar el método de histograma configurando el «método_árbol«Argumento a»aprox.«, Y el número de contenedores se puede configurar mediante el»max_bin» argumento.
... # definir el modelo modelo = Clasificador XGB(método_árbol=‘aprox’, max_bin=255, n_estimators=100) |
El siguiente ejemplo demuestra la evaluación de un modelo XGBoost configurado para usar el histograma o técnica aproximada para construir árboles con 255 contenedores por característica de entrada continua y 100 árboles en el modelo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 |
# evaluar el algoritmo de aumento de gradiente de histograma xgboost para la clasificación desde numpy importar media desde numpy importar std desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar cross_val_score desde sklearn.model_selection importar Repetido estratificado KFold desde xgboost importar Clasificador XGB # definir conjunto de datos X, y = make_classification(n_samples=10000, n_features=100, n_informativo=50, n_redundante=50, estado_aleatorio=1) # definir el modelo modelo = Clasificador XGB(método_árbol=‘aprox’, max_bin=255, n_estimators=100) # definir el procedimiento de evaluación CV = Repetido estratificado KFold(n_splits=10, n_repeats=3, estado_aleatorio=1) # evaluar el modelo y recopilar las puntuaciones n_scores = cross_val_score(modelo, X, y, puntuación=‘exactitud’, CV=CV, n_jobs=–1) # informe de rendimiento impresión(‘Precisión:% .3f (% .3f)’ % (media(n_scores), std(n_scores))) |
La ejecución del ejemplo evalúa el rendimiento del modelo en el conjunto de datos sintéticos e informa la precisión de la clasificación de la desviación estándar y la media.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.
En este caso, podemos ver que el algoritmo de aumento de gradiente de histograma XGBoost logra una precisión media de alrededor del 95,7 por ciento en el conjunto de datos sintéticos.
Aumento de gradiente de histograma con LightGBM
Light Gradient Boosting Machine o LightGBM para abreviar es otra biblioteca de terceros como XGBoost que proporciona una implementación altamente optimizada de gradiente Boosting.
Es posible que haya implementado la técnica del histograma antes que XGBoost, pero XGBoost luego implementó la misma técnica, destacando el «eficiencia de aumento de gradiente”Competencia entre bibliotecas que impulsan el gradiente.
La biblioteca LightGBM se puede instalar usando su administrador de paquetes favorito de Python, como Pip; por ejemplo:
sudo pip instalar lightgbm |
Podemos desarrollar modelos LightGBM para usar con la biblioteca scikit-learn a través de las clases LGBMClassifier y LGBMRegressor.
El algoritmo de entrenamiento usa histogramas por defecto. Los contenedores máximos por variable de entrada continua se pueden configurar mediante el botón «max_bin» argumento.
... # definir el modelo modelo = Clasificador LGBM(max_bin=255, n_estimators=100) |
El siguiente ejemplo demuestra la evaluación de un modelo LightGBM configurado para usar el histograma o técnica aproximada para construir árboles con 255 contenedores por característica de entrada continua y 100 árboles en el modelo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 |
# evaluar el algoritmo de aumento de gradiente de histograma lightgbm para la clasificación desde numpy importar media desde numpy importar std desde sklearn.conjuntos de datos importar make_classification desde sklearn.model_selection importar cross_val_score desde sklearn.model_selection importar Repetido estratificado KFold desde lightgbm importar Clasificador LGBM # definir conjunto de datos X, y = make_classification(n_samples=10000, n_features=100, n_informativo=50, n_redundante=50, estado_aleatorio=1) # definir el modelo modelo = Clasificador LGBM(max_bin=255, n_estimators=100) # definir el procedimiento de evaluación CV = Repetido estratificado KFold(n_splits=10, n_repeats=3, estado_aleatorio=1) # evaluar el modelo y recopilar las puntuaciones n_scores = cross_val_score(modelo, X, y, puntuación=‘exactitud’, CV=CV, n_jobs=–1) # informe de rendimiento impresión(‘Precisión:% .3f (% .3f)’ % (media(n_scores), std(n_scores))) |
La ejecución del ejemplo evalúa el rendimiento del modelo en el conjunto de datos sintéticos e informa la precisión de la clasificación de la desviación estándar y la media.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.
En este caso, podemos ver que el algoritmo de aumento de gradiente de histograma LightGBM logra una precisión media de alrededor del 94,2 por ciento en el conjunto de datos sintéticos.
Otras lecturas
Esta sección proporciona más recursos sobre el tema si está buscando profundizar.
Tutoriales
Documentos
API
Resumen
En este tutorial, descubrió cómo desarrollar conjuntos de árboles de aumento de gradiente basados en histogramas.
Específicamente, aprendiste:
- El aumento de gradiente basado en histogramas es una técnica para entrenar árboles de decisión más rápidos que se utilizan en el conjunto de aumento de gradiente.
- Cómo utilizar la implementación experimental del aumento de gradiente basado en histogramas en la biblioteca scikit-learn.
- Cómo usar conjuntos de aumento de gradiente basados en histogramas con las bibliotecas de terceros XGBoost y LightGBM.
¿Tiene usted alguna pregunta?
Haga sus preguntas en los comentarios a continuación y haré todo lo posible para responder.