В этой статье представлена ​​реализация онлайн-алгоритма фильтра Калмана в реальном времени для прогнозирования распространения COVID-19 по заданному региону.

Коронавирус (COVID-19) недавно вызвал серьезную озабоченность во всем мире.
Поскольку число случаев коронавируса, как сообщается, увеличивается, распространение COVID-19 представляет собой серьезную угрозу для здоровья людей во всем мире. В этой работе мы постараемся спрогнозировать распространение коронавируса для каждого из зараженных регионов. Подбор анализа временных рядов и статистических алгоритмов для получения наилучших краткосрочных и долгосрочных прогнозов. Адаптивный онлайн-фильтр Калмана дает нам очень хороший прогноз на один день для каждого региона.

Для начала давайте кратко сравним COVID-19 с более старым смертельным вирусом - Эболой. Эбола - не новое заболевание (первые случаи были выявлены в 1976 году), но в 2014 и 2018 годах она снова вспыхнула до наших дней.
* Летальность от EBOV намного выше и может достигать 75% случаев смерти по сравнению с ~ 3,9% случаев смерти от COVID-19. Следует отметить, что COVID-19 является продолжающимся заболеванием, поэтому уровень смертности не окончательный и, скорее всего, будет расти.
* Очевидно, что регионы и страны различаются, где EBOV наносит вред в основном в Африке, а COVID-19 в Китае и Азия.
* Вероятнее всего, COVID-19 будет распространяться в холодную погоду, а EBOV - в теплую погоду.
* Тенденция извержения у этих двух заболеваний очень схожа, обе болезни быстро проявили мощное извержение.

Чтобы предсказать распространение коронавируса, я применил алгоритм фильтра Калмана наряду с другими линейными моделями. Проблема оптимизации была решена с помощью Python, при этом скрипт доступен в записной книжке Google Colab. процесс этого проекта описан ниже, полный код можно найти на Github здесь.

Предварительная обработка данных:
* Прочтите данные с Github, содержащие ежедневные общие случаи подтвержденных, смертельных и выздоровевших для каждого местоположения, следуя данным Всемирной организации здравоохранения.
* Регион исправления. назовите и объедините страну и провинцию в один столбец «регион». Затем удалите некоторые неправильные символы в наборе данных.

Получить данные о населении:
Я использовал пакет python qwikidata, который извлекает данные о населении из Википедии на основе координат региона (долгота, широта). Мы будем использовать эти данные, чтобы оценить уровень заражения в каждой области и протестировать его на модели.

Создание временных рядов и графиков
Сценарий позволяет нам создавать визуальный график для каждого региона, чтобы получить первоначальное представление о данных. Подавляющее большинство всех случаев приходится на провинцию Хубэй, Китай (82%), поэтому были извлечены разные графики.
Ниже приведены верхние области ежедневных общих случаев.
Подтверждено :

Мы можем видеть четкую тенденцию извержения в провинции Хубэй с исключительным днем ​​13.02.20 прыжка в высоту. В тот день произошли изменения в методе подсчета, которые позже повлияют на модель. Мы не можем проверить лояльность данных, но предполагаем, что данные надежны.
В других основных областях тенденция кажется иной и менее резкой. Круизный лайнер Diamond Princess кажется исключительным с резкой тенденцией с середины февраля. (розовая линия)

Смерть:
* Случаи смерти в основном зарегистрированы в провинции Хубэй, их число превышает 2000. После этого Хэнань с 19 баллами.
* Уровень смертности в провинции Хубэй составляет 2,1978%, а в провинции Хэнань - 1,5055%. По остальным направлениям цифры слишком малы.

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

Подбор модели прогнозирования, фаза 1 - прогноз на один день, фильтр Калмана

Я реализовал алгоритм фильтра Калмана, который соответствовал задаче и генерировал прогноз на 1 день вперед для каждого случая: подтвержденный, смерть, выздоровление; для каждого региона.
Фильтр Калмана - это рекурсивный алгоритм, который использует измерения временных рядов с течением времени, содержит статистический шум и производит оценки неизвестных переменных.
Я построил алгоритм онлайн-реального времени. Этот алгоритм является адаптивным, что означает, что ему не нужно много исторических / обучающих данных. Каждый день алгоритм обновляется новым наблюдением, после того как оценка сделана, он может генерировать прогнозы на следующий день.
Фильтр Калмана показывает очень хорошие результаты, предсказывая наблюдения на следующий день. Он отслеживает тенденцию каждого региона отдельно, быстро адаптирует ряд и генерирует прогноз.
Оценить модель легко, поскольку нам не нужны наборы для обучения и тестирования. Никакого переоснащения или предвзятости - это онлайн-алгоритм.

