Как датасаентисты Сбербанка строили коронавирусную эпидмодель для России

Мировые проблемы, такие как пандемия коронавирусной инфекции, ставят перед исследователями интересные задачи. В их числе задача прогнозирования: как вирус будет распространяться через месяц или через год в том или ином регионе? Редакция «XX2 века» поговорила со Львом Тёминым, одним из разработчиков эпидмодели от ПАО «Сбербанк».

В Сбербанке давно взят курс на машинное обучение. Структура компании состоит из блоков, и при каждом блоке есть датасаентисты (от data science — наука о данных). Подразделение, в котором работает Лев, отдельное, и называется оно Офис главного датасаентиста (Office Chief Data Scientist). Его команда занимается большими и новыми проектами. Например, когда надо трансформировать кредитование и для этого придумать совершенно новую технологию, задачу на разработку получит именно оно. И здесь без машинного обучения никуда.

Помимо кредитования и прочих тем, характерных для финансовой отрасли, офис CDS занимается и разработкой коронавирусной эпидмодели для России. Казалось бы, зачем банку заниматься такими далёкими от него темами, как прогнозирование хода эпидемии? Банку нужны экономические прогнозы, то есть, данные о том, как поведёт себя экономика. Эти прогнозы покрывают весь спектр изменений, которые будут в ней происходить, от изменения курсов валют до динамики туристических предпочтений. Конечно, катастрофические сценарии вроде коронавирусной эпидемии не прогнозируются заранее (точнее, делается только общий катастрофический прогноз), но как только та или иная угроза становится осязаемой, специально выделенные люди немедленно принимаются прогнозировать её развитие.

У команды офиса Chief Data Scientist есть сайт, www.sberindex.ru, где представлены результаты их работы. Значимым продуктом их деятельности стал эпидемиологический симулятор, позволяющий загрузить в него особенности популяции и перемещения населения, и «подогнать» кривую развития эпидемии под фактически наблюдаемые значения, чтобы с помощью неё предсказать дальнейшее развитие ситуации.

***

XX2 ВЕК. Лев, расскажите, как создавалась ваша эпидмодель. Какие были сложности?

Лев Тёмин. Довольно популярная постановка задачи — это попробовать сравнить данные по странам или регионам, например, по Китаю и США, или по России и Европе, и с помощью дедукции попытаться вывести какие-то тренды. Но это неправильно. Прогнозировать кривую таким путём невозможно, так как страны не так просто сравнивать. Причина здесь в том, что коронавирусная статистика в большинстве случаев неконсистентна, то есть, несравнима сама с собой. Как это так — несравнима? Представим: вы пытаетесь подсчитать среднее количество мячей, которые забивают в футбольном матче. Для этого вы начинаете смотреть на статистику год за годом: 1900-ый, 1901-й и так далее. И дальше внезапно в 1950-м году в статистику добавляется ещё и американский футбол. Вы это можете понять, посмотрев на количество матчей: за один год было три матча, а на следующий стало сто. И тут к вам должно закрасться подозрение, что здесь что-то не так и продолжать считать среднее количество мячей по такой статистике нельзя. Это очень грубый, но легко обнаруживаемый изъян данных. Чаще всего ситуация не такая очевидная. Вот другой пример: новая метеовышка начала передавать метеоданные, но она установлена не по правилам. Все вышки специально ставятся в яме, а эта стоит прямо наверху горы. Если об этом не знать, то, исходя из различий посылаемых данных, можно подумать, что либо это место специфическое, либо вышка неисправна.

Точно так же, как метеоданные от вышки на горке нельзя сравнивать с данными от вышки в яме, нельзя сравнивать и эпидемиологическую статистику Китая до и после момента, когда начали ставить диагноз COVID-19 по клиническим симптомам вместо ПЦР-тестов. Также неверно будет сравнивать и данные по разным странам, так как, например, в Италии эпицентр эпидемии был расположен на севере, где специфическое, очень пожилое, население. Туда переселяется жить много пенсионеров из Италии и Европы. Соответственно и средний возраст умерших там был запредельный. Данные по заболеваниям и смертности по этому региону не могут вам рассказать об ожидаемой картине в РФ.

