Aprovechando XGBoost para pronóstico de series temporales

Using XGBoost for time series forecasting

XGBoost (eXtreme Gradient Boosting) es un algoritmo de código abierto que implementa árboles de aumento de gradiente con mejoras adicionales para obtener un mejor rendimiento y velocidad. La capacidad rápida del algoritmo para realizar predicciones precisas lo convierte en un modelo de referencia para muchas competiciones, como la competencia de Kaggle.

Los casos comunes para las aplicaciones de XGBoost son la predicción de clasificación, como la detección de fraudes, o la predicción de regresión, como la predicción del precio de las casas. Sin embargo, también es posible extender el algoritmo de XGBoost para predecir datos de series de tiempo. ¿Cómo funciona? Vamos a explorarlo más a fondo.

 

Predicción de series de tiempo

 

La predicción en ciencia de datos y aprendizaje automático es una técnica utilizada para predecir valores numéricos futuros basados en datos históricos recopilados a lo largo del tiempo, ya sea en intervalos regulares o irregulares.

A diferencia de los datos de entrenamiento comunes de aprendizaje automático donde cada observación es independiente de las demás, los datos para las predicciones de series de tiempo deben estar en orden sucesivo y relacionados entre sí. Por ejemplo, los datos de series de tiempo podrían incluir acciones mensuales, clima semanal, ventas diarias, etc.

Echemos un vistazo a los datos de ejemplo de series de tiempo Daily Climate de Kaggle.

import pandas as pd

train = pd.read_csv('DailyDelhiClimateTrain.csv')
test = pd.read_csv('DailyDelhiClimateTest.csv')

train.head()

 

 

Si observamos el dataframe anterior, cada característica se registra diariamente. La columna de fecha indica cuándo se observan los datos, y cada observación está relacionada.

Las predicciones de series de tiempo a menudo incorporan tendencias, estacionalidad y otros patrones de los datos para crear pronósticos. Una forma sencilla de observar el patrón es visualizarlos. Por ejemplo, visualizaría los datos de temperatura media de nuestro conjunto de datos de ejemplo.

train["date"] = pd.to_datetime(train["date"])
test["date"] = pd.to_datetime(test["date"])

train = train.set_index("date")
test = test.set_index("date")

train["meantemp"].plot(style="k", figsize=(10, 5), label="train")
test["meantemp"].plot(style="b", figsize=(10, 5), label="test")
plt.title("Datos de temperatura media de Dehli")
plt.legend()

 

 

Es fácil ver en el gráfico anterior que cada año tiene un patrón de estacionalidad común. Al incorporar esta información, podemos comprender cómo funcionan nuestros datos y decidir qué modelo podría adaptarse a nuestro modelo de pronóstico.

Los modelos de pronóstico típicos incluyen ARIMA, Vector AutoRegression, Exponential Smoothing y Prophet. Sin embargo, también podemos utilizar XGBoost para proporcionar el pronóstico.

 

Pronóstico con XGBoost

 

Antes de prepararnos para pronosticar utilizando XGBoost, primero debemos instalar el paquete.

pip install xgboost

 

Después de la instalación, prepararíamos los datos para el entrenamiento de nuestro modelo. En teoría, XGBoost Forecasting implementaría el modelo de regresión basado en una o varias características para predecir valores numéricos futuros. Por eso, el entrenamiento de datos también debe estar en valores numéricos. Además, para incorporar la evolución del tiempo en nuestro modelo XGBoost, convertiríamos los datos de tiempo en múltiples características numéricas.

Comencemos creando una función para crear las características numéricas a partir de la fecha.

def create_time_feature(df):
    df['dayofmonth'] = df['date'].dt.day
    df['dayofweek'] = df['date'].dt.dayofweek
    df['quarter'] = df['date'].dt.quarter
    df['month'] = df['date'].dt.month
    df['year'] = df['date'].dt.year
    df['dayofyear'] = df['date'].dt.dayofyear
    df['weekofyear'] = df['date'].dt.weekofyear
    return df

 

A continuación, aplicaríamos esta función a los datos de entrenamiento y prueba.

train = create_time_feature(train)
test = create_time_feature(test)

train.head()

 

 

