Русский
Русский
English
Статистика
Реклама

Ods.ai

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

16.02.2021 16:13:42 | Автор: admin


Уже очевидно, что в 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
Подробнее..

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

27.02.2021 12:14:40 | Автор: admin


Всем привет. Мы продолжаем серию статей о том, какие ответы может дать data science о прогнозировании COVID-19. Первая статья здесь (ссылка). Сегодня поговорим о втором классе моделей по предсказанию динамики распространения COVID-19. Они основаны на предположениях о росте заболеваемости и описывают ситуацию в средне- и долгосрочной перспективе. Беседуем с Николаем Кобало, старшим инженером данных ЦФТ.


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

Переходим ко второму решению.

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

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

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

Как видим, эта модель не учитывает смертность от ковида. Подробности работы модели можно посмотреть у меня на гитхабе: https://github.com/rerf2010rerf/COVID-19-forecast/blob/master/public.ipynb

Модель называется SEIR и относится к семейству полигамных (англ. compartmental) моделей, описывающих распространение эпидемии. Модели этого семейства позволяют описывать различные типы инфекций. Например, такие, для которых вырабатывается (или, напротив, не вырабатывается) иммунитет. Или те, что имеют (или не имеют) инкубационный период. В случае с COVID-19 я воспользовался моделью с инкубационным периодом и вырабатывающимся иммунитетом у переболевших людей.

Все полигамные модели представляют собой системы дифференциальных уравнений первого порядка. Для SEIR они выглядят так:



Здесь:
S(t) (Susceptible) количество людей, подверженных заражению.
E(t) (Exposed) количество носителей, т.е. заражённых людей, у которых болезнь еще не проявилась из-за инкубационного периода.
I(t) (Infectious) инфицированные.
R(t) (Recovered) выздоровевшие.

N = S + E + I + R численность популяции. Она сохраняется постоянной, т.е. предполагается, что от болезни никто не умирает.
уровень естественной смертности.
величина, обратная инкубационному периоду заболевания.
величина, обратная среднему времени выздоровления.
коэффициент интенсивности контактов, приводящих к заражению.

Жизненный цикл индивида в SEIR модели выглядит так:



Здоровый, но ещё не переболевший человек (Susceptible) может заразиться от инфицированного (Infectious) человека. Вероятность, с которой здоровый человек заразится, описывается параметром .

Заразившийся человек переходит в состояние носителя инфекции (Exposed). Носители это люди, у которых заболевание ещё не проявилось, то есть у них протекает инкубационный период. Носители не могут никого заразить. Переход подверженных заболеванию людей в состояние носителей описывается двумя первыми уравнениями модели (посредством слагаемого (I/N)).

Через 1/ дней (инкубационный период) после заражения носитель переходит в состояние инфицированного (Infectious).

Через 1/ дней (время выздоровления) инфицированный переходит в состояние выздоровевшего (Recovered). У выздоровевшего человека вырабатывается иммунитет, и он больше не может заразиться этой инфекцией.

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

У тебя есть коэффициенты в модели. То есть ты делал какие-то предположения?

Одно из моих предположений заключалось в том, что естественной смертностью в популяции можно пренебречь, т.е. = 0. Это предположение кажется допустимым, так как мы хотим предсказывать распространение инфекции на коротком промежутке времени, всего несколько месяцев.

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

А это так, кстати?

Вроде как, да. Сейчас уже зафиксировано несколько повторных заражений, но чаще всего этого не происходит. Поэтому, можно сказать, что это так.

А что такое коэффициент интенсивности контакта у тебя?

Здесь я имею ввиду интенсивность, с которой люди контактируют друг с другом и заражаются. Грубо говоря, это вероятность того, что при встрече двух человек, где один заражён, а другой нет, второй в итоге заболеет.

Ну это сколько? Близко к единице?

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

Окей. А время выздоровления тоже у тебя есть? И альфа, и гамма?

Альфу я брал равной 1/5.1, это известный параметр был для COVID-19 (параметр, обратный инкубационному периоду в днях). А гамму я подбирал по данным. Это время выздоровления. Интенсивность контактов, кстати, тоже по данным.

Ну хорошо. Ещё раз тогда можешь рассказать, какие предположения делаются у моделей? Что каждое уравнение значит?

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

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

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

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

