В этом видео мы познакомимся с регрессионным подходом к прогнозированию и обсудим задачи, в которых использование именно этого подхода позволяет добиться существенного улучшения точности ваших прогнозов. Перед вами ежемесячные данные по потреблению электричества в Турции. На графике очень хорошо видна годовая сезонность, но видны на нем также и еще какие-то странные падения. Вот эти падения соответствуют месяцам, на которые выпадают праздники по исламскому календарю. Исламский календарь примерно на 11 дней короче григорианского. Поэтому праздники, которые по нему определяются, попадают все время в разные места стандартного григорианского года. Поэтому вот такие падения невозможно учесть с помощью стандартной сезонности с периодом 12. Это плохая новость. Хорошая заключается в том, что мы точно знаем всегда, на какой именно месяц в каждом году выпадет вот такого рода праздник. Поэтому мы можем сформировать бинарный признак, в котором единички будут соответствовать месяцам с праздниками, а нули — всем остальным. Вот такие признаки можно каким-то образом попытаться встроить в нашу модель типа ARIMA. Делается это следующим образом: мы считаем, что значение ряда y определяется линейной комбинацией каких-то признаков x, таких признаков будем брать k штук. То есть, фактически y задается в первую очередь линейной регрессией, но вот остатки этой линейной регрессии моделируются моделью ARIMA, которой мы все это время занимались. Такого рода модель, которая комбинирует линейную регрессию и ARIMA, называется regARIMA, или ARIMAX. Давайте разберем еще один пример, когда такого рода модель очень полезна. Это ситуации, когда вы имеете дело с рядами со сложной сезонностью. Например, если вы посмотрите на потребление электричества не по месяцам, а по дням, вы будете иметь дело с рядом, в котором есть, во-первых, недельная сезонность, во-вторых, годовая, ну и, наконец, опять те же самые праздники по исламскому календарю. К сожалению, ARIMA очень плохо работает с рядами со сложной сезонностью. Проблем здесь несколько. Во-первых, при длинных сезонных периодах в сезонных моделях ARIMA становится просто слишком много параметров, и часто по ряду невозможно их все оценить. Во-вторых, ARIMA явно задает значение ряда как функцию от значения этого же ряда, например, один сезонный период назад. Странно ожидать, что если вы имеете дело с дневным рядом, то его значение определяется ровно значением в эту же дату прошлого года. Скорее всего, просто значение ряда в какой-то окрестности текущей даты похоже на значение ряда в этой же самой окрестности этой даты в прошлом году. Наконец, еще одна, большая довольно проблема, заключается в том, что длина года не целая. Равна она, например, на 365 дням в точности, а 365,25. Если вы имеете дело с недельными данными, то длина года тоже не 52 недели ровно, а 52,18. И вот это уже проблема, с которой ARIMA работать не может совершенно никак, потому что в нашем ряде нет измерений с индексом 52,18, мы не можем это измерение поставить внутрь ARIMA. Решить эту проблему можно в рамках регрессионного подхода. Давайте для ARIMA оставим только самый короткий из всех имеющихся сезонных периодов, а все более длинные будем учитывать с помощью регрессии на специальным образом построенные признаки. Признаки эти вот такие: возьмем Фурье-гармоники, то есть синусы и косинусы с периодами, пропорциональными длине наших сезонных периодов, то есть, например, синусы и косинусы с периодами 365,25; 365,25/2 365,25/3 и так далее. Возьмем какое-то количество этих гармоник и просто подставим их как регрессионную компоненту в регрессионную ARIMA. Вообще говоря, можно придумать еще много вещей, которые можно подставлять в регрессионную компоненту. Можно брать вот эти самые гармоники по длинным периодам сезонности. Для коротких периодов сезонности можно брать индикаторы. Например, для дней недели можно в явном виде задать индикатор понедельника, индикатор вторника и так далее и просто в явном виде подставить их в регрессионную ARIMA и в явно недельную сезонность уже никак больше не учитывать. Кроме того, имеет смысл использовать индикаторы праздников. Часто также оказываются полезными индикаторы пред- и постпраздничных дней. В регрессионную компоненту можно добавить и тренды, которые мы пытались использовать в самом начале, когда только думали, а какими способами вообще можно прогнозировать временные ряды — линейный, квадратичный, какой угодно. Кроме того, в качестве регрессионных признаков можно использовать скользящие средние значения ряда за предыдущие периоды. Например, в каждой точке вы считаете среднее за прошлый месяц или прошлую неделю, и вот именно такие признаки подставляете в регрессионную ARIMA. Часто оказывается, что если вы взяли много хороших признаков, хорошо подумали и сделали на эти признаки регрессию, делать поверх этой регрессии ARIMA уже не нужно. Выигрыш в качестве за счет вот этой авторегрессионной добавки оказывается незначительным, практически незначимым. Я в своей практике сталкивался с этим достаточно часто. Кроме меня, об этом рассказывают, например, сотрудники «Фейсбука» на конференциях. Они внутри используют именно такую регрессионную систему прогнозирования своих показателей. Кроме того, именно такой регрессионный подход к прогнозированию используется, например, в майкрософтовской системе Azure. Никаких специфических методов прогнозирования временных рядов внутри нее нет. Специфические методы прогнозирования временных рядов хороши, когда у вас есть один, несколько или максимум несколько десятков любимых рядов, которые вы прогнозируете постоянно. На каждый из этих рядов вы можете посмотреть глазами, тщательно подобрать хорошую модель, проанализировать качество этой модели, посмотреть на остатки, перестроить и так далее. Вот это все ручной труд, и часто возможности для такого ручного труда нет. Например, нет ее в задаче массового прогнозирования. Представьте, что вам нужно спрогнозировать дневные продажи товаров в магазинах. У вас есть продажи, остатки этих товаров, цены на товары, информация о скидках, промоакциях, об иерархии товаров, иерархии расположения торговых точек, в которых эти товары продаются, и так далее. Ваша задача — это построить прогнозы продаж всех товаров во всех магазинах. Ясно, что таких временных рядов слишком много для того, чтобы их можно было спрогнозировать вручную. На помощь вам может прийти регрессионный подход. Если вы хорошенько сконструируете признаки, которые будут содержать всю имеющуюся у вас информацию, и используете на этих признаках какую-то регрессионную модель, далеко не обязательно линейную, может быть, более сложную, которая будет позволять признакам взаимодействовать друг с другом, то вы можете получить уже таким способом достаточно хорошее решение. Итак, в этом видео мы поговорили про регрессионный подход к прогнозированию временных рядов. Мы узнали, что в моделях класса ARIMA можно учитывать какие-то внешние факторы, на которые параллельно с тем, как строится модель ARIMA, делается регрессия. Кроме того, мы поговорили о том, что при хорошем подборе вот этих внешних факторов часто оказывается, что строить поверх этого авторегрессионную модель уже не нужно. Таким образом, мы свели задачу прогнозирования временного ряда к тому, что мы лучше всего умеем и любим решать — задачу обучения с учителем. Тем не менее, важно помнить две вещи. Во-первых, для того чтобы этот регрессионный подход работал, необходимо при конструировании признаков явно учитывать временную природу данных. Во-вторых, даже если вы построили какую-то достаточно хорошую обычную регрессионную модель, если у вас есть возможность, попробуйте поверх нее наложить авторегрессию или еще какую-то из моделей временных рядов, о которых мы в этом курсе не говорили. Возможно, это поможет вам улучшить качество ваших прогнозов.