La información requerida ya está disponible. A continuación, definiremos lo que queremos predecir. En este ejemplo, pronosticaremos la temperatura media y crearemos los datos de entrenamiento basados en los datos anteriores.

X_train = train.drop('meantemp', axis =1)
y_train = train['meantemp']

X_test = test.drop('meantemp', axis =1)
y_test = test['meantemp']

 

Todavía utilizaría otra información, como la humedad, para demostrar que XGBoost también puede pronosticar valores utilizando enfoques multivariables. Sin embargo, en la práctica, solo incorporamos datos que sabemos que existen cuando intentamos pronosticar.

Comencemos el proceso de entrenamiento ajustando los datos al modelo. Para el ejemplo actual, no haremos mucha optimización de hiperparámetros aparte del número de árboles.

import xgboost as xgb

reg = xgb.XGBRegressor(n_estimators=1000)
reg.fit(X_train, y_train, verbose = False)

 

Después del proceso de entrenamiento, veamos la importancia de las características del modelo.

xgb.plot_importance(reg)

 

 

Las tres características iniciales no sorprenden por ser útiles para el pronóstico, pero las características de tiempo también contribuyen a la predicción. Intentemos obtener el pronóstico en los datos de prueba y visualicémoslos.

test['meantemp_Prediction'] = reg.predict(X_test)

train['meantemp'].plot(style='k', figsize=(10,5), label = 'train')
test['meantemp'].plot(style='b', figsize=(10,5), label = 'test')
test['meantemp_Prediction'].plot(style='r', figsize=(10,5), label = 'prediction')
plt.title('Datos de temperatura media de Dehli')
plt.legend()

 

 

Como podemos ver en el gráfico anterior, la predicción puede parecer ligeramente incorrecta pero sigue la tendencia general. Intentemos evaluar el modelo en función de las métricas de error.

from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error

print('RMSE: ', round(mean_squared_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAE: ', round(mean_absolute_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAPE: ', round(mean_absolute_percentage_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))

 

RMSE:  11.514

MAE:  2.655

MAPE:  0.133

El resultado muestra que nuestra predicción puede tener un error de alrededor del 13%, y el RMSE también muestra un ligero error en el pronóstico. El modelo se puede mejorar utilizando la optimización de hiperparámetros, pero hemos aprendido cómo se puede utilizar XGBoost para el pronóstico.

 

Conclusión

 

XGBoost es un algoritmo de código abierto que se utiliza a menudo en muchos casos de ciencia de datos y en competiciones de Kaggle. A menudo, los casos de uso son casos de clasificación comunes, como la detección de fraudes, o casos de regresión, como el pronóstico de precios de viviendas, pero XGBoost también se puede extender al pronóstico de series temporales. Mediante el uso del Regresor XGBoost, podemos crear un modelo que puede predecir valores numéricos futuros. Cornellius Yudha Wijaya es un asistente de gestión de ciencia de datos y escritor de datos. Mientras trabaja a tiempo completo en Allianz Indonesia, le encanta compartir consejos de Python y Datos a través de las redes sociales y los medios de escritura.  

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Persistent Systems moldea el futuro de la ingeniería de software con Amazon CodeWhisperer

Persistent Systems, un proveedor global de ingeniería digital, ha realizado varios pilotos y estudios formales con Am...

Inteligencia Artificial

Corea del Sur permite que los robots autónomos utilicen las aceras

El gobierno de Corea del Sur está permitiendo que robots autónomos autorizados conduzcan por las aceras del país.

Inteligencia Artificial

Satélites Sentinel mapean superemisores de metano

Un equipo internacional de investigadores ha desarrollado un algoritmo que utiliza el aprendizaje automático para det...

Inteligencia Artificial

EE.UU. acuerda sobre reglas históricas de Inteligencia Artificial

El acuerdo sobre la Ley de Inteligencia Artificial solidifica uno de los primeros intentos en el mundo de limitar el ...

Inteligencia Artificial

Conoce SMPLitex un modelo de IA generativo y un conjunto de datos para la estimación de textura humana en 3D a partir de una única imagen.

En el campo en constante evolución de la visión por computadora y los gráficos, un desafío significativo ha sido la c...