Extreme Gradient Boosting (XGBoost) es una biblioteca de código abierto que proporciona una implementación eficiente y efectiva del algoritmo de aumento de gradiente.
Poco después de su desarrollo y lanzamiento inicial, XGBoost se convirtió en el método de referencia y, a menudo, en el componente clave para obtener soluciones para una variedad de problemas en las competencias de aprendizaje automático.
Los problemas de modelos predictivos de regresión implican la predicción de un valor numérico, como una cantidad en dólares o una altura. XGBoost se puede utilizar directamente para modelado predictivo de regresión.
En este tutorial, descubrirá cómo desarrollar y evaluar modelos de regresión XGBoost en Python.
Después de completar este tutorial, sabrá:
- XGBoost es una implementación eficiente de aumento de gradiente que se puede utilizar para el modelado predictivo de regresión.
- Cómo evaluar un modelo de regresión XGBoost utilizando la técnica de mejores prácticas de validación cruzada repetida de k veces.
- Cómo ajustar un modelo final y usarlo para hacer una predicción sobre nuevos datos.
Empecemos.
Descripción general del tutorial
Este tutorial se divide en tres partes; son:
- Aumento de gradiente extremo
- API de regresión XGBoost
- Ejemplo de regresión XGBoost
Aumento de gradiente extremo
Aumento de gradiente se refiere a una clase de algoritmos conjuntos de aprendizaje automático que se pueden utilizar para problemas de modelado predictivo de clasificación o regresión.
Los conjuntos se construyen a partir de modelos de árboles de decisión. Los árboles se agregan uno a la vez al conjunto y se ajustan para corregir los errores de predicción realizados por modelos anteriores. Este es un tipo de modelo de aprendizaje automático de conjunto denominado impulso.
Los modelos se ajustan utilizando cualquier función de pérdida diferenciable arbitraria y algoritmo de optimización de descenso de gradiente. Esto le da a la técnica su nombre, «aumento de gradiente, ”Ya que el gradiente de pérdida se minimiza a medida que se ajusta el modelo, al igual que una red neuronal.
Para obtener más información sobre el aumento de gradiente, consulte el tutorial:
Extreme Gradient Boosting, o XGBoost para abreviar, es una implementación eficiente de código abierto del algoritmo de aumento de gradiente. Como tal, XGBoost es un algoritmo, un proyecto de código abierto y una biblioteca de Python.
Inicialmente fue desarrollado por Tianqi Chen y fue descrito por Chen y Carlos Guestrin en su artículo de 2016 titulado «XGBoost: A Scalable Tree Boosting System».
Está diseñado para ser computacionalmente eficiente (por ejemplo, rápido de ejecutar) y altamente efectivo, quizás más efectivo que otras implementaciones de código abierto.
Las dos razones principales para utilizar XGBoost son la velocidad de ejecución y el rendimiento del modelo.
XGBoost domina los conjuntos de datos estructurados o tabulares sobre problemas de modelado predictivo de clasificación y regresión. La evidencia es que es el algoritmo de referencia para los ganadores de la competencia en la plataforma de ciencia de datos competitiva de Kaggle.
Entre las 29 soluciones ganadoras de desafíos 3 publicadas en el blog de Kaggle durante 2015, 17 soluciones utilizaron XGBoost. […] El éxito del sistema también se vio en KDDCup 2015, donde XGBoost fue utilizado por todos los equipos ganadores en el top 10.
– XGBoost: un sistema de aumento de árboles escalable, 2016.
Ahora que estamos familiarizados con lo que es XGBoost y por qué es importante, echemos un vistazo más de cerca a cómo podemos usarlo en nuestros proyectos de modelado predictivo de regresión.
API de regresión XGBoost
XGBoost se puede instalar como una biblioteca independiente y se puede desarrollar un modelo XGBoost utilizando la API scikit-learn.
El primer paso es instalar la biblioteca XGBoost si aún no está instalada. Esto se puede lograr usando el administrador de paquetes pip python en la mayoría de las plataformas; por ejemplo:
A continuación, puede confirmar que la biblioteca XGBoost se instaló correctamente y se puede utilizar ejecutando el siguiente script.
# comprobar la versión de xgboost importar xgboost imprimir(xgboost.__versión__) |
La ejecución del script imprimirá su versión de la biblioteca XGBoost que ha instalado.
Tu versión debe ser igual o superior. De lo contrario, debe actualizar su versión de la biblioteca XGBoost.
Es posible que tenga problemas con la última versión de la biblioteca. No es tu culpa.
A veces, la versión más reciente de la biblioteca impone requisitos adicionales o puede ser menos estable.
Si tiene errores al intentar ejecutar el script anterior, le recomiendo cambiar a la versión 1.0.1 (o inferior). Esto se puede lograr especificando la versión a instalar en el comando pip, de la siguiente manera:
sudo pip install xgboost == 1.0.1 |
Si necesita instrucciones específicas para su entorno de desarrollo, consulte el tutorial:
La biblioteca XGBoost tiene su propia API personalizada, aunque usaremos el método a través de las clases contenedoras de scikit-learn: XGBRegressor y XGBClassifier. Esto nos permitirá utilizar el conjunto completo de herramientas de la biblioteca de aprendizaje automático scikit-learn para preparar datos y evaluar modelos.
Se puede definir un modelo de regresión XGBoost creando una instancia del XGBRegressor clase; por ejemplo:
... # crear un modelo de regresión xgboost modelo = XGBRegressor() |
Puede especificar valores de hiperparámetros al constructor de clases para configurar el modelo.
Quizás los hiperparámetros configurados con más frecuencia son los siguientes:
- n_estimators: El número de árboles en el conjunto, a menudo aumenta hasta que no se observan más mejoras.
- máxima profundidad: La profundidad máxima de cada árbol, a menudo los valores están entre 1 y 10.
- eta: La tasa de aprendizaje utilizada para ponderar cada modelo, a menudo establecida en valores pequeños como 0.3, 0.1, 0.01 o menores.
- submuestra: El número de muestras (filas) utilizadas en cada árbol, establecido en un valor entre 0 y 1, a menudo 1,0 para utilizar todas las muestras.
- colsample_bytree: Número de características (columnas) utilizadas en cada árbol, establecido en un valor entre 0 y 1, a menudo 1.0 para usar todas las características.
Por ejemplo:
... # crear un modelo de regresión xgboost modelo = XGBRegressor(n_estimators=1000, máxima profundidad=7, eta=0,1, submuestra=0,7, colsample_bytree=0,8) |
Se pueden encontrar buenos valores de hiperparámetros mediante prueba y error para un conjunto de datos determinado, o mediante experimentación sistemática, como el uso de una búsqueda en cuadrícula en un rango de valores.
La aleatoriedad se utiliza en la construcción del modelo. Esto significa que cada vez que el algoritmo se ejecuta con los mismos datos, puede producir un modelo ligeramente diferente.
Cuando se utilizan algoritmos de aprendizaje automático que tienen un algoritmo de aprendizaje estocástico, es una buena práctica evaluarlos promediando su rendimiento en múltiples ejecuciones o repeticiones de validación cruzada. Al ajustar un modelo final, puede ser conveniente aumentar el número de árboles hasta que la varianza del modelo se reduzca en las evaluaciones repetidas, o ajustar varios modelos finales y promediar sus predicciones.
Veamos cómo desarrollar un conjunto XGBoost para regresión.
Ejemplo de regresión XGBoost
En esta sección, veremos cómo podemos desarrollar un modelo XGBoost para un conjunto de datos de modelado predictivo de regresión estándar.
Primero, introduzcamos un conjunto de datos de regresión estándar.
Usaremos el conjunto de datos de vivienda.
El conjunto de datos de vivienda es un conjunto de datos de aprendizaje automático estándar que comprende 506 filas de datos con 13 variables de entrada numéricas y una variable de destino numérica.
Usando un arnés de prueba de validación cruzada estratificada repetida de 10 veces con tres repeticiones, un modelo ingenuo puede lograr un error absoluto medio (MAE) de aproximadamente 6,6. Un modelo de alto rendimiento puede lograr un MAE en este mismo arnés de prueba de aproximadamente 1,9. Esto proporciona los límites del rendimiento esperado en este conjunto de datos.
El conjunto de datos implica predecir el precio de la vivienda dados los detalles del suburbio de la vivienda en la ciudad estadounidense de Boston.
No es necesario descargar el conjunto de datos; lo descargaremos automáticamente como parte de nuestros ejemplos trabajados.
El siguiente ejemplo descarga y carga el conjunto de datos como un Pandas DataFrame y resume la forma del conjunto de datos y las primeras cinco filas de datos.
# cargar y resumir el conjunto de datos de vivienda desde pandas importar read_csv desde matplotlib importar pyplot # cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ marco de datos = read_csv(url, encabezamiento=Ninguno) # resumir forma imprimir(marco de datos.forma) # resumir las primeras líneas imprimir(marco de datos.cabeza()) |
La ejecución del ejemplo confirma las 506 filas de datos y 13 variables de entrada y una única variable de destino numérica (14 en total). También podemos ver que todas las variables de entrada son numéricas.
(506, 14) 0 1 2 3 4 5 … 8 9 10 11 12 13 0 0,00632 18,0 2,31 0 0,538 6,575 … 1296,0 15,3 396,90 4,98 24,0 1 0,02731 0,0 7,07 0 0,469 6,421 … 2242,0 17,8 396,90 9,14 21,6 2 0.02729 0.0 7.07 0 0.469 7.185 … 2242.0 17.8 392.83 4.03 34.7 3 0,03237 0,0 2,18 0 0,458 6,998 … 3222,0 18,7 394,63 2,94 33,4 4 0.06905 0.0 2.18 0 0.458 7.147 … 3222.0 18.7 396.90 5.33 36.2 [5 rows x 14 columns] |
A continuación, evaluemos un modelo de regresión XGBoost con hiperparámetros predeterminados sobre el problema.
Primero, podemos dividir el conjunto de datos cargado en columnas de entrada y salida para entrenar y evaluar un modelo predictivo.
... # dividir los datos en columnas de entrada y salida X, y = datos[[:, :–1], datos[[:, –1] |
A continuación, podemos crear una instancia del modelo con una configuración predeterminada.
... # definir modelo modelo = XGBRegressor() |
Evaluaremos el modelo utilizando la mejor práctica de validación cruzada repetida de k veces con 3 repeticiones y 10 pliegues.
Esto se puede lograr usando la clase RepeatedKFold para configurar el procedimiento de evaluación y llamando al cross_val_score () para evaluar el modelo usando el procedimiento y recolectar las puntuaciones.
El rendimiento del modelo se evaluará utilizando el error cuadrático medio (MAE). Tenga en cuenta que MAE se hace negativo en la biblioteca scikit-learn para que pueda maximizarse. Como tal, podemos ignorar el signo y asumir que todos los errores son positivos.
... # definir el método de evaluación del modelo CV = Repetido KFold(n_splits=10, n_repeats=3, estado_aleatorio=1) # evaluar modelo puntuaciones = cross_val_score(modelo, X, y, puntuación=‘neg_mean_absolute_error’, CV=CV, n_jobs=–1) |
Una vez evaluado, podemos informar el rendimiento estimado del modelo cuando se utiliza para hacer predicciones sobre nuevos datos para este problema.
En este caso, debido a que las puntuaciones se hicieron negativas, podemos usar la función absoluta () NumPy para que las puntuaciones sean positivas.
Luego informamos un resumen estadístico del desempeño utilizando la media y la desviación estándar de la distribución de puntajes, otra buena práctica.
... # obligar a que las puntuaciones sean positivas puntuaciones = absoluto(puntuaciones) imprimir(‘MAE medio:% .3f (% .3f)’ % (puntuaciones.significar(), puntuaciones.std()) ) |
Al unir esto, el ejemplo completo de evaluación de un modelo XGBoost en el problema de modelado predictivo de regresión de vivienda 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 |
# evaluar un modelo de regresión xgboost en el conjunto de datos de vivienda desde numpy importar absoluto desde pandas importar read_csv desde sklearn.model_selection importar cross_val_score desde sklearn.model_selection importar Repetido KFold desde xgboost importar XGBRegressor # cargar el conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ marco de datos = read_csv(url, encabezamiento=Ninguno) datos = marco de datos.valores # dividir los datos en columnas de entrada y salida X, y = datos[[:, :–1], datos[[:, –1] # definir modelo modelo = XGBRegressor() # definir el método de evaluación del modelo CV = Repetido KFold(n_splits=10, n_repeats=3, estado_aleatorio=1) # evaluar modelo puntuaciones = cross_val_score(modelo, X, y, puntuación=‘neg_mean_absolute_error’, CV=CV, n_jobs=–1) # obligar a que las puntuaciones sean positivas puntuaciones = absoluto(puntuaciones) imprimir(‘MAE medio:% .3f (% .3f)’ % (puntuaciones.significar(), puntuaciones.std()) ) |
La ejecución del ejemplo evalúa el algoritmo de regresión XGBoost en el conjunto de datos de vivienda e informa el MAE promedio en las tres repeticiones de la validación cruzada de 10 veces.
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 modelo logró un MAE de alrededor de 2,1.
Esta es una buena puntuación, mejor que la línea de base, lo que significa que el modelo tiene habilidad y está cerca de la mejor puntuación de 1,9.
Podemos decidir utilizar el modelo de regresión XGBoost como nuestro modelo final y hacer predicciones sobre nuevos datos.
Esto se puede lograr ajustando el modelo a todos los datos disponibles y llamando al predecir() función, pasando una nueva fila de datos.
Por ejemplo:
... # Haz una predicción yhat = modelo.predecir(nuevos datos) |
Podemos demostrar esto con un ejemplo completo, que 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 |
# ajuste un modelo xgboost final en el conjunto de datos de vivienda y haga una predicción desde numpy importar asarray desde pandas importar read_csv desde xgboost importar XGBRegressor # cargar el conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ marco de datos = read_csv(url, encabezamiento=Ninguno) datos = marco de datos.valores # dividir el conjunto de datos en columnas de entrada y salida X, y = datos[[:, :–1], datos[[:, –1] # definir modelo modelo = XGBRegressor() # modelo de ajuste modelo.encajar(X, y) # definir nuevos datos fila = [[0,00632,18.00,2.310,0,0.5380,6.5750,65,20,4.0900,1,296.0,15.30,396,90,4,98] nuevos datos = asarray([[fila]) # Haz una predicción yhat = modelo.predecir(nuevos datos) # resumir predicción imprimir(‘Previsto:% .3f’ % yhat) |
La ejecución del ejemplo se ajusta al modelo y hace una predicción para las nuevas filas de datos.
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 modelo predijo un valor de alrededor de 24.
Otras lecturas
Esta sección proporciona más recursos sobre el tema si desea profundizar.
Tutoriales
Documentos
API
Resumen
En este tutorial, descubrió cómo desarrollar y evaluar modelos de regresión XGBoost en Python.
Específicamente, aprendiste:
- XGBoost es una implementación eficiente de aumento de gradiente que se puede utilizar para el modelado predictivo de regresión.
- Cómo evaluar un modelo de regresión XGBoost utilizando la técnica de mejores prácticas de validación cruzada repetida de k veces.
- Cómo ajustar un modelo final y usarlo para hacer una predicción sobre nuevos datos.
¿Tiene usted alguna pregunta?
Haga sus preguntas en los comentarios a continuación y haré todo lo posible para responder.