В поисках инициатив в области науки о данных для оценки показателей эпидемии коронавируса во Франции я пришел к выводу, что в Интернете не так много информации по сравнению, например, с инициативами США (например, Kaggle COVID-19 Open Research Dataset Challenge и COVID19 Глобальное прогнозирование ). Наиболее продвинутое использование французских данных осуществляется Гийомом Розье и командой CovidTracker на https://covidtracker.fr, но не предоставляет (на момент написания этой статьи) инструментов прогнозирования. . И поскольку я хотел составить собственное мнение о ситуации, я попытался увидеть, может ли агностическая модель машинного обучения справиться с этой задачей, поскольку большинство моделей, представленных в научных публикациях, были специфичны для области эпидемиологических исследований в начале эпидемии. (например, модели SEIR), и даже если подходы к машинному обучению теперь предлагаются для Франции (например, [Mohimont and al. 2020]), я не нашел никаких онлайн-инструментов или услуг (или даже записных книжек), обеспечивающих такого рода идеи для моей страны. И в какой-то момент во время учебы у меня наконец было достаточно материала, чтобы поделиться им во время выступления (на французском) на Orléans Tech Talks (ниже) и в статье (той, которую вы читаете).

В начале…

… Все было просто. Я поискал общедоступные наборы данных и открыл Jupyter Notebook в Google Colab, чтобы протестировать классический подход, который специалисты по данным, такие как я, обычно применяют с данными временных рядов: небольшая очистка и EDA, разработка функций, модели машинного обучения, показатели производительности и некоторые данные, а именно. Я быстро начал с двух разных источников данных, международного и французского:

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

Сначала я сосредоточился на прогнозировании новых случаев и закончил с четырьмя индикаторами для прогнозирования:

  • новые дела
  • новые госпитализации
  • новые поступления в реанимацию
  • новые смерти

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

В следующих абзацах я сосредоточусь только на индикаторе новых случаев для прогнозирования, но шаги почти такие же, как и у других индикаторов. Все можно найти в следующей записной книжке Colab, которую я использовал для презентации Orléans Tech Talks, используя простой технический стек (рис. 1.).

EDA Time! (Исследовательский анализ данных)

После завершения операций подготовки я сначала визуализировал новые тесты и новые случаи, (почти) необработанные данные во времени (с двойной осью Y) (рис. 2).

Первая реакция: что это за пилообразный сигнал? Это явно ложная сезонность. Немного увеличим масштаб (см. Рис. 3).

Хорошо, я понял: все низкие значения соответствуют воскресеньям (или государственным праздникам). А еще мы видим, что результаты тестов (кейсов) сдвинуты во времени на один день. Это важная информация, если мы хотим рассчитать долю случаев в соответствии с тестами - что должен делать каждый, поскольку французские СМИ говорят только о количестве случаев в абсолютном значении, что не имеет смысла, если мы их не сравниваем. на тесты. Совет от профессионалов: если вам больше не нужны кейсы, не проводите тестирование;).

Имея эту первую «грязную» визуализацию, мы можем добиться большего, сглаживая данные с помощью 7-дневного окна скользящего среднего (рис. 4).

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

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

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

Часть машинного обучения

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

Разработка функций

Ранее цитированные источники данных дают несколько сведений:

  • новые пациенты в отделении интенсивной терапии
  • новые госпитализации
  • новые вылеченные пациенты
  • скорость воспроизводства
  • новые смерти

на котором мы добавляем новые кейсы, новые тесты и первую созданную функцию: соотношение кейсов по сравнению с тестами. Он дает восемь функций, но они больше являются целями, чем функциями: мы хотели бы их предсказать. Обычно можно использовать классические модели временных рядов, такие как семейство статистических моделей ARIMA. Проблема с этими моделями заключается в их одномерном и параметрическом характере: они могут использовать / прогнозировать только одну переменную, и для получения некоторых результатов необходимо сильно настроить параметры. Только для иллюстрации, я поместил в свой общий блокнот Colab тест предсказания с использованием пакета Facebook Prophet, который предоставляет одну из наиболее продвинутых моделей в своем роде, но он не дает хорошего прогноза (рис. 7), когда его просят сделать прогноз. новые случаи, начиная с 15 января, зная прошлое (см. раздел Показатели и эффективность для дальнейшего анализа).