Кроме того, страны принимают разные меры, и нет никакой метрики, чтобы их описать и сравнить. Когда мы начинали работать с государственными органами, мы попробовали описать меры количественными характеристиками, но выяснилось, что они различаются по слишком большому количеству параметров, и эффективно сделать этого не удалось. Сейчас, постфактум, мы можем попытаться вывести какие-то «фичи» (жарг. от англ. feature, «черта», «особенность», численные показатели, которые можно использовать для моделирования) влияющие, например, на скорость распространения вируса. Тогда, в марте, когда всё только начиналось, мы этого сделать не могли.

Что это за фичи? Например, одна из возможных фич — сколько людей в среднем живёт в одной семье в данном регионе, или количество людей на улицах. Это более-менее простые характеристики. Другую фичу, «количество людей в общественном транспорте», уже гораздо сложнее измерить. Для этого понадобится много времени, и даже если мы её опишем, то мы всё равно не сможем априори сказать, как её изменения отразятся на ходе эпидемии. Понятно, что уменьшение использования общественного транспорта, как и увеличение расстояния между пассажирами, почти наверняка даст снижение заболеваемости в транспорте. Но как это повлияет на эпидемиологическую картину в целом — неизвестно.

Мы в Сбербанке решили, что воспользуемся другим способом прогнозирования — симуляционным подходом, который в данном случае обычно называется «построением эпидемиологического симулятора». Шаги построения модели были такие:

  1. Разделить интересующие нас регионы РФ на области, узнать количество дневных миграций между ними;
  2. Записать систему дифференциальных уравнений, сначала выбрав одну из доступных эпидмоделей;
  3. Выбрать окно симуляции (период, на основе которого подсчитывается каждый следующий день);
  4. С помощью градиентного спуска подобрать коэффициенты уравнений так, чтобы итоговая кривая моделирования совпадала в промежутке времени, которое прошло с начала эпидемии, со статистическими данными.

Мы использовали классическую SIR-модель с добавлением карантина. У нас вычисляется целый набор параметров: количество заболевших, выявленных, выздоровевших, умерших, а сравнивается с реальностью только количество выявленных (Q, от quarantined). Для простоты мы считали, что все больные посажены на карантин в домашних условиях или помещены в стационар. Параметры подбираются так, чтобы именно число выявленных совпадало с реальностью.

Математическая модель задаётся следующими уравнениями:

где:

S — подозреваемые на заражённость COVID-19
I — заражённые
Q — закарантиненные
R — выздоровевшие
N — общее число населения
β — коэффициент заразности
g — коэффициент выздоровления
q — доля заболевших, отправляемых на карантин
Ф — относительное время, проводимое вне области
in, in_infected — количество въехавших, и из них — инфицированных
out, out_infected — количество выехавших, и из них — инфицированных

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

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

Всё пространство, которое мы моделируем, РФ или Москву, мы делим на кусочки. Нам надо знать, как люди между ними мигрируют, для того, чтобы понимать, сколько среди них — заразных. Когда мы записываем диффуры для каждого отдельного района, в них есть входящий (in) и исходящий (out) поток людей, который считается для всех парных комбинаций районов в обе стороны, и in_infected и out_infected — количество въехавших и выехавших заражённых. По сравнению в другими симуляторами, нам страну пришлось очень сильно делить, так как неоднородность по ней очень большая, это связано с её размерами.

Возьмём один день симуляции, начнём «фиттить» (жарг. от англ. fit, «подгонять») кривые. Что это такое? У параметров β и q есть график зависимости от времени, и мы его стремимся получить такой, чтобы кривая прогнозирования совпадала с фактической статистикой выявленных на уже известных участках. Мы можем взять окно, чтобы в этом окне β было такое, чтобы кривые совпадали. Двигаем окно, и для каждого подбираем параметры с помощью процедуры градиентного спуска.