Звучит как описание развития ситуации.

На самом деле, есть разные модели. Это SEIR модель, а есть SIR, в которой нет подверженных заражению. Есть модели с бОльшим количеством параметров. Есть модель, в которой предусматривается смертность от заражения, но я её не стал использовать.

Где нашёл эту модель?

Погуглил. В Википедии есть статья. Нашёл дополнительно статьи.

Ты ещё графики представлял.

Этот график пример. Он не на основе реальных данных. Здесь просто показано, как ведёт себя модель. Она предсказывает, что все в итоге переболеют и выздоровеют.



Окей, значит, ты взял всё это, и что дальше?

Взял данные, которые есть по странам. Предположил, что смертность равна нулю. Переписал дифуры в форму конечных разностей:



В качестве оператора конечной разности в этом решении использована двусторонняя разность.
Количество выздоровевших людей R по дням есть в исходных данных, а количество инфицированных I равно количеству подтверждённых случаев минус количество выздоровевших. Так что из последнего уравнения можно найти с помощью оптимизации целевой функции MALE (R-I).



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

Это за день разности?

День минус предыдущий день. Я подставил данные и подсчитал неизвестные коэффициенты.

Бэта и гамма?

Альфу я принял 5,1 дня. Соответственно, надо было найти бэта и гамма интенсивность контактов и время выздоровления.

И что у тебя вышло?

Есть графики. Для каждого региона и каждой страны получалось своё. Я решал для каждой страны по отдельности. Слева график данных (чёрное было реально, красное заражённые и переболевшие, предсказанные моделью). Заражённые + переболевшие получается E+R. Справа график коэффициента бэта. Бэта, кстати, предполагается, что зависит от времени. Здесь самый большой скачок в совпадает со временем введения карантина 30 марта.



А это ты по данным посчитал или предположил так?

Это уже по данным посчитано. Это как раз результат обучения на Москве.

А временные пороги ты сам устанавливал?

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

Давай на страны посмотрим, допустим, Италия. Ну тут у тебя другая картинка



В Италии карантин, видимо, лучше сработал. И переболевших там больше. Модель подтвердила, что 9 марта был введён карантин.

Что ты выбрал для финального прогноза?

Для финального прогноза я выбрал константную интенсивность контактов и по двум последним точкам строил модель. То есть знаем всю предыдущую историю, но берём только последние точки.

Это для предсказания на неделю?

Да. А что до этого было это посмотреть, как модель себя ведёт. А дальше уже смотрел, какую функцию лучше брать и на скольких точках обучаться.

Наверное, если бы ты хотел спрогнозировать до сегодняшнего момента, ты бы другое решение получил. А у тебя есть что-то такое, что покажет, как дальше может ситуация развиваться?

Да. Но там не очень интересно. Предсказывала, что к сентябрю в Москве переболеют все.

На одном из митапов ты говорил, что по твоему прогнозу пик должен был быть в июле. По факту все произошло немного раньше. Как думаешь, что модель не учла?

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

Ну то есть ты говоришь, что всё можем регулировать одной бэтой?

По известным данным да, можем, бэтой и гаммой подогнать.

Твоя модель предсказывает очередную волну?

Нет, всё стабильно: растёт, растёт, растёт и все переболеют. Хотя есть ещё фактор сезонности. Осенние периоды, например, (когда грипп и т.п., иммунная система ослабляется). Но всё это модель не учитывает.

Какие можешь выделить плюсы и минусы своей модели?

На период составления модели было немного известных данных. Сейчас уже известны и период восстановления, и инкубационный период (тогда 5.1 был, сейчас более точно измерили). Из плюсов: она показывает сам процесс, как это протекает. И если исследовать более глубоко на примере других стран, например, Италии, Германии, как эти бэты влияли, то можно было бы для нас эту модель уточнить и построить более точный долгосрочный прогноз.

Похоже, в эпидемиологической модели data science это подбор коэффициентов по данным.

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

Однако для краткосрочного прогноза, похоже, нет альтернативы машинному обучению. В следующей статье мы побеседуем
Заголовок спойлера
с Александром Желубенковым: он сделал самую крутую модель ;)
Подробнее..

Категории

Последние комментарии

© 2006-2021, personeltest.ru