SARIMA в машинном обучении
В машинном обучении модель сезонного авторегрессивного интегрированного скользящего среднего (SARIMA) представляет собой шаг, отличный от модели ARIMA, основанной на концепции сезонных трендов. В этой статье я познакомлю вас с моделью SARIMA в машинном обучении.
Что такое модель SARIMA?
Сезонные вариации временных рядов могут учитывать периодические модели, что позволяет делать более точные прогнозы. Сезонный ARIMA (SARIMA) определяет, как сезонный, так и несезонный компонент модели ARIMA, позволяя фиксировать периодические характеристики.
Выбирая подходящую модель прогнозирования, всегда визуализируйте свои данные, чтобы определять тенденции, сезоны и циклы. Если сезонность является сильной стороной ряда, рассмотрите модели с сезонной корректировкой, такие как модель SARIMA.
Модель SARIMA в действии
В этой статье я буду использовать количество прибывших в Италию туристов. Данные взяты из европейской статистики: годовые данные по отраслям туризма. Вы можете скачать этот набор данных отсюда. Сначала мы импортируем набор данных о прибытии иностранных туристов в Италию с 2012 по октябрь 2019 года, а затем преобразуем его во временные ряды.
Давайте начнем с задачи с импорта и чтения данных:
import pandas as pd df = pd.read_csv('IT_tourists_arrivals.csv') df['date'] = pd.to_datetime(df['date']) df = df[df['date'] > '2012-01-01'] df.set_index('date', inplace=True)
Предварительный анализ
Предварительный анализ – это визуальный анализ временного ряда для понимания его тенденции и поведения. Сначала мы создаем временной ряд и сохраняем его в переменной ts.
ts = df['value'] import matplotlib.pylab as plt plt.plot(ts) plt.ylabel('Total Number of Tourists Arrivals') plt.grid() plt.tight_layout() plt.savefig('plots/IT_tourists_arrivals.png') plt.show()
Теперь настроим параметры:
from statsmodels.tsa.stattools import adfuller def test_stationarity(timeseries): dftest = adfuller(timeseries, autolag='AIC') dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used']) for key,value in dftest[4].items(): dfoutput['Critical Value (%s)'%key] = value critical_value = dftest[4]['5%'] test_statistic = dftest[0] alpha = 1e-3 pvalue = dftest[1] if pvalue < alpha and test_statistic < critical_value: # null hypothesis: x is non stationary print("X is stationary") return True else: print("X is not stationary") return False
Теперь нам нужно преобразовать временной ряд с помощью функции diff() столько раз, чтобы временной ряд стал стационарным:
ts_diff = pd.Series(ts) d = 0 while test_stationarity(ts_diff) is False: ts_diff = ts_diff.diff().dropna() d = d + 1
Теперь давайте взглянем на корреляцию между параметрами:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf plot_acf(ts_trend, lags =12) plt.savefig('plots/acf.png') plt.show()
Построение модели SARIMA:
Теперь давайте построим нашу модель, используя метод SARIMAX, предоставленный библиотекой statsmodels:
from statsmodels.tsa.statespace.sarimax import SARIMAX p = 9 q = 1 model = SARIMAX(ts, order=(p,d,q)) model_fit = model.fit(disp=1,solver='powell') fcast = model_fit.get_prediction(start=1, end=len(ts)) ts_p = fcast.predicted_mean ts_ci = fcast.conf_int()
Теперь нам нужно построить результаты нашей модели:
plt.plot(ts_p,label='prediction') plt.plot(ts,color='red',label='actual') plt.fill_between(ts_ci.index[1:], ts_ci.iloc[1:, 0], ts_ci.iloc[1:, 1], color='k', alpha=.2) plt.ylabel('Total Number of Tourists Arrivals') plt.legend() plt.tight_layout() plt.grid() plt.savefig('plots/IT_trend_prediction.png') plt.show()
Надеюсь, вам понравилась эта статья о том, как мы можем построить модель SARIMA для сезонных эффектов.