Прогноз из черного ящика: применяем машинное обучение к предсказанию пандемии COVID-19

В апреле «Сбербанк» вместе с сообществом Open Data Science проводил конкурс, участники которого состязались в точности алгоритмических прогнозов изменения числа заболевших COVID-19 за неделю для разных стран и городов. Владислав Крамаренко, сделавший лучшее публичное решение для конкурса (посмотреть его можно тут), рассказал нам о том, что может и чего не может сказать алгоритм о будущем.

Эпидемии моделируют при помощи модели SIR (от Susceptible, Infected, Recovered — то есть восприимчивых, зараженных, выздоровевших) и ее вариаций: SEIR (которая делит жертв болезни на «контактных» и зараженных людей), SIRS (которая учитывает «срок годности» иммунитета переболевших) и других. Они отличаются в основном тем, каким типам инфекций лучше подходят.

Такое моделирование можно назвать моделированием «из первых принципов» — вы определяете, с какими факторами имеете дело, определяете законы, которым эти факторы подчиняются, подбираете коэффициенты и получаете инструмент для прогноза.

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

Мы не знаем, например, какой точно у COVID-19 базовый коэффициент воспроизведения (R0) — скольких человек заражает один больной. А этот параметр для модели ключевой. Есть те, кто считает что R0 у коронавируса равен четырем, есть те, кто считает, что двум — но отклонение на единицу приводит к тому, что полученные графики очень сильно отличаются.

Можно заниматься подгонкой этих цифр, конечно, и этим много кто занимается, но ценность подобного — особенно на короткой дистанции, типа недели — сомнительна. Тот же самый базовый коэффициент воспроизведения это не абсолютная метрика, на нее влияет множество внешних причин. Где-то вводят карантин, и коэффициент должен упасть, но насколько — сказать нельзя: в разных странах это происходит по-разному, поэтому однозначно эффект карантина оценить невозможно. Кроме того, нам неизвестно точное число заболевших (это сильно завязано, в частности, на количество тестов), неизвестно количество бессимптомных носителей, и так далее. А все это тоже влияет на то, что предсказывает модель.

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

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

Я взял данные, которые собрали на платформе kaggle в рамках инициативы CORD-19 (COVID-19 Open Research Dataset), запущенной в марте правительством США: там есть уже размеченные данные о населении стран, площади, степени урбанизации, проценте пожилых людей, количестве курящих, данные Всемирного банка об уровне медицины: количестве врачей, медсестер, трат государства на медицину, числе тестов на коронавирус в день. Часть данных предоставили организаторы. Также помогла информация о мобильности людей от Google и уровне самоизоляции от Яндекса. Информация о числе новых случаев в России бралась с сайта Роспотребнадзора.

Затем все эти параметры по странам, вместе с данными по изменению числа заболевших за несколько дней, «скармливались» разным алгоритмам. Самыми значимыми параметрами оказались число дней с первого (десятого, сотого, тысячного) зараженного, а также изменение числа зараженных за прошлый день.

Эффективнее всего сработала модель градиентного бустинга над решающими деревьями. Она на каждом шаге оценивает данные за выбранный день в конкретном регионе (стране, области или городе) — население, площадь, урбанизацию и изменение числа зараженных за прошлый день — по какому-то параметру, чтобы в конце прийти в вершину, наиболее подходящую данным. В этой вершине может содержаться, например, количество новых случаев, обнаруженных в этот день, или процент прироста. Например, сначала модель может посмотреть, был ли введен карантин в стране. Если да, модель идет по первой ветви, если нет, то по второй. Далее спросит, прошло ли больше 30 дней после первого зараженного, и опять происходит разветвление, и так далее. Порядок этих вопросов она определяет сама, пытаясь на каждом шаге уменьшить энтропию. 

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

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

А так — то если, например, увеличить горизонт модели с недели до года, она скорее всего просто продолжит предсказывать увеличение числа зараженных, может наверняка и за пределы населения уйти. Там никакого потолка нет, она же не знает, что ряд, который она продолжает, это число зараженных людей в популяции, которая конечна. 

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

Все прогнозы по регионам России можно посмотреть тут.

Подготовил Сергей Кузнецов