Достаточно своевременной проверки! «Прогулка назад» делает модели прогнозирования более точными и надежными

«Никогда не делайте прогнозов, особенно относительно будущего». (К. К. Штайнке)

  1. На этой картине изображена лошадь или машина?
  2. Насколько вероятно, что этот покупатель купит этот товар на следующей неделе?
  3. Не сможет ли этот человек выплатить ссуду в течение следующего года?
  4. Как это предложение переводится на испанский?

На эти вопросы можно ответить с помощью машинного обучения. Но - в то время как вопросы 1 и 4 касаются вещей, которые уже существуют (изображение, предложение), - вопросы 2 и 3 касаются будущих событий, а именно событий, которые еще не произошли. Это актуально? В самом деле.

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

С технической точки зрения это происходит из-за дрейфа понятий, очень интуитивного понятия: явления меняются с течением времени. Поскольку явление, которое мы хотим предвидеть, постоянно меняется, использование модели (основанной на прошлом) для прогнозирования будущего создает дополнительные проблемы.

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

  1. Своевременно: наиболее распространенный подход. По конструкции он сильно страдает от дрейфа концепций.
  2. Вперед: часто встречается в некоторых областях, например в финансах, но все же не так часто встречается в машинном обучении. Он преодолевает некоторые недостатки In-Time, но за счет введения других недостатков.
  3. Walk-Backward: новый подход, сочетающий в себе достоинства In-Time и Walk-Forward и смягчающий их недостатки. Я попробовал его на реальных, больших, беспорядочных данных, и он показал себя очень хорошо.

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

1-й подход: «вовремя»

Предположим, сегодня 1 октября 2020 года, и вы хотите спрогнозировать вероятность того, что клиенты вашей компании уйдут в следующий месяц (то есть с сегодняшнего дня по 31 октября).

Вот как эта проблема решается в большинстве проектов по науке о данных:

Примечание: информация, содержащаяся в X, может возвращаться во времени на неопределенное время (однако на всех рисунках - для визуальной интуиции - это всего 4 месяца назад).

Этот подход называется «вовремя», потому что все наборы данных (обучающие, проверочные и тестовые) берутся с одной и той же временной точки (в данном случае с сентября). Поездом, валидацией и тестовым набором мы намерены:

  • Набор поездов (X_train и y_train): данные, на которых модель будет обучаться .
  • Набор проверки (X_validation и y_validation): данные, используемые для ранней остановки. На этапе обучения на каждой итерации вычисляется эффективность проверки. Когда такие характеристики перестают улучшаться, это означает, что модель начала переобучаться, поэтому обучение прекращается.
  • Тестовый набор (X_test и y_test): данные никогда не использовались на этапе обучения. . Используется только для оценки того, как ваша модель будет работать в будущем.

Теперь, когда вы собрали данные, вы подобрали прогнозную модель (скажем, Xgboost) для набора поездов (сентябрь). Характеристики тестового набора следующие: точность 50% с отзывом 60%. Поскольку вы довольны таким результатом, вы решаете сообщить этот результат заинтересованным сторонам и сделать прогноз в октябре.

Через месяц вы идете и проверяете, как ваша модель действительно прошла в октябре. Кошмар. Точность 20% с отзывом 25%. Как такое возможно? Вы все сделали правильно. Вы подтвердили свою модель. Потом вы это протестировали. Почему производительность теста и наблюдаемая производительность так сильно различаются?

Выход из времени

Проблема в том, что дрейф концепций полностью игнорируется подходом In-Time. Фактически, эта гипотеза неявно выдвигается:

В этой структуре не имеет особого значения, когда модель обучается, потому что f (θ) предполагается постоянным во времени. К сожалению, в действительности происходит иное. Фактически, дрейф понятий заставляет f (θ) меняться с течением времени. В формуле это будет означать:

Чтобы учесть этот эффект, нам нужно переместить наше мышление из времени во времени.

2-й подход: «Иди вперед»

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

Эта конфигурация имеет то преимущество, что она имитирует реальное использование модели. Фактически, модель обучается t (август) и оценивается в t + 1 (сентябрь). . Таким образом, это хороший пример того, чего можно ожидать, тренируясь в сентябре и делая прогнозы в октябре.

Однако, когда я попробовал этот подход на реальных данных, я заметил, что он страдает некоторыми серьезными недостатками:

  1. Если вы используете модель, обученную в августе, для прогнозирования на октябрь, вы должны использовать модель, которой исполнилось 2 месяца! Поэтому производительность в октябре будет еще хуже, чем при использовании In-Time. Фактически это происходит потому, что последние данные «тратятся» на тестирование.
  2. В качестве альтернативы, если вы переобучаете модель в сентябре, вы снова попадете в In-Time. И, в конце концов, оценить ожидаемую производительность модели в октябре будет непросто. Так вы вернетесь к тому, с чего начали.

Подводя итог, мне понравилась идея выйти за рамки времени, но мне казалось, что Walk-Forward того не стоит.

3-й подход: «Идите назад»

Затем мне пришла в голову идея: может быть, дрейф концепций каким-то образом «постоянен» во времени? Другими словами, может ли быть так, что прогноз на месяц вперед или на месяц назад приводит в среднем к одинаковым результатам?

Если бы это было так, я бы убил двух зайцев (нет, подождите, трех) одним выстрелом. Фактически, я бы сохранил преимущества:

  1. использование последних данных для обучения (как в In-Time, но не в Walk-Forward);
  2. получение надежной оценки того, как модель будет работать в следующем месяце (как это происходит в Walk-Forward, но не в In-Time);
  3. обучение только одной модели (как это происходит в In-Time, но не в Walk-Forward).

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

