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 для сезонных эффектов.



