Data Science vs COVID-19_Часть 3

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

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!



Всем привет. Выходим на финишную прямую: сегодня финальная статья о том, какие ответы может дать data science о прогнозировании COVID-19.
Первая статья здесь. Вторая здесь.
Сегодня мы общаемся с Александром Желубенковым о его решениях по предсказанию распространения COVID-19.


Условия у нас следующие:
Дано: Колоссальные возможности data science, три талантливых специалиста.
Найти: Способы предсказать распространение COVID-19 на неделю вперёд.

И вот решение от Александра Желубенкова

— Александр, привет. Для начала расскажи немного о себе и своей работе.

— Я работаю в компании Lamoda руководителем группы анализа данных и машинного обучения. Мы занимаемся поисковым движком и алгоритмами ранжирования товаров в каталоге. Data Science меня заинтересовал, когда я учился в МГУ на факультете вычислительной математики и кибернетики.

— Знания и умения пригодились. Ты сделал качественную модель: достаточно простую, чтобы она была не переобученная. Расскажи, как удалось этого добиться?

— Задача прогнозирования временных рядов хорошо изучена, и какие к ней можно применять подходы — понятно. В нашей задаче достаточно маленькие по меркам машинного обучения выборки — несколько тысяч наблюдений в тренировочных данных и всего 560 предсказаний нужно делать для каждой недели (прогноз для 80 регионов на каждый день следующей недели). В таких случаях используют более грубые модели, которые неплохо проявляют себя на практике. По факту, у меня и получился в итоге аккуратно сделанный бейзлайн (baseline).

В качестве модели я использовал градиентный бустинг на деревьях. Можно заметить, что деревянные модели «из коробки» не умеют предсказывать тренды, но, если перейти к таргетам-приращениям, тогда спрогнозировать тренд станет возможным. Получается, нужно научить модель прогнозировать, на сколько вырастет количество заболевших относительно текущего дня в течение следующих Х дней, где Х от 1 до 7 — горизонт прогнозирования.

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

Были известны таймлайны для каждого региона: количество заболевших в каждый из дней в прошлом и буквально несколько качественных характеристик, таких как численность населения и доля городских жителей. По сути, это всё. На таких данных сложно переобучиться, если нормально сделать валидацию и определить, где в обучении бустинга стоит остановиться.

— Какую библиотеку градиентного бустинга ты использовал?

— Я по старинке — XGBoost. Знаю про LightGBM и CatBoost, но для такой задачи, мне кажется, выбор не столь важен.

— Окей. А вот всё-таки таргет. Что ты брал за таргет? Это логарифм отношений двух дней или логарифм абсолютного значения?

— В качестве таргета брал разность логарифмов количества заболевших. Например, если на сегодняшний день было 100 заболевших, а завтра стало 200 – то при прогнозе на один день вперед нужно научиться прогнозировать логарифм двукратного роста.

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


Прогнозы модели на третью, финальную неделю конкурса

— А обучающую выборку ты какую брал?

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

— Валидировался ты как?

— Валидировался по времени, как для временных рядов и принято делать. Для теста использовал две последние недели. Если прогнозируем последнюю неделю, то для обучения используем все данные до неё. Если прогнозируем предпоследнюю — то используем все данные, без последних двух недель.

— А использовал ты что-то ещё? Какие-то дни, 10-й или 20-й день, значения оттуда?

— Основные факторы, которые были важны — разные статистики: средние, медиана, приросты, которые были за последние N дней. Для каждого региона можно посчитать отдельно. Можно ещё отдельно рядом сложить такие же факторы, только посчитанные для всех регионов сразу.

— Вопрос про валидацию. Ты больше смотрел на стабильность или на точность? Что было критерием?

— Смотрел на среднее качество модели, которое получалось на двух последних неделях, выбранных для валидации. При добавлении некоторых факторов получалась такая картина, что при фиксированной конфигурации бустинга и варьировании только параметра random seed качество прогнозов могло сильно скакать – то есть большая получалась дисперсия. Чтобы не переобучиться и получить более стабильную модель, такие сомнительные факторы в финальной модели в итоге не использовал.

— А что тебе запомнилось? Удивило? Фича, которая заработала, или какой-нибудь трюк с бустингом?

— Два урока я извлёк. Первый: когда я решил поблендить две модели: линейную и бустинг, и при этом для каждого региона коэффициенты, с которыми брать эти две модели (они разные получались), настроить просто на последней неделе – то есть на семи днях. По факту, 1-2 коэффициента я настраивал для каждого региона на 7 днях. Но открытие было такое: прогноз получился существенно хуже относительно того, если бы я их этих настроек не делал. На некоторых регионах модель сильно переобучилась, и в итоге прогнозы в них получились плохими. На третьем этапе конкурса я решил так не делать.

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

— Ты говорил, что доля городского населения играла какую-то роль. А что ещё?

— Да, доля городского населения и для стран, и для регионов России всегда использовалась. Этот фактор стабильно давал небольшой буст к качеству прогнозов. В итоге кроме самого временного ряда я больше ничего в финальную модель не взял. Пробовал добавлять разное, но не работало.

— Твое мнение: SARIMA – это прошлый век?

— Модели авторегрессии – скользящего среднего – тяжелее настраивать, и в них более затратно добавлять дополнительные факторы, хотя, уверен, что и с (S)ARIMA(X) моделями можно было бы неплохие прогнозы сделать, но не такие качественные по сравнению с бустингом.

— А на более длительный период, чем неделя, можно прогнозы делать, как ты думаешь?

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

— Как ты думаешь, что будет дальше?

— Нужно модель перестраивать, смотреть. Кстати, моё решение можно найти здесь:

https://github.com/Topspin26/sberbank-covid19-challenge

Познакомиться с последними новостями data science по COVID от международного сообщества можно здесь: https://www.kaggle.com/tags/covid19. И, конечно, приглашаем в канал #coronavirus в opendatascience.slack.com (по приглашению от ods.ai)
Источник: https://habr.com/ru/company/cft/blog/546392/


Интересные статьи

Интересные статьи

Kotlin имеет много классных особенностей: null safety, smart casts, интерполяция строк и другие. Но одной из самых любимых разработчиками, по моим наблюдениям, являются data-классы. Нас...
Data Science требует использования статистических методов и алгоритмов машинного обучения для работы с большим объёмом данных, и для того чтобы делать это эффективно, вам потребуется мног...
Привет, Хабр! Давно я не писал никаких статей и, вот думаю, пришло время написать о там, как мне пригодились знания по data science, полученные по ходу обучения небезывестной специализ...
Устраивать конкурсы в инстаграме сейчас модно. И удобно. Инстаграм предоставляет достаточно обширный API, который позволяет делать практически всё, что может сделать обычный пользователь ручками.
В статье описаны необходимые параметры сервера для оптимальной работы сайта на платформе 1С-Битрикс.