www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

Как удалить тренды и сезонность с помощью разностного преобразования в Python

Дата публикации 2017-07-10

Наборы данных временных рядов могут содержать тренды и сезонность, которые, возможно, потребуется удалить до моделирования.

Тенденции могут приводить к изменению среднего значения во времени, тогда как сезонность может приводить к изменению дисперсии во времени, которые определяют временной ряд как нестационарный. К стационарным наборам данных относятся стабильные средние и дисперсионные данные, которые, в свою очередь, гораздо проще моделировать.

Дифференцирование является популярным и широко используемым преобразованием данных для обеспечения стационарности данных временных рядов.

В этом руководстве вы узнаете, как применить разностную операцию к данным временных рядов с помощью Python.

После завершения этого урока вы узнаете:

  • Контраст между стационарным и нестационарным временным рядом и тем, как сделать ряд стационарным с разностным преобразованием.
  • Как применить разностное преобразование для удаления линейного тренда из серии.
  • Как применить разностное преобразование для удаления сезонного сигнала из серии.

Давайте начнем.

Обзор учебника

Этот урок разделен на 4 части; они есть:

  1. стационарность
  2. Разница Преобразование
  3. Различие для удаления трендов
  4. Разница для удаления сезонности

стационарность

Временные ряды отличаются от более традиционных задач классификации и прогнозного регрессионного моделирования.

Временная структура добавляет порядок наблюдениям. Этот навязанный порядок означает, что важные допущения в отношении согласованности этих наблюдений должны рассматриваться конкретно.

Например, при моделировании существуют предположения о том, что сводная статистика наблюдений согласована. В терминологии временных рядов мы называем это ожидание временным рядом.

Эти предположения могут быть легко нарушены во временных рядах путем добавления тренда, сезонности и других зависящих от времени структур.

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

Наблюдения в стационарном временном ряду не зависят от времени.

Временные ряды являются стационарными, если они не имеют трендовых или сезонных эффектов. Суммарные статистические данные, рассчитанные по временным рядам, согласованы во времени, например, среднее значение или дисперсия наблюдений.

Когда временной ряд является стационарным, его легче моделировать. Методы статистического моделирования предполагают или требуют, чтобы временной ряд был стационарным.

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

Наблюдения из нестационарного временного ряда показывают сезонные эффекты, тренды и другие структуры, которые зависят от временного индекса.

Сводные статистические данные, такие как среднее значение и дисперсия, меняются с течением времени, предоставляя дрейф в концепциях, которые модель может попытаться отразить.

Классические методы анализа и прогнозирования временных рядов направлены на то, чтобы сделать данные нестационарных временных рядов стационарными путем выявления и устранения тенденций и устранения стационарных эффектов.

Создание серийных данных

Вы можете проверить, является ли ваш временной ряд стационарным, посмотрев на линейный график ряда с течением времени.

Признаком явных тенденций, сезонности или других систематических структур в ряду являются показатели нестационарного ряда.

Более точным методом было бы использование статистического теста, такого как тест Дики-Фуллера.

Должны ли вы сделать свой временной ряд стационарным?

Вообще-то да.

Если у вас есть четкая тенденция и сезонность в ваших временных рядах, то смоделируйте эти компоненты, удалите их из наблюдений, а затем обучите модели на невязках.

Если мы подгоняем данные к стационарной модели, мы предполагаем, что наши данные являются реализацией стационарного процесса. Таким образом, наш первый шаг в анализе должен состоять в том, чтобы проверить, есть ли какие-либо признаки тенденции или сезонные эффекты и, если есть, удалить их.

- Страница 122,Вводный временной ряд с R,

Методы статистических временных рядов и даже современные методы машинного обучения получат выгоду от более четкого сигнала в данных.

Разница Преобразование

Дифференцирование - это метод преобразования набора данных временного ряда.

Его можно использовать для устранения зависимости ряда от времени, так называемой временной зависимости. Это включает в себя такие структуры, как тенденции и сезонность.

Дифференцирование может помочь стабилизировать среднее значение временного ряда, удаляя изменения уровня временного ряда и, таким образом, устраняя (или уменьшая) тенденцию и сезонность.

- страница 215,Прогнозирование: принципы и практика,

Дифференцирование выполняется путем вычитания предыдущего наблюдения из текущего наблюдения.

difference(t) = observation(t) - observation(t-1)

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

Этот процесс можно повернуть вспять, добавив наблюдение на предыдущем временном шаге к значению разницы.

inverted(t) = differenced(t) + observation(t-1)

Таким образом, ряд различий и инвертированные различия могут быть рассчитаны.

Лаг Разница

Взятие разницы между последовательными наблюдениями называется разницей лаг-1.

Разница в запаздывании может быть скорректирована в соответствии с конкретной временной структурой

Для временных рядов с сезонным компонентом можно ожидать, что отставание будет периодом (шириной) сезонности.

Разница заказа

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

Таким образом, процесс дифференцирования может повторяться более одного раза, пока вся временная зависимость не будет удалена.

Количество раз, когда выполняется различие, называется порядком разностей.

Расчет дифференцирования

Мы можем изменить набор данных вручную.