Реализация:
Я написал сценарий R для реализации онлайн-алгоритма Калмана, а затем использовал пакет Python rpy2, который позволяет нам комбинировать сценарий R внутри записной книжки Python и передавать переменные результата.
После непродолжительной инициализации алгоритм начинает отслеживать ряды и производить прогноз на 1 день вперед для каждого региона. Он работает во всех возможных регионах.

Результаты и оценка:
Для оценки результатов я добавил несколько основных параметров оценки ошибок для каждой области: MSE - среднеквадратичная ошибка, RMSE - среднеквадратичная ошибка, MAE - средняя абсолютная ошибка. .
Я сравнил их с другими методами, чтобы оптимизировать модели и найти лучший.
Модель также можно оценить с помощью графиков и таблиц, как показано ниже.
Скрипт позволяет выбирать регионы и получать подходящий сюжет и прогнозы. Он выполнялся итеративно для каждого региона. Ниже приведены несколько примеров:

A. Пекин: оранжевая линия - это прогноз Калмана, синяя линия - реальные подтвержденные случаи - как уже упоминалось, это не предвзятый прогноз, он суммирует предыдущие онлайн-прогнозы. .
Видно почти идеальное совпадение:

В таблице ниже показано, насколько близки прогнозы к фактическим значениям.
Например, 19.02.20 Калман прогнозирует 394 случая, из них 7 новых подтвержденных случаев, тогда как их было 6.
На завтра (20.02.20) Кальман прогнозирует 5 новых подтвержденных случаев в Пекине.

Б. Хубэй подтвердил случаи - здесь мы видим почти идеальный прогноз до 13.02.20, затем, поскольку скачок данных был упомянут выше, модель имела большую ошибку. Но он быстро адаптируется и через несколько дней получит более точные прогнозы.

На графике ниже показан высокий уровень предсказания смертей в провинции Хубэй:

В таблице ниже представлены прогнозы и фактическая смерть в цифрах в провинции Хубэй.
Например, 18 февраля Калман предсказал еще 140 смертей, а в конечном итоге их было 132.
19 февраля Калман предсказал еще 129 смертей, а в конечном итоге их было 108.
На завтра (20 февраля) Калман предсказывает еще одно. 132 новых случая смерти. Прогнозы очень близки к реальным значениям.

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

C. Шанхай подтвердил прогноз. Здесь также отличные ежедневные прогнозы, очень близкие к реальным значениям.

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

Прогноз Хэнань восстановлен:

19.02.20 Калман предсказывает 56 новых выздоровевших случаев, из которых в конечном итоге было 51.
Завтра он предсказывает еще 48 новых выздоровевших случаев.
Как и в провинции Хубэй, мы можем увидеть хорошую тенденцию выздоровления случаев в последнее время и хорошую адаптация алгоритма.

E. Еще один интересный регион - это хорошо известный круизный лайнер Diamond Princess недалеко от Японии.
Поведение этой серии полностью отличается от других регионов, и, тем не менее, предсказание Калмана оправдывается. хорошая работа. В начале февраля на корабле произошло извержение заболевших, затем оно резко возросло.
Калман прогнозирует еще 46 новых случаев на завтра (20.02.2020).

Подбор модели прогнозирования, этап 2 - распространение и новые случаи во времени

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

Создание наборов данных
Наборы данных для линейных моделей содержат различную структуру, где:
* Каждая строка представляет день и регион.
* Каждый столбец представляет функцию / переменную, где целевая переменная - количество подтвержденных случаев / смертей / выздоровевших.

Разработка функций:
Данные о погоде:
Я использовал пакет python pyweatherbit для извлечения исторических и прогнозных данных о погоде по координатам региона (долгота, широта). Для этого пакета требуется ключ API, который ограничен 500 вызовами в день, поэтому я запускаю его в течение нескольких дней, а затем сохраняю данные в файлах CSV (w.csv и w_forecast.csv), чтобы объединить их с данными Github.
Я извлек минимальную и максимальную температуру для каждого дня и места. (прогноз ограничен 14 днями, на более длительный период я ​​сделал прогноз температуры лайнера).

В таблице ниже показана средняя температура в наиболее зараженных областях (с 22.01.20 по 17.02.20).
Мы видим, что в большинстве областей (кроме Гуандуна) бывает довольно холодная погода с максимальным средним максимумом не более 12–13 градусов и менее 5 минимум.

Данные о зараженных территориях:
Я использовал данные о населении и ежедневное общее количество подтвержденных случаев, чтобы рассчитать уровень заражения в каждой зоне каждый день в процентах. Эта функция будет важна в окончательной модели.

Список функций:
Функции, которые были протестированы в модели:
1. Мин.-макс. температура.
2. Частота заражения по регионам.
3 . Итого за последний день.
4. Изменение за последние X дней (x = 1,3,7).
5. Скорость изменения за последние X дней.
6. Прогноз Калмана.
7. Регион.
8. Население.
9. Подтверждено / смерть / выздоровление - целевая переменная.