Другой подход заключается в использовании ансамблевых или линейных моделей, не предназначенных для временных рядов, и в построении временных характеристик, позволяющих этим моделям улавливать сигнал между этими характеристиками и целью. Для этого одним из известных подходов является создание скользящих окон с разными размерами, разными агрегатами и разными сдвигами. Значения сдвигов связаны с максимальным периодом, который вы хотите спрогнозировать: поскольку я хочу спрогнозировать следующие 14 дней, я не могу использовать данные более поздние, чем 14 дней назад. В моем случае я использую свой собственный пакет DS-Box для ускорения этого этапа, используя следующие параметры для построения моих временных характеристик на основе необработанных функций (рис. 8):

  • Операции агрегирования: среднее значение, медиана, стандартное отклонение, минимум, максимум.
  • Размеры скользящих окон (в днях): 3, 7, 14, 28.
  • Смены (в днях): 14, 21, 28

Я получаю функции с именем: AggOp_WindowSize_FeatureName_Shift

Например, mean_3_new_tests_14 = среднее значение новых тестов за 3 дня 14 дней назад.

Чтобы зафиксировать динамику, я добавил также такие функции: diff_mean_7_new_tests_14_21 = разница между средним значением новых тестов за 7 дней 14 дней назад и 21 день назад

Я получил много функций (возможно, даже слишком много): 496 функций. На момент написания в наборе данных было 386 строк ... Это хорошо известная проблемная ситуация в науке о данных, имеющая больше функций, чем примеров, поскольку модель может переоснащаться: она могла бы быть способна имеют комбинации значений функций, которые сильно коррелированы с каждым значением в целевом объекте, и он не может сделать хороший прогноз, если комбинация значений функций никогда не встречалась в наборе данных поезда. Таким образом, модель учится наизусть. Но в моих экспериментах, ну… было сложно удалить функции без потери производительности.

Модели машинного обучения

Поскольку мне нужны были быстрые результаты и чтобы избежать необычных библиотек (объяснения будут в части развертывания), я взял стандартные модели, доступные в пакете Scikit-Learn, при этом некоторые из них позволяют избежать чрезмерной подгонки:

  • Деревья с градиентным усилением (если вам нужна более высокая производительность с точки зрения показателей и вычислений, отдайте предпочтение пакету LightGBM)
  • Случайный лес (и его альтернативная версия, Чрезвычайно рандомизированные деревья)
  • Байесовский хребет (модель хребта с предварительной оценкой распределения)
  • Elastic-Net (сочетающая регуляризацию норм L1 и L2)

Помимо модели Ridge, другие модели с различными возможностями могут уменьшить чрезмерную подгонку: GBT может справиться с этим, если количество деревьев не использует все функции, RF делает это намеренно, выбирая случайные подмножества функции и / или образцы, и Elastic-Net может использовать L1-norm, чтобы установить вес компонентов на ноль, исключая их в этом случае.

Для целей этой статьи я произвольно выбрал дату разделения 15.01.2021 для создания наборов данных для обучения и тестирования (рис.9), что дает примерно 190 строк в наборе данных поезда и 30 строк в наборе тестовых данных (после удаления строк содержащие целевые нулевые значения). Я также повторно масштабировал значения функций с помощью масштабатора MinMax, чтобы они имели согласованные значения веса, назначенные функциям (в основном это касается линейных моделей), и немного настроил гиперпараметры моделей (см. Блокнот Colab).

Эффективность показателей и моделей

Я использовал два показателя для измерения производительности: средняя абсолютная ошибка (MAE) и среднеквадратичная ошибка (RMSE), используя последнюю для выбора лучшей модели. Результаты можно найти ниже (рис. 10), отсортированные по среднеквадратичному среднему значению (чем ниже, тем лучше).

