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



    Всем привет. Выходим на финишную прямую: сегодня финальная статья о том, какие ответы может дать 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) моделями можно было бы неплохие прогнозы сделать, но не такие качественные по сравнению с бустингом.

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

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

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

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

    github.com/Topspin26/sberbank-covid19-challenge

    Познакомиться с последними новостями data science по COVID от международного сообщества можно здесь: https://www.kaggle.com/tags/covid19. И, конечно, приглашаем в канал #coronavirus в opendatascience.slack.com (по приглашению от ods.ai).
    Центр Финансовых Технологий (ЦФТ)
    Большой. Сильный. Стабильный.

    Comments 4

      0

      Судя по картинкам 1,2,3, не проще ли применить обычное фитирование?

        0
        Регионов 85 штук, коэффициенты функций надо вычислять, я сам примерно так и делал, чтобы оценить параметры распространения во времени, а не просто распространение на неделю вперед. Это про некоторые сложности. С другой стороны, фитинг — это смысл машинного обучения. Фитится функция наиболее подходящая. Если делать «просто», прогноз будет хуже. В конкурсе «логарифмическая точность, т.е. точность в разах» (вернее MALE) прогноза на неделю была критерием победы. И нужно было постараться с фиттингом, чтобы победить (и забрать 300 000 руб.). Кстати, некоторые подозревают манипуляции с цифрами, когда предсказывать можно простым приростом («не более 10,000 в день, ± 500!»).
          +1

          как такой подход? на вскидку :)


          • фитируешь полиномом N-ой степени, или сплайнами, по всем 85 регионам
          • натравливаешь машинное обучение на результаты фитирования

          Я так понимаю задача стоит сложнее.
          Входными параметрами должны быть (на вскидку):


          • число инфицированных и время после заражения
          • число зарегистрированных
          • возрастная категория
          • плотность населения
            ++ множество других параметров влияющих на скорость заражения.

          Было бы неплохо подключить сюда уже имеющуюся мировую базу
          и модели, которые несомненно есть (сколько народу по всему миру над этим потеет)

            0
            Именно так и ставили задачу — подобрать такие данные и фиттинг, которые дают максимальную точность (как определил выше). В статье — отчет победителя, что зашло («доля городского населения + временной ряд») и какую функцию строил (деревья на градиентном бустинге).

      Only users with full accounts can post comments. Log in, please.