Мы пробовали брать разные окна симуляции. Изменения, произошедшие за день X, начинают давать эффект на день X+2+3 и до X+10. Соответственно, если сделать окно недостаточно большим, то может оказаться, что кривая не совпадает с реальными данными. Чем окно меньше, тем ваши показатели сильнее дрожат, а это очень плохо. Желательно, чтобы кривые были достаточно гладкими. В данном случае лучше всего подошли варианты от недели до двух. Больше двух недель симулировать оказалось вычислительно сложно, а меньше недели — не хватало точности прогноза.

У нас в системе диффуров очень много параметров, и может возникнуть проблема оверпараметризации, когда будут ошибочно выбираться кривые параметров, которые нам не подходят, так как могут быть разные комбинации поведения кривых, дающие разные локальные минимумы в процедуре градиентного спуска. Чтобы выбрать «правильные» кривые параметров, на этом многообразии можно вводить вторичную функцию регуляризации, желательно выпуклую и с одним минимумом. (Регуляризация в простом случае — это дополнительное слагаемое в функции потерь, которое увеличивает функцию потерь при очень больших прараметрах — тех или иных весах сети, параметрах регрессии). Проще говоря, это система штрафов. Типичный штраф — по сумме модулей параметров, которая не должна быть выше определённого значения. В нашем случае мы также штрафовали за резкие изменения в графике β и q, а также за большие изменения в географической динамике, так как маловероятно, что в соседних районах эффективные показатели распространения различаются в разы.

Выше мы говорили про входящие и исходящие потоки миграции для каждого региона. Они обуславливают рандом внутри диффуров. Возникает множество разных вариантов «хвостов» кривой, выявленных из-за того, что мы учитываем перемещение людей, и из-за того, что у нас есть неопределённость в вопросе, сколько больных людей выезжает из региона в соседние. Представьте себе, вы моделируете количество заражённых на следующий день, и есть две полярные ситуации. Скажем, у вас из региона выезжает на работу 10%, и заражено в нём 3% населения. Первая ситуация — когда в эти 10% никто из 3% не попал и на количество заражённых в соседнем регионе миграция никак не повлияла. А вторая ситуация — когда все эти 3% поехали на работу в соседний регион. Получится совершенно другая картина! Именно по той причине, что уравнения не являются детерминированными, для каждого дня делается целый набор «хвостов». Всё происходит так: вы взяли дату, определили окно и параметры на старте, начали их подкручивать и пытаться попасть в хвост. А дальше вы распускаете пачку траекторий и говорите, что в наблюдаемых хвост должен совпадать со средним симулированным хвостом между этими траекториями.

На первых этапах работы как исследовательский инструмент мы использовали симулятор Gleam. Он позволяет сделать визуализацию модели, чтобы всё было наглядно. Это его главная функция, но не всё, что он умеет. Gleam также позволяет придумать систему статусов с помощью визуального интерфейса и отобразить её в граф. По сути, он позволяет написать систему диффуров, и дальше вам нужно самостоятельно руками вставить коэффициенты, в том числе зависящие от времени или локации, и дальше запустить симуляцию. Разработчики этого инструмента не занимались задачей «фиттинга» кривой. Мы быстро выяснили, что подбирать кривую в Gleam’е приходится вручную, а это не очень удобно (а точнее совершенно невозможно), и мы стали разрабатывать и успешно разработали свой собственный симулятор.

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

Будет ли в той или иной стране аврал?

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

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

Допустим, человек выявлен в момент времени Т_0. Можно оценить, с какой вероятностью он выздоровеет к дате T_0 + Х. Подсчитаем эти вероятности для каждого Х в достаточно большом диапазоне. Форма вероятностного распределения нам известна из медицинских работ — это гамма-распределение, и она совпадает для разных стран, так как связана с тем, как человеческий организм реагирует на вирус. Можно взять выявленных, скажем, в дату 01.04 и умножить это количество на наше распределение. Таким образом мы поймём, сколько из людей, выявленных 01.04, выздоровеют в каждую дату, следующую за 01.04. С помощью такой процедуры мы из кривой фактической статистики можем построить два прогноза — выздоровевших и умерших.

На рис. 1 синяя кривая — это фактическая статистика. Из неё должна получиться фиолетовая пунктирная кривая — прогноз количества выздоровевших. Фиолетовую кривую далее мы фиттим с красной (фактическое количество выздоровевших), подбирая параметры гамма-распределения. Зная эти параметры, мы можем дальше делать прогноз выздоровевших по кривой прогноза заболевших. Ту же самую процедуру можно провернуть и с умершими.

