Структурированный блокнот   
 Машинное обучение (Machine Learning, обучающиеся алгоритмы) →  Обучение с учителем (Supervised learning) →  

Прогнозирование временных рядов

Разберёмся с автокорреляцией и стационарностью
1) Автокорреляция -- это корреляция между значением ряда в момент t и в момент t-1, а также отстоящие на любое другое время моменты t-n. Например, если t считается в месяцах, а временной ряд имеет ярко выраженный сезонный тренд (график повторяет форму год от года), то мы будем иметь большую положительную корреляцию при n=12 (т.е. значения сейчас и год назад хорошо скоррелированы). В случае растущего ряда большинство автокорреляций с малыми n будут положительными, а с большими n могут осциллировать около 0. У шумного / непредсказуемого временного ряда все компоненты будут около 0. Гипотезу о наличии значимого отклонения от нуля можно проверить статистическим критерием Стьюдента.
2) Стационарный ряд -- это такой ряд, что его свойства (среднее, дисперсия) не зависят от того, какой период мы выберем для их вычисления. Растущий ряд, а так же ряд с сезонным трендом не является стационарным. В то же время шумный ряд без тренда или ряд с всплесками с непредсказуемой периодичностью считаются стационарными. Проверка на стационарность производится статистическим критерием Дики-Фуллера.
Нестационарный ряд можно приводить к стационарному дифференцированием: имея ряд y(t) сделаем z(t) = y(t) - y(t-1). Для рядов с ярко выраженной сезонностью разумно использовать z(t) = y(t) - y(t-12). Если сезонность преобладает, лучше начать с такой коррекции. В общем случае логично вычитать компоненты с большой положительной корреляцией. Эту процедуру можно проделывать несколько раз (как с единичным шагом, так и с разными шагами) до получения стационарности. Для того, чтобы избавиться от нестационарной дисперсии зачастую достаточно взять логарифм, либо степенную функцию (со степенью меньше 1) -- преобразование Бокса-Кокса (там на самом деле ещё линейное преобразование при степенной функции)

Для предсказания временных рядом выгоднее использовать не модель, которая предсказывает его, как функцию от времени y = y(t), а как функцию от его предыдущих значений y_predicted(t) = a1*y(t-1) + a2*y(t-2) + ... + const
Так же оказывается полезным добавить аналогичную сумму не только по предыдущим значениям функции, но и по предыдущим значениям шума функции е(t) = y_predicted(t) - y(t), т.е.
y_predicted(t) = a1*y(t-1) + a2*y(t-2) + ... + ap*y(t-p) + b1*e(t-1) + b2*e(t-2) + ... + + bq*e(t-q) + const
Такая модель называется ARMA(p, q). Существует теорема утверждающая, что таким образом можно с любой наперёд заданной точностью приблизить любую стационарную функцию. С практической точки зрения важно, что такая модель обычно разумно предсказывает дальнейшее развитие временного ряда.
В случае нестационарности ряда его можно продифференцировать d раз, подать на вход ARMA, а результат прогноза вновь просуммировать d раз -- получив предсказание. Такая модель называется ARIMA(p, d, q)
Если мы знаем, что в модели сильная сезонность с периодом S, то логично добавить S-тый компонент, а также компоненты 2S, 3S и т.д. А так же шумовые компоненты с этим же периодом. Такая модель будет называть SARMA(p,q)х(P,Q)
Аналогично можно обобщить SARIMA(p,d,q)x(P,D,Q)

Как выбрать, сколько параметров брать в модели (т.е. подобрать те самые p, q, P, Q)? Нельзя использовать метод максимума правдоподобия, т.к. чем больше параметров мы задействуем тем более правдоподобную модель сможем составить. Поэтому нужно сделать "штраф" за каждый дополнительный параметр. Введём k = p+q+P+Q+1, и при функции правдоподобия L будем считать следующее значение AIC = -2*log(L) + 2*k -- и минимизируем его, перебирая p, q, P, Q.
Начальные значения в переборе поможет выбрать автокорреляционная функция. Для выбора q берём количество подряд идущих статистически значимо не нулевых значений в автокорреляции. Для выбора Q то же самое, но берём подряд идущие сезонные значения.
Поиск по записям в текущем разделе: