Publié le 18 novembre 2024
Modèle de Time Series
Lecture 2 min
Pour prédire sur un cycle (annuel par exemple), il faut au moins 3 cycles, 2 pour du test et 1 pour de la validation
from sktime.forecasting.model_selection import temporal_train_test_split
df['date'] = pd.to_datetime(df['date'])
df.index = df['date'].values
df.index = df.index.to_period('M') # D / M / W / W-MON
# test_size = dernière nombre de step, ex: derniers 12 mois / dernières 52 semaines, ...
df_train, df_test = temporal_train_test_split(df, test_size=12)
Modèle le plus simple, répercute la dernière période pour prédire le futur
from sktime.forecasting.naive import NaiveForecaster
forecaster = NaiveForecaster(sp=12) # saisonnalité : 12 mois dans un an ou 52 si en semaine
Prend en compte :
Ne prend pas en compte les jours fériés
from sktime.forecasting.exp_smoothing import ExponentialSmoothing
forecaster = ExponentialSmoothing(trend="add", seasonal="add")
# trend : tendance sur toutes les données
# seasonal : tendance sur un cycle (12 mois / 52 semaines / ...)
Ne prend pas en compte les jours fériés
from sktime.forecasting.arima import AutoARIMA
forecaster = AutoARIMA()
y_train = df_train['col']
y_true = df_test['col']
forecaster.fit(y_train)
horizon = np.arange(1, 12+1)
y_pred = forecaster.predict(fh=horizon)
from sktime.performance_metrics.forecasting import mean_absolute_error, mean_absolute_percentage_error, mean_absolute_scaled_error
MAE = mean_absolute_error(y_true=y_true, y_pred=y_pred)
MAPE = mean_absolute_percentage_error(y_true=y_true, y_pred=y_pred, symmetric=False)
sMAPE = mean_absolute_percentage_error(y_true=y_true, y_pred=y_pred, symmetric=True)
MASE = mean_absolute_scaled_error(y_true=y_true, y_pred=y_pred, y_train=y_train)
from greykite.framework.templates.autogen.forecast_config
import ForecastConfig, MetadataParam
forecast_config = ForecastConfig(
model_template = "SILVERKITE", # ou PROPHET
forecast_horizon = 365,
coverage = 0.95,
metadata_param = MetadataParam(
time_col = "date",
value_col = "y",
freq = "D" # Pour une fréquence journalière
)
)
forecaster = Forecaster()
result = forecaster.run_forecast_config(
df=df,
config=forecast_config
)
Forecast VS Actual
result.backtest.plot()
SMAPE = result.backtest.test_evaluation['sMAPE']
pred = result.model.predict()