Я назвал его «Walk-Backward», потому что он выполняет полную противоположность Walk-Forward: обучение проводится на основе последних данных, тогда как проверка и тестирование выполняются в предыдущих временных окнах.

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

Если вам нравится философия…

… Тогда есть философское объяснение того, почему «Ходить назад» имеет смысл. Давайте разберемся.

  1. Для каждого набора (поезд, проверка и тест) предпочтительно использовать другое окно прогноза. Это необходимо для того, чтобы данные проверки или тестовые данные не давали слишком оптимистичную оценку работы модели.
  2. Учитывая пункт 1., обучение модели в сентябре (t) - единственный разумный выбор. Это потому, что модель должна «изучать мир», максимально похожий на тот, который мы хотим предсказать. И мир сентября (t), вероятно, больше похож на мир октября (t + 1), чем любой другой прошлый месяц (t-1 , t-2,…).
  3. На данный момент у нас есть модель, обученная в сентябре, и мы хотели бы знать, как она будет работать в октябре. Какой месяц следует выбрать в качестве набора тестов? Август - оптимальный выбор. Фактически, мир августа (t-1) «так же отличается» от мира сентября (t), как мир октября (t + 1) из мира сентября (t). Это происходит по очень простой причине: октябрь и август одинаково удалены от сентября.
  4. Учитывая пункты 1, 2 и 3, использование июля (t-2) в качестве набора для проверки является единственным необходимым следствием.

Если вам не нравится философия…

… Тогда, может быть, ты любишь числа. В этом случае я могу вас успокоить: я пробовал этот подход на реальном примере использования, и по сравнению с In-Time и Walk-Forward, Walk-Backward получил:

  1. более высокая точность прогнозирования y_future;
  2. меньшая разница между производительностью на y_test и на y_future (т. е. точность, наблюдаемая в августе, является более надежной оценкой точность, которая будет фактически получена в октябре);
  3. меньшая разница между производительностью на y_train и на y_test (т. е. меньше переобучения).

По сути, все, что может попросить специалист по данным.

«Я все еще тебе не верю!»

Ничего страшного, я тоже скептик! Вот почему мы попробуем In-Time, Walk-Foward и Walk-Backward на некоторых данных и посмотрим, какой из них будет работать лучше всего.

Для этого мы будем использовать смоделированные данные. Моделирование данных - удобный способ воспроизвести дрейф концепции «в лаборатории» и сделать результаты воспроизводимыми. Таким образом, можно будет проверить, подтверждается ли превосходство Walk-Backward в более общих настройках.

Воспроизведение концептуального дрейфа в лаборатории

Возьмем 12 временных точек (ежемесячные данные с января 2020 года по декабрь 2020 года). Скажем, каждый месяц у 5 000 человек наблюдаются 50 особенностей. Это означает 12 фреймов данных (X_1,…, X_12), каждый из которых содержит 5000 строк и 50 столбцов. Для простоты столбцы генерируются из нормального распределения:

Как только X станет доступным, нам понадобится y (зависимая или целевая переменная). Для простоты y будет непрерывной переменной (но результаты могут быть легко распространены на случай, когда y дискретно).

Предполагается линейная связь между X и y:

β индексируются с помощью t, потому что параметры постоянно меняются с течением времени. Вот как мы учитываем дрейф концепций в нашей упрощенной версии мира.

В частности, β изменяются в соответствии с процессом ARMA. Это означает, что колебания β (i) не являются полностью случайными: они зависят от прошлых значений β (i) сам.

Коэффициенты ARMA (и ошибка) выбираются на основе консервативного предположения, что колебания от месяца к месяцу не так велики (обратите внимание, что более агрессивная гипотеза предпочла бы подходы вне времени). В частности, возьмем коэффициент AR равным -0,3, коэффициент MA 0,3 и стандартное отклонение ошибки 0,5. Это итоговые траектории для первых 6 (из 50) β с.

А вот как выглядят целевые переменные (y):

Результаты

Теперь, когда у нас есть данные, можно сравнить три подхода.

Поскольку это проблема регрессии (y - непрерывная переменная), в качестве показателя была выбрана средняя абсолютная ошибка (MAE).

Чтобы результаты были более надежными, каждый подход был выполнен во все временные точки (в режиме «скользящего окна»). Затем результаты были усреднены по всем временным точкам.

Вот результат:

Как правило, наиболее важным показателем качества прогнозной модели является производительность, наблюдаемая на y_future. С этой точки зрения Walk-Backward - лучший подход, поскольку он обеспечивает наилучшую MAE (3,98).

Но это еще не все. Взгляните на In-Time: MAE (test) в среднем составляет 2,91, а MAE (в будущем) - 4,20. Таким образом, в реальном варианте использования вы должны сообщить заинтересованным сторонам, что ожидаете, что ваша модель обеспечит MAE 2,91. Но реальная производительность, которую вы увидите через месяц, в среднем составляет 4,19. Это огромная разница (и огромное разочарование)!

Действительно, абсолютная разница между производительностью теста и будущей производительностью в среднем в три раза выше для In-Time, чем для Walk-Backward (1,28 против 0,43). Таким образом, Walk-Backward оказывается, безусловно, лучшим подходом (также) с этой точки зрения.

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

Результаты полностью воспроизводимы. Код Python доступен в этой записной книжке.

Все изображения созданы автором через matplotlib (для сюжетов) или codecogs (для латексных формул).

Спасибо за чтение! Надеюсь, этот пост был вам полезен.

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