Рис. 1. Синяя кривая — количество заболевших с вычетом шума и недельной осцилляции, фиолетовая пунктирная — прогноз выздоровевших, красная — фактическое количество выздоровевших, зелёная пунктирная — прогнозируемое количество умерших, жёлтая — фактическое количество умерших.

Когда у нас есть эти две модели, можно посмотреть, случится ли в системе здравоохранения аврал. У нас есть прогноз заболевших (наша первая модель), и модель, которая превращает эту кривую в кривые выздоровления и смертности. Из этого несложно подсчитать загруженность больниц, и затем, сравнив её с объёмом коечного фонда (горизонтальная прямая на графиках ниже), выяснить, будет ли пересечение, и если да, то когда оно наступит.

Рис. 2. Здесь жёлтая прямая — это ёмкость больничного фонда, а синяя кривая — количество человек, нуждающихся в больничной койке, в зависимости от дня. Когда эти кривые пересекаются, наступает аврал. Слева здесь график для слабых мер и отсутствия прироста больничного фонда, посередине — при мерах средней интенсивности и создании небольшого количества дополнительных больничных мощностей, и справа — сильные меры и значительный прирост мощностей.

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

Рис.3. По оси абсцисс — среднее время до смерти, по оси ординат — среднее время до выздоровления (в днях). Видно, что Япония долго держит человека и до выздоровления, и до смерти. А в Индонезии люди умирают быстро, а выздоравливают очень долго. Такая ситуация способна привести к коллапсу медицинской системы, так как всех, кто не умирает, держат в больнице и не выписывают, а это очень большая нагрузка на медицинскую систему. А Германия и Австрия — это страны, в которых быстро выписывают из больницы, а тех, кто на пути к смерти, долго поддерживают (и, возможно, спасают тех, кого ещё можно спасти). Модель хорошо выбирает кандидатов на плохой сценарий.

Как ещё можно сравнивать страны?

На рис. 4, на верхних графиках, — кривые фактического числа заболевших в день. Можно эти исходные кривые разбить на три другие кривые, которые, если умножить их друг на друга, дадут исходную кривую. Эти три кривые — это основной тренд (вторые графики сверху), дневная осцилляция (третьи) и паттерн шума (четвёртые). Эти графики между собой можно сравнивать по диапазону осцилляции. Например, у Штатов первые 4 дня в неделю меньше заболевших, последние 2 дня больше. Это связано с тем, как работают больницы: как работает система регистрации, доставки больных и т.д. Можно сравнивать и шум — он нам тоже может о чём-то рассказать. По идее, на него ничего не должно влиять, так как он зависит от степени случайности процесса сбора данных. Но и здесь есть некоторые тенденции, на которые можно списать шум. Например, если 10 врачей в течение 3 дней будут принимать решение относительно того, считать ли человека больным COVID-19, то у части из подозреваемых за эти три дня могут появиться сопли, которые не свойственны для коронавирусной пневмонии, другая часть может вообще выздороветь, и останутся лишь случаи, которые почти точно идентифицированы. В таком случае дисперсия шума будет меньше, чем если диагноз ставить в первый же день.

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

XX2 ВЕК. А ваш симулятор применим к другим заболеваниям или он работает только с COVID-19?

Л. Тёмин Я не тестировал, но думаю, что да, работает. Причём применения могут быть очень нетривиальные. Например, новости в сети расходятся очень похожим образом. Есть группы людей — сообщества, внутри которых плотные социальные связи. Между сообществами тоже есть связи, и т.д. И можно попробовать применить нашу модель для исследования распространения новостей. Только это потребует перенастройки диффуров. И может так случиться, что настройка диффуров будет нетривиальной. Например, если бы я не знал, что у COVID’a есть стадия, когда симптомы ещё не проявились, но вы уже заразны, то я не смог бы правильно написать диффуры, и результат подбора был бы хуже, если вообще бы сошёлся.

Александра «Renoire» Алексеева :