Кодирование временных характеристик (Часть 1)
Как научить Deep Neural Networks (DNN) праздничным дням
При работе с реальными временными рядами рано или поздно мы сталкиваемся с праздничными днями, которые проявляются как аномалии в очень надежной схеме. Например, в сфере розничной торговли мы обычно наблюдаем очень сильную еженедельную сезонность. Но во время Пасхи эта закономерность нарушается главным образом потому, что магазины закрыты исключительно в Страстную пятницу и Пасхальный понедельник. При этом мы видим пик количества клиентов в Чистый четверг и в Пасхальную субботу. Кажется, покупатели запасаются самым необходимым к праздникам (см. сюжет розничного магазина в Швейцарии).
Как Data Scientist вы можете задаться вопросом, как вы можете научить Deep Neural Network (DNN) такому эффекту праздника. Поэтому неизбежно кодировать чистый calendar_dt во что-то, что DNN сможет легче переварить. В этом сообщении блога мы рассмотрим некоторые способы сделать это.
Наивный подход
Первый подход, который приходит мне на ум, и который действительно очень наивен, заключается в следующем: кодировать calendar_dt по соответствующему дню недели.
Ясно, что это позволяет DNN изучать недельный шаблон. Вы даже можете добавить месяц года для определенного calendar_dt. Это помогло бы натренировать более точное различие между днями и даже позволило бы DNN распознавать праздники, которые приходятся, скажем, на третий четверг данного месяца.
К сожалению, этот подход не будет успешным для других праздников, таких как Пасха, поскольку назначенная дата Пасхи каждый год сдвигается в течение определенного периода времени. Поэтому представьте, что наша DNN узнала на основе года, когда Пасха была в первую неделю апреля. Если мы применим такую модель, чтобы получить некоторые прогнозы на новый год, она снова покажет пасхальную модель в первую неделю апреля, тогда как в этом году Пасха может быть уже в марте.
Следовательно, нам нужен более сложный подход к таким гибким праздникам.
Относительная позиция между закрытыми днями
Давайте представим, что у нас есть некоторые данные по розничной торговле, которые показывают сильную недельную модель с низкими показателями в воскресенье из-за некоторых ограничений в часах работы (например, в Европе розничные магазины по-прежнему часто закрыты в воскресенье). В таком сценарии мы можем заменить наш наивный подход более изощренным методом.
Прежде всего, мы определяем все праздничные дни и все дни с ограниченным рабочим временем («воскресенье»). На втором этапе мы подсчитываем количество дней до следующего дня, соответственно. с последнего дня, ограничив часы работы. Эти два числа образуют двухмерный вектор, где каждая запись представляет собой расстояние до определенного окружающего закрытого дня (см. диаграмму выше).
Основное преимущество этого метода заключается в том, что наша DNN теперь может обнаруживать определенные закономерности вокруг государственных праздников, такие как пасхальная модель, которую мы видели выше. Более того, поскольку шаблон сам по себе довольно надежен для разных лет, сеть может применять его к невидимым данным, хотя конкретные calendar_dts не совпадают.
Стоит отметить, что преимущество, которое мы получили от наивного подхода, остается за этой системой. DNN по-прежнему может отличать дни недели друг от друга, как и в предыдущем подходе. Более того, в недели без государственных праздников одни и те же дни недели всегда кодируются одинаково. Таким образом, DNN способна изучать недельную сезонность.
Добавление закрытых периодов в качестве дополнительных параметров
Вполне вероятно, что перед несколькими последовательными закрытыми днями наблюдается другая картина, чем перед одним. К сожалению, описанный выше подход не соответствует этой реальности. Для иллюстрации: представьте себе праздник в понедельник. Если мы теперь применим вышеуказанное кодирование к предыдущей субботе, это будет выглядеть точно так же, как обычная суббота, хотя за этой субботой теперь следуют два последовательных закрытых дня, что может сильно повлиять на покупательское поведение. К сожалению, DNN, использующая указанную выше кодировку, не может идентифицировать этот шаблон.
Есть два основных способа справиться с этой проблемой. Либо мы улучшим наше кодирование calendar_dt, либо изменим тип модели на рекуррентную нейронную сеть (RNN), которая также учитывает окружающие даты. Поскольку второй подход выходит за рамки этой статьи, мы сосредоточимся на первом методе.
Мы уже видели, как кодировать calendar_dt в двумерный вектор. Добавив еще два измерения, мы также можем решить вышеуказанную проблему. Эти два измерения кодируют длину следующего закрытого периода, соответственно. последний закрытый период, аналогично тому, что мы сделали, когда мы закодировали calendar_dt в его относительное положение. Затем этот 4-мерный вектор позволяет нашей модели идентифицировать пики перед более длительным периодом последовательных закрытых дней.
Возможные дальнейшие улучшения
Мы видели, что интеллектуальное кодирование calendar_dt позволяет нашей DNN обнаруживать шаблон перед закрытым днем и, следовательно, соответствующим образом корректировать свои параметры. Это отлично работает для розничных магазинов с ограниченным временем работы в воскресенье. Но как быть с розничным магазином, который работает круглосуточно?
Применение нашего метода, описанного выше, приведет к кодировке мусора, в которой все значения бесконечны, потому что нет закрытых дней. Тем не менее, в воскресенье или Рождество может быть измеримый эффект, который наша DNN может определить, если мы правильно закодируем входные данные. Для этого мы смещаем акцент с часов работы магазинов на стандартные часы работы, действующие в конкретном районе/штате/стране. Затем мы применяем ту же 4-мерную кодировку входной даты. В качестве альтернативы можно даже комбинировать кодирование часов работы магазина с кодированием районов, если мы работаем с обоими типами магазинов одновременно. Это приведет к 8-мерному вектору.
Выводы
В розничной торговле государственные праздники, такие как Рождество или Национальный праздник, играют решающую роль в ожидаемом количестве покупателей. Однако для прогнозирования количества клиентов необходимо кодировать calendar_dt во что-то более удобоваримое для DNN. В этом посте мы обсудили различные возможности и, наконец, пришли к методу, который кодирует calendar_dt в 4-мерный вектор. Два из этих четырех измерений кодируют относительное положение входного calendar_dt относительно окружающих его закрытых дней. Затем два других измерения описывают продолжительность этих закрытых периодов.
Это кодирование позволяет DNN распознавать закономерности государственных праздников в предыдущих данных и применять их к новым прогнозам.