Data science vs COVID-19_Часть 1



    Уже очевидно, что в 2021-м COVID-19 все еще будет оставаться, как говорится, на повестке дня. А значит, закономерно возникают вопросы: есть ли у нас инструменты для прогнозирования роста и снижения заболеваемости, можем ли мы предсказать развитие событий через неделю, месяц или даже год? Давайте разбираться.

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

    Решение:

    На самом деле решений будет три, следите за публикациями. А сегодня мы обсудим одно из них, с Владиславом Крамаренко. Он нашёл модель, способную построить самый точный прогноз* для всего мира на неделю вперёд.

    — Владислав, привет. Давай подробно обсудим то, что ты сделал: что получилось, над чем еще предстоит работать, какие были ошибки и как их можно учесть в будущем. Начнем с главного: расскажи, какой алгоритм машинного обучения ты использовал?

    — Остановился на градиентном бустинге. Сложность была в том, что градиентные бустинги бывают разные и дают разную картину. У меня показал лучший результат adaboost, а на втором месте был Catboost.

    — В смысле, ты попробовал разные, и adaboost лучше всего зашёл?

    — Да. Лучше всего показал себя adaboost, он давал самый умеренный прогноз. Если мы видели, что всё бурно растёт, значит, для алгоритма и дальше всё будет бурно расти, и другие бустинги куда-то в облака прогноз устремляли. А вот adaboost был самый консервативный.

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

    — Самая большая сложность в таких задачах – найти правильный способ обучения моделей, то есть сделать правильный выбор тренировочной и тестовой выборок. Если в качестве тестовой выборки взять 1 день и разбить все данные на тренировочные и тестовые, то получается, что мы предсказываем всего на 1 день. Это не сложно – нужно просто рандомно разбросать дни на тренировочные и тестовые, и 1 день можно будет предсказывать. Эту идею я сразу отбросил и предсказывал последнюю неделю: то есть последнюю неделю отсекал, остальные дни отдавал в тренировочные данные, и день за днём последней недели предсказывал честно, то есть брал для предсказания данные за неделю назад. Но и тут возникла сложность. Я сделал модель, которая идеально предсказывает вторую неделю, добавил кучу признаков, которые помогали в этом, но оказалось, что модель, которая очень хорошо предсказывает вторую неделю, очень плохо предсказывает третью. Начинаю думать, что, может быть, было бы проще поставить данные вручную и не использовать машинное обучение, и такая модель могла бы быть лучше.

    — Ты говоришь про то, чтобы посмотреть на количество глазами и линию провести дальше?

    — Проанализировать месячную статистику. Эти данные неплохо ложатся на какую-нибудь кривую. Вся эта статистика довольно странная, и не все заболевшие в неё попадают. Таким образом, статистика не отражает число заболевших. Я знаю, что некоторые ребята для такой задачи используют SEIR-модель (эпидемиологическую модель). Я тоже думал её использовать, но затем решил, что мы должны точно знать, сколько человек болеет, а мы не знаем. Эта модель привязана к тому, скольких заражает один человек, сколько человек болеет. Если мы эти данные не знаем, то с этим не получится работать. На мой взгляд, такая модель будет давать ошибочный прогноз.*

    *Мы разберём достоинства и недостатки SEIR-модели с Николаем Кобало в следующей статье

    Разумным мне кажется, что люди, которые этим занимаются, сначала должны всё сделать с помощью компьютера, а потом вручную отредактировать, исправить. Машина иногда выдаёт всякие глупости. Например, она видит, что в Китае долгое время не растёт количество заболевших, но при этом в других регионах также долгое время ничего не росло, а затем начался взрывной рост. И на основании этого машина «понимает», что то же самое нужно сделать и для Китая, у которого, вообще-то, уже плато. И начинает давать не 80к, а резко в миллион уходит. У меня такое было в одной из моделей.

    — А традиционные модели? Что ты о них думаешь? Анализы временного ряда, типа ARIMA?

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

    — Вопрос про деревья. Деревья же не экстраполируют. Как их заставить экстраполировать?

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

    — В качестве таргета в финальной модели ты брал логарифм отношения заболевших сегодня к заболевшим вчера?

    — Да. Я ещё пробовал соотношение дельт: «на сколько выросло за сегодня», поделить «на сколько выросло за вчера». Тоже неплохо работало. А вот «общее количество» и «прирост заболевших за день» работало плохо.

    — А что ты брал в качестве объясняющих переменных?

    — Я брал около 4-х предыдущих дней. Это работало. Брал информацию о численности населения, количестве курящих и т.п. Добавлял много разной статистики. А потом неделю потратил на то, чтобы посмотреть, какие факторы дают прирост, а какие — нет. Но ситуация слишком меняется, эти факторы оказались не устойчивыми, скорее случайными.

    — Что оказалось устойчивым, кроме предыдущих значений?

    — Самое важное, что повлияло — это количество дней с момента первого заболевания, десятого, сотого… Сначала я брал количество дней с первого заражённого, но подумал, что это не очень хорошо, так как часто первого заражённого быстро изолируют, и он не приводит к резкому росту. Поэтому, я стал брать 10 заражённых, а потом докинул до 100 и 1000 заражённых.

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

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

    Были разные проблемы, которые хотелось решить. Взять самоизоляцию, например. Я понял, что уровень самоизоляции влияет не на завтрашний день, а на дату через две недели. И не факт, что самоизоляция влияет на количество заболевших; может быть, наоборот – количество заболевших влияет на уровень самоизоляции.

    Кстати, проблемы и решения по оцениванию причинно-следственных связей подробно обсуждаются на треке Casual Inference in ML (https://ods.ai/tracks/causal-inference-in-ml-df2020/) – рекомендуем посмотреть в рамках ДатаФест 2020 – глобального события дата-саентистов, которое из-за COVID-19 прошло в формате треков, т.е. темы растянуты на несколько лекций и обсуждений, проходящих по отдельным дням.


    — Какой вывод ты бы сделал относительно моделей МО в общем, не применительно к этой задаче? Твое высказывание звучит так, что за моделями надо «присматривать»…

    — Есть задачи, которые компьютер решает намного лучше, чем человек. Например, прошлые соревнования в которых я участвовал — ЕГЭ по русскому языку. Моя модель решала эти задачи лучше, чем я. Но это обработка текстов…

    Почему в СПБ и МСК так много заболевших? Нас тестируют поголовно. Не скажу, что в других регионах так массово тестируют. Например, в статистику попало 100 человек. О чём это говорит? Три недели назад они заразились. В итоге мы предсказываем не количество заболевших, а какую-то другую цифру. И как эта цифра коррелирует с количеством заболевших — не очень понятно. Компьютер не может ничего нормально предсказать, если мы ему даём непонятно какие цифры.

    Кому интересно, вот моё решение: https://github.com/vlomme/sberbank-covid19-forecast-2020

    Итак мы поняли, что используя модель машинного обучения можно делать предсказания на неделю вперед на основе истории развития заболевания – когда было 10, 100, 1000 заболевших (сейчас, очевидно, такую модель нужно будет переучивать на последних данных).

    Мы упоминали эпидемиологическая модель. Её разобрал и применил Николай Кобало. На ее основе, кажется, можно понять, будет ли конец истории, скажем, к лету 2021.

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


    *в рамках конкурса «Forecast the Global Spread of COVID-19»
    Центр Финансовых Технологий (ЦФТ)
    Большой. Сильный. Стабильный.

    Comments 2

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