Для информации, RMSE модели FB Prophet составлял около 11200. Давайте увеличим масштаб и посмотрим (рис. 11) на различные прогнозы, созданные каждой моделью:

Модели GBT и RF имеют аномальный пик, который должен быть причиной их низкого ранга производительности, и Байесовский хребет имеет тенденцию к переобучению в этом случае, в то время как модели ET и Elastic Net кажутся, в соответствии с их оценками и графиками, хорошо обобщающими. эта проблема. Поскольку цель состоит в том, чтобы получить тенденцию качества на самой ранней дате, я также построил график с накопленной суммой значений, который немного отличается от результатов, если мы сосредоточимся на последней точке (рис. 12).

Модель ET по-прежнему работает хорошо, но Байесовский хребет со временем исправил свои ошибки. В зависимости от KPI, который вы хотели бы рассмотреть, вам следует выбрать соответствующую модель. В моем случае я придерживался классической метрики RMSE для принятия своих решений, так как я предпочел иметь прогноз среднего качества для всех точек.

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

… Потому что в итоге я построил целый рабочий процесс

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

Поскольку я хотел иметь малобюджетную архитектуру, Я установил Apache Airflow 2 прямо на моем личном Synology NAS (это причина, по которой я не использовал LightGBM). Я использовал BigQuery только для внутренней интеграции с Data Studio и, конечно же, платформу управления версиями (GitHub) для обработки кода.

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

  • Источники импорта данных
  • Обработка машинного обучения
  • Экспорт данных в BigQuery и построение таблицы Data Studio


Я сосредотачиваюсь здесь только на рабочем процессе машинного обучения, который объединяет каждый шаг, сделанный в Блокноте Colab в упакованный код (рис. 14), для всех четырех показателей, которые я представил в начале (случаи, госпитализации, приемы в реанимацию, летальные исходы).

Единственные новые вещи, которые присутствуют в рабочем процессе, - это этапы выбора модели и выбора функций. Для выбора модели я тестирую пять моделей, описанных выше, и использую технику важности перестановки с использованием пакета ELI5 для выбора функций, разбивая исторические данные на три части: обучающий набор данных, проверочный набор данных, используемый по важности перестановки, и тестовый набор данных, на котором окончательная работоспособность проверена (рис. 15). Если выбор функций обеспечивает лучшую производительность в тестовом наборе данных, функции для этой модели обновляются. Для выбора модели после нескольких экспериментов и наличия слишком малого количества данных в строках я предпочел использовать последние 14 дней, доступных для тестирования производительности моделей.

Наконец, результаты оканчиваются на приборной панели Data Studio (на французском) с несколькими диаграммами (рис. 16), на которых отображается несколько индикаторов:

  • прогнозирует значения по индикаторам + эволюция доли случаев согласно тестам
  • прогнозирует изменение суммы на дату экспорта модели
  • мониторинг производительности моделей
  • вклад функций

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

Заключительные слова

Начиная с «простого» подхода с записной книжкой, он заканчивается почти производственным (своего рода) проектом по науке о данных. Причина, по которой я использую термин «маленький» в названии, заключается в том, что часть модели определенно мала, но не периметр, в котором она находится. Этого подхода, основанного на данных, может быть достаточно для оценки будущего тенденции, однако, чтобы подтвердить результаты такого рода, они должны быть проанализированы экспертами-эпидемиологами и могут быть объединены с их специализированным моделированием для получения наилучших результатов. И пусть этот скромный проект станет началом других инициатив такого рода. Спасибо за прочтение !

Сводка ссылок

Блокнот Colab: https://colab.research.google.com/drive/168HRgtbY5-ZvE3jCVbEeR_pHfjieNK42?usp=sharing

Источник кода: https://github.com/vlevorato/covid-ml-models

Панель управления: https://datastudio.google.com/s/gXz0j85jPHM