Pronóstico de una serie de tiempo con Skforecast

Se realizará un ejemplo de un pronóstico de una serie de tiempo con Sklearn y Skforecast y se utilizará un data set obtenido de Kaggle. Además se muestra en el ejemplo como realizar el ajuste de los hiperparámetros del modelo.

Primero importo todas las bibliotecas necesarias

import pandas as pd
import matplotlib.pyplot as plt
import skforecast
from skforecast.ForecasterAutoreg import ForecasterAutoreg
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from skforecast.model_selection import grid_search_forecaster

Abro mi dataset de tipo '.csv'
df = pd.read_csv('time_serie.csv')

Observo la estructura de mis datos
df.head()


En este caso vamos a querer pronosticar 'Sales_cuantity'.

#Reinicio el índice y me quedo con la columna de interés
df['x'] = df.index
df = df[['x', 'Sales_quantity']]
df.reset_index(drop=True, inplace=True)

Visualización de los datos

plt.plot(df['x'],df['Sales_quantity'])
plt.xlabel('índice')
plt.ylabel('Cantidad de ventas')
plt.show()

Elimino los datos nulos del dataset

#Chequeo si hay datos nulos
missing_values = df.isnull().sum()
print(missing_values)
print(df.shape)








df = df.dropna()

Preparo los datos para el modelo y separo el data set en los datos que serán usados
para entrenar el modelo y los datos que serán usados para testear el modelo.

#Se utilizarán los ultimos 36 meses para testear el modelo
n_test = 12
df_test = df[-n_test:]
df_train = df[:-n_test]


Creo el modelo y luego lo entreno con los datos. 'lags' hace referencia a cuantos
datos hacia atrás observa el modelo para lograr predecir los datos futuros.

#Creo el pronosticador y lo entreno con los datos de df_train
forecaster = ForecasterAutoreg(
                 regressor = RandomForestRegressor(random_state=50),
                 lags      = 10
             )
forecaster.fit(y=df_train['Sales_quantity'])
forecaster;

Predigo los valores y armo un dataframe con los valores obtenidos.

predictions = forecaster.predict(steps=n_test)
predictions.head(5)
predictions = predictions.reset_index()
predictions.columns = [['x','Sales_quantity']]


Visualización del pronóstico

#Grafico la prediccion vs los datos de test
plt.plot(df_train['x'],df_train['Sales_quantity'], label = 'Train')
plt.plot(df_test['x'],df_test['Sales_quantity'], label = 'Test')
plt.plot(df_test['x'],predictions['Sales_quantity'], label = 'Prediction')
plt.legend()
plt.show()



Se cuantifica el error del modelo mediante el error cuadrático medio (MSE)

#Voy a cuantificar el error de la predicción con el error cuadrático medio utilizando sklearn
error_mse = mean_squared_error(y_true = df_test['Sales_quantity'], y_pred = predictions['Sales_quantity'])
print('MSE =',error_mse)

MSE = 20729129.043174997

Con el fin de minimizar el error del modelo, se hace un ajuste de hiperparámetros,
se evalúan 24 modelos con diferentes hiperparámetros, al final, nos quedamos
con el que tenga un MSE menor.

#Ajuste de hiperparámetros
lags_grid = [10,20,25] #Valores de lags testeados

#Candidatos para el ajuste de los hiperparámetros
param_grid = {
    'n_estimators':[100,250],
    'max_depth':[3,5,10,15]
}

initial_train_size = max(50, int(len(df_train) * 0.5))

results_grid = grid_search_forecaster(
                   forecaster         = forecaster,
                   y                  = df_train['Sales_quantity'],
                   param_grid         = param_grid,
                   lags_grid          = lags_grid,
                   steps              = n_test,
                   refit              = False,
                   metric             = 'mean_squared_error',
                   initial_train_size = initial_train_size,
                   fixed_train_size   = False,
                   return_best        = True,
                   n_jobs             = 'auto',
                   verbose            = False
               )


Se adopta lags =25, max_depth = 3 y n_estimators = 100. Y se vuelve a entrenar
el modelo con estos hiperparámetros. Además notar que el MSE se redujo respecto al
modelo anterior.

#Creo el pronosticador con los hiperparámetros obtenidos
forecaster = ForecasterAutoreg(
                 regressor = RandomForestRegressor(n_estimators = 100, max_depth=3, random_state=111),
                 lags      = 25
             )
forecaster.fit(y=df_train['Sales_quantity'])
forecaster;

Hago nuevamente las predicciones.

#Predigo los valores para luego compararlo con los valores de test
predictions = forecaster.predict(steps=n_test)
predictions = predictions.reset_index()
predictions.columns = [['x','Sales_quantity']]

Grafico las nuevas predicciones obtenidas.

#Grafico la prediccion vs los datos de test
plt.plot(df_train['x'],df_train['Sales_quantity'], label = 'Train')
plt.plot(df_test['x'],df_test['Sales_quantity'], label = 'Test')
plt.plot(df_test['x'],predictions['Sales_quantity'], label = 'Prediction')
plt.legend()
plt.show()



Si se quiere utilizar este modelo para predecir valores futuros, hay que tener en
cuenta que se debe tener al menos 25 valores anteriores al valor a predecir.

Pueden encontrar el código completo y los datos en mi GitHub y el sitio de
Skforecast aquí.


Gracias por leer!












Comentarios

Entradas populares de este blog

Web scraping con Beautiful Soup y Python

Airbnb - Análisis exploratorio de datos