Найти в Дзене

ADF в Машинном обучении простыми словами

Оглавление
Фото: Tarryn Myburgh / Unsplash
Фото: Tarryn Myburgh / Unsplash

Тест ADF (расширенный тест Дики – Фуллера) – проверка Статистической значимости (Statistical Significance), которая демонстрирует результаты проверки Нулевой гипотезы (Null Hypothesis) и Альтернативной (Alternative Hypothesis). В результате мы получим P-значение (P Value), из которого можно сделать вывод о Стационарности (Stationarity) Временного ряда (Time Series). Был предложен в 1979 году Дэвидом Дики и Уэйном Фуллером.

Когда мы создаем прогнозирующую Модель (Model) для временных рядов, нам требуются стационарные временные ряды, то есть обладающие одинаковой Ковариацией (Covariance) Выборок (Sample) одного размера. Ковариация – мера взаимосвязи двух случайных величин, измеряющая общее отклонение двух случайных величин от их ожидаемых значений. Метрика оценивает, в какой степени переменные изменяются вместе. Другими словами, это мера Дисперсии (Variance) между двумя переменными.

Стационарный временной ряд (сверху) и нестационарный
Стационарный временной ряд (сверху) и нестационарный

Тестирование на стационарность часто используется в Авторегрессионном моделях (Autoregressive Model). Мы можем выполнять различные тесты, такие как Критерий KPSS, Тест Филлипса – Перрона (Phillips-Perron Test) и ADF – тема этой статьи. Мы рассмотрим логику, стоящую за тестом, и реализуем ее с помощью временного ряда.

Мы проведем ADF-тест с нестационарными данными о пассажирах авиакомпаний и стационарными данными о температуре.

ADF: statsmodels

Для начала импортируем необходимые библиотеки:

from statsmodels.tsa.stattools import adfuller

import pandas as pd

import numpy as np

Нестационарный временной ряд

Мы будем использовать Датасет (Dataset) о числе пассажиров одной авиакомпании:

path = 'https://www.dropbox.com/s/cdjjafehpd0tmbw/AirPassengers.csv?dl=1'

data = pd.read_csv(path)

data.plot(figsize = (14, 8), title = 'Число пассажиров')

-3

Теперь, когда у нас есть все, что нужно, мы можем выполнить ADF-тест:

result = adfuller(data['#Passengers'], autolag='AIC')

print('Критерий ADF: %f' % result[0])

print('P-значение: %f' % result[1])

print('Критические значения:')

for key, value in result[4].items():

print('\t%s: %.3f' % (key, value))

if result[0] < result[4]["5%"]:

print ("Нулевая гипотеза отвергнута – Временной ряд стационарен")

else:

print ("Нулевая гипотеза не отвергнута – Временной ряд не стационарен")

Вот такие мы получим метрики:

Критерий ADF: 0.815369

P-значение: 0.991880

Критические значения:

1%: -3.482

5%: -2.884

10%: -2.579

Нулевая гипотеза не отвергнута – Временной ряд не стационарен

P-значение для временного ряда больше 5%, и, соответственно, нулевая гипотеза не отвергнута, а временной ряд нестационарен.

Стационарный временной ряд

Загрузим данные о температуре в Австралии:

path = 'https://www.dropbox.com/s/i8xs9myposohyp9/temperature.csv?dl=1'

data = pd.read_csv(path)

data.plot(figsize = (14, 8), title = 'Температура')

Это средние значения температуры за день в течение нескольких лет:

-4

Проверим этот временной ряд на стационарность:

result = adfuller(data['Temp'], autolag = 'AIC')

print('Критерий ADF: %f' % result[0])

print('P-значение: %f' % result[1])

print('Критические значения:')

for key, value in result[4].items():

print('\t%s: %.3f' % (key, value))

if result[0] > result[4]["5%"]:

print ("Нулевая гипотеза отвергнута – Временной ряд не стационарен")

else:

print ("Нулевая гипотеза не отвергнута – Временной ряд стационарен")

В результате мы видим, что P-значение, полученное в результате теста, меньше 0,05, поэтому мы собираемся отклонить нулевую гипотезу о нестационарности:

Критерий ADF: -4.444805

P-значение: 0.000247

Критические значения:

1%: -3.432

5%: -2.862

10%: -2.567

Нулевая гипотеза не отвергнута – Временной ряд стационарен

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Поддержите нас, поделившись статьей в социальных сетях и подписавшись на канал. И попробуйте бесплатные курсы на YouTube.