Прогнозирование.

Все так делают. Никто так не поступает.

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

Данные

Я использую данные из NYC OpenData - в частности, все аресты, произведенные в течение 2020 года. Это было странное и трудное время для многих, в том числе для наших храбрых офицеров из полиции Нью-Йорка. Я подумал, что было бы интересно посмотреть, как пандемия повлияла на общую активность в области ареста, в дополнение к решению сложной задачи прогнозирования.

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

Подробности об источнике данных здесь

Процесс

1. Подготовка и визуализация данных

2. ARIMA

3. Глубокое обучение

Важно отметить, что большинство методов прогнозирования (ARIMA, SARIMA, STL) являются одномерными. Чтобы добавить дополнительную информацию (переменные) к моделированию, вам необходимо перейти непосредственно к подходу на основе нейронной сети.

Я добавил ссылку на github gist, так что вы можете запустить его самостоятельно.

Подготовка и визуализация данных

Мне нравится начинать прогноз с просмотра данных.

Эти данные безупречно чисты. Никаких подделок, никаких пропущенных значений. Отлично.

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

Здесь мы можем вывести несколько закономерностей, основываясь только на визуализации.

1. Существует определенная периодичность, это означает, что мы можем выделять стационарный сигнал каждые 7 дней, причем пик приходится на среду. Я не совсем понимаю, почему пик арестов приходится на среду.

2. Карантин Covid-19 снизил активность с 15.03, тем самым уменьшив количество арестов.

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

4. Резкий скачок произошел в результате протестов BLM и смерти Джорджа Флойда.

5. Активность арестов прекратилась - из-за вероятных изменений в политике задержания полиции Нью-Йорка в результате протестов.

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

Я также хочу проверить автокорреляцию на периодичность.

Да, я вижу 7-дневный паттерн на нашей автокорреляционной диаграмме.

ARIMA

ARIMA (авторегрессивная интегрированная скользящая средняя) должна быть отправной точкой любого проекта прогнозирования. В 8 случаях из 10 он даст вам нужный результат. Давайте использовать это в качестве «эталона» производительности.

Сначала я разделил данные на три периода

  1. Нормальный период, который представляет собой изоляцию до коронавируса.
  2. Период карантина, пост 3/15
  3. «Мрачный» период, последовавший сразу за протестами Джорджа Флойда.

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

Я использовал нестандартный метод ARIMA из statsmodels. Однако я создал собственный метод, который повторно обучает ариму новыми наблюдениями и создает новое предсказание [см. Код].

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

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

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

Глубокое обучение

Здесь я собираюсь применить однослойный и многослойный (сложенный) LSTM к проблеме обучения. Я не буду рассказывать об основах LSTM, но отсылаю вас к этой статье, которая весьма полезна.

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

Матрица: размер_пакета * размер_окна * n_features.

Связанное значение Y, прогнозируемое значение - это наш window_size + 1. В моем примере я использую window_size равный 3, поэтому по сути я создаю скользящее окно, которое содержит 3 наблюдения, а затем пытаюсь предсказать 4-е наблюдение. Кроме того, нам нужно минимально масштабировать данные, поэтому я создал функцию, которая преобразует наш одномерный массив в набор масштабированных X и Y и выполняет итерацию по любому набору [см. Код]

Собрав данные, я обучил две сети

  1. Однослойный LSTM «Vanilla» с плотным выходом (16 нейронов)

  1. Составной LSTM с Dropout и плотным выходом (32 нейрона в каждом)

Во время обучения я обнаружил лучшую производительность с составным LSTM.

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

Вот пример прогноза LSTM. Наша лучшая сеть произвела RMSE 7193,92

Резюме

В целом ARIMA дала лучшие результаты. Это типично при прогнозировании с использованием одномерных данных. Однако, когда вы включаете дополнительную информацию в прогноз или прогнозируете с большими данными, глубокие нейронные сети имеют тенденцию превосходить.

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

Надеюсь тебе понравилось!