Это включает в себя разработку новой функции, которая создает дифференцированный набор данных. Функция будет циклически проходить по предоставленному ряду и вычислять разностные значения с заданным интервалом или задержкой.

Функция ниже названного разности () реализует эту процедуру.

# create a differenced series
def difference(dataset, interval=1):
	diff = list()
	for i in range(interval, len(dataset)):
		value = dataset[i] - dataset[i - interval]
		diff.append(value)
	return Series(diff)

Мы можем видеть, что функция осторожно запускает набор разностных данных после указанного интервала, чтобы обеспечить возможность вычисления разностных значений. Задан интервал по умолчанию или значение задержки 1. Это разумное значение по умолчанию.

Еще одним улучшением может быть также возможность указать порядок или количество раз для выполнения операции дифференцирования.

Функция под именем inverse_difference () инвертирует разностную операцию для одного прогноза. Требуется также предоставить реальное значение наблюдения для предыдущего временного шага.

# invert differenced forecast
def inverse_difference(last_ob, value):
	return value + last_ob

Различие для удаления трендов

В этом разделе мы рассмотрим использование разностного преобразования для удаления тренда.

Тенденция делает временной ряд нестационарным за счет увеличения уровня. Это приводит к изменению среднего значения временного ряда во времени.

В приведенном ниже примере функция разности () применяется к искусственному набору данных с линейно возрастающим трендом.

# create a differenced series
def difference(dataset, interval=1):
	diff = list()
	for i in range(interval, len(dataset)):
		value = dataset[i] - dataset[i - interval]
		diff.append(value)
	return diff

# invert differenced forecast
def inverse_difference(last_ob, value):
	return value + last_ob

# define a dataset with a linear trend
data = [i+1 for i in range(20)]
print(data)
# difference the dataset
diff = difference(data)
print(diff)
# invert the difference
inverted = [inverse_difference(data[i], diff[i]) for i in range(len(diff))]
print(inverted)

Выполнение примера сначала печатает придуманную последовательность с линейным трендом. Затем распечатывается набор разностных данных, показывающий увеличение на одну единицу каждый шаг по времени. Длина этой последовательности равна 19 вместо 20, так как разность для первого значения в последовательности не может быть рассчитана, так как нет предыдущего значения.

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

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Разница для удаления сезонности

В этом разделе мы рассмотрим использование разностного преобразования для устранения сезонности.

Сезонные колебания или сезонность - это циклы, которые регулярно повторяются с течением времени.

Повторяющиеся схемы в каждом году известны как сезонные колебания, хотя термин применяется в более общем смысле для повторяющихся моделей в течение любого фиксированного периода.

- Страница 6,Вводный временной ряд с R,

Есть много видов сезонности. Некоторые очевидные примеры включают в себя; время суток, ежедневно, еженедельно, ежемесячно, ежегодно и т. д. Таким образом, определение наличия сезонности в проблеме временных рядов является субъективным.

Самый простой подход к определению того, есть ли аспект сезонности, состоит в том, чтобы построить и просмотреть ваши данные, возможно, в разных масштабах и с добавлением линий тренда.

В приведенном ниже примере применяется функция diff () к надуманному сезонному набору данных. Набор данных включает в себя два цикла по 360 единиц каждый.

from math import sin
from math import radians
from matplotlib import pyplot

# create a differenced series
def difference(dataset, interval=1):
	diff = list()
	for i in range(interval, len(dataset)):
		value = dataset[i] - dataset[i - interval]
		diff.append(value)
	return diff

# invert differenced forecast
def inverse_difference(last_ob, value):
	return value + last_ob

# define a dataset with a linear trend
data = [sin(radians(i)) for i in range(360)] + [sin(radians(i)) for i in range(360)]
pyplot.plot(data)
pyplot.show()
# difference the dataset
diff = difference(data, 360)
pyplot.plot(diff)
pyplot.show()
# invert the difference
inverted = [inverse_difference(data[i], diff[i]) for i in range(len(diff))]
pyplot.plot(inverted)
pyplot.show()

При запуске примера сначала создается и выводится на график набор данных из двух циклов серии временных шагов 360.

Затем применяется разностное преобразование и выводится результат. На графике показаны 360 нулевых значений со всем удаленным сигналом сезонности.

В приведенном выше примере снятия тренда разность применялась с запаздыванием 1, что означает, что первое значение было принесено в жертву. Здесь для разницы используется весь цикл, то есть 360 временных шагов. В результате весь первый цикл приносится в жертву, чтобы отличить второй цикл.

Наконец, преобразование инвертируется, показывая второй цикл с восстановленной сезонностью.

Дальнейшее чтение

Резюме

В этом руководстве вы узнали о различии между стационарными и нестационарными временными рядами и о том, как использовать преобразование разностей для удаления трендов и сезонности в Python.

В частности, вы узнали:

  • Контраст между стационарным и нестационарным временным рядом и тем, как сделать ряд стационарным с разностным преобразованием.
  • Как применить разностное преобразование для удаления линейного тренда из серии.
  • Как применить разностное преобразование для удаления сезонного сигнала из серии.

У вас есть вопросы о том, чтобы сделать временные ряды стационарными?
Задайте свои вопросы в комментариях, и я сделаю все возможное, чтобы ответить.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map