Матрица корреляции:
На графике ниже мы можем видеть матрицу корреляции между переменными.
* Как и ожидалось, изменения / скорость за X дней коррелированы между ними. (все функции, зависящие от времени)
* Переменные Калмана и переменные, зависящие от времени, коррелированы с целью.
* Скорость заражения также имеет относительно высокую корреляцию с целью.
* Мин-макс. температура имеет очень низкую корреляцию с целью. (но это не значит, что они бесполезны).

Важность функции
Я использовал пакет python H20 и запустил отдельную модель для региона Хубэй.
В приведенных ниже результатах показаны наиболее важные функции:
Прогноз Калмана важен, пока другие функции, зависящие от времени.
Зараженная скорость является важной характеристикой и будет использоваться в окончательной модели.

Окончательная модель
Обычно при обучении моделей машинного обучения нам нужно разделить наши данные на набор для обучения / тестирования (от ~ 75% до ~ 25%).
Поскольку мы имеем дело с зависимыми от времени для нестационарных рядов этот метод не подходит.
Я решил эту проблему, имитируя итеративную «онлайн» систему, которая тренирует модель каждый день и предсказывает следующий день.
Тогда вместо Получив обратную связь с реальным значением, я обновил следующее значение метки времени, добавив последний прогноз плюс некоторый расчетный шум, и снова прогнозирую.
Каждый день обновляются все функции (Калман, уровень заражения, прогноз погоды и последний Расчет X дней).
После оценки нескольких моделей я выбрал простую модель линейной регрессии с использованием пакета python sklearn.

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

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

Смерть - согласно прогнозу, 3100 человек умрут от COVID-19 в следующем месяце в провинции Хубэй. На сегодняшний день в провинции Хубэй (19.02.20) погибло 2156 человек.

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

Основные области:
* Мы видим, что во многих регионах прогноз на следующий месяц почти не показывает разброса. Все нижние линии и линии, где градиент графика не меняется.

* Основываясь на этом прогнозе, массивное извержение прошло, и тенденция показывает все меньше и меньше подтвержденных случаев даже в таких топовых регионах, как Чжэцзян, Хэнань, Аньхой. , Гуандун (4 верхние строки диаграммы).

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

Смерть. Согласно прогнозам, в большинстве регионов мы не увидим увеличения случаев смерти. Главный обеспокоенный регион - Хэнань с предсказанием почти 40 смертей в следующем месяце (сегодня их 19).

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

Тепловая карта:
Чтобы представить еще одну визуализацию прогноза, я использовал пакет Python 'gmplot', чтобы показать прогнозы на картах Google.
На карте показана горячая точка с высоким уровнем зараженности локации на основе координаты региона.
Наблюдения - это предсказание следующего месяца в каждом регионе.
API Google больше не является бесплатным, поэтому эта версия ограничена, но показывает зараженное местоположение.

Выводы

  • Последняя модель предсказывает тенденцию распространения вируса COVID-19 в течение следующих 30 дней или более. Однодневный прогноз Калмана очень точен и действенен, в то время как прогноз на более длительный период является более сложной задачей, но дает представление о будущей тенденции.
  • Похоже, пик заражения уже позади, и прогноз с этой тенденцией показывает, что меньше подтвержденных выпущено и больше восстановлено.
    Все графики, на которых кривая прогноза становится менее умеренной, а градиент более низким (для подтвержденного и смертельного), показывают, что тенденция является положительно-оптимистичной, в то время как в восстановленном прогнозе линии становятся более резкими со временем, что означает больше людей выздоровеют от вируса.
  • При анализе результатов необходимо разделить Хубэй и другие регионы.
  • Погодная характеристика не может быть важной, поскольку модель никогда не видела, как распространяется COVID-19 в жаркую погоду, но температура немного улучшила результаты. Основываясь на средней погоде в наиболее зараженных регионах, мы можем предположить, что как только в этих регионах наступит теплая погода (~ 20 градусов и более), количество подтвержденных случаев уменьшится. В Хубэе такая погода ожидается с середины апреля.
  • Скорость заражения - одна из основных характеристик, влияющих на распространение - модель показала, что это актуально, особенно в Хубэй и Корабль принцессы с бриллиантами. Модель не может предсказать перемещение людей между районами, которые влияют на уровень заражения. Следовательно, на основе этих данных нецелесообразно предсказать, какие новые страны будут затронуты, но как только они это сделают, модель будет предсказывать распространение в этих новых регионах.
  • После положительного прогноза восстановления тенденции, изоляции правительства Китая в провинции Хубэй и предстоящего более теплого климата в Китае я предполагаю значительное сокращение распространения COVID-19 к концу марта . Но до тех пор любое перемещение инфицированных в другие регионы может изменить картину ...

Вот и все, спасибо за чтение, не стесняйтесь обращаться ко мне, чтобы поделиться своими мыслями, вопросами или отзывами.

Обновленные прогнозы можно найти здесь.