Произведите впечатление на всех своих друзей и будьте притчей во языцех с лучшей моделью Covid-19 10 минут работы на Python принесут вам

Хотите произвести впечатление на парней в пабе? Устали знать все это Норман и его степень из Университета жизни? Пройдите этот ускоренный курс Python по моделированию covid-19 и будьте в центре внимания участников вечеринки, когда вы засовываете им в лицо свои причудливые графики и нестандартное кодирование. Еще лучше пропустите статью, загрузите код и измените имя вверху блокнота, вуаля! Вы полностью квалифицированный специалист по данным.

Эта статья поможет объяснить основы моделирования данных Covid-19 с использованием двух пакетов машинного обучения - XGBoost и Keras (Neural Net). Их будет сравнивать с грубым методом, рассчитанным «вручную», который можно было бы вычислить в электронной таблице.

Скачать данные

Если вы хотите продолжить, вам понадобится установка Python, рекомендуется Anaconda, поскольку он поставляется с Jupyter Labs / Notebook, которые использовались для этой статьи. Пакеты Keras, Tensorflow и XGBoost необходимы, если они еще не установлены ознакомьтесь с этим руководством, чтобы установить их. Чтобы продолжить работу с разделом нейронной сети, для tenorflow требуется версия Python 3.7 или ниже.

Блокноты Jupyter и данные, использованные в этом примере, доступны отсюда. Если вы раньше не использовали GitHub, я бы порекомендовал загрузить GitHub Desktop, а затем клонировать репозиторий, нажав код и Открыть с помощью GitHub Desktop, как показано ниже. GitHub Desktop расскажет вам, как загрузить данные, включая выбор пустой папки на вашем локальном компьютере.

Не стесняйтесь создать свой собственный блокнот и следовать приведенным ниже инструкциям или просто использовать предоставленные заполненные блокноты.
Если вы не использовали блокноты Jupyter до ознакомьтесь с этим руководством, но если вы используете готовые блокноты, содержащие Shift + Enter поможет вам пройти.

Подготовка данных

Этот набор данных .csv был загружен 08/05/2020 с этого сайта. Рабочий процесс в значительной степени применим к данным, загруженным в любую дату. В этом разделе я использую записную книжку data_prep_covid_19.ipynb .

Сначала загрузите свои пакеты.

Создайте путь к каталогу data_folder, чтобы мы могли импортировать и экспортировать данные в нужные места.

Для импорта набора данных и его отображения требуются всего две строки кода.

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

Таблица сокращена до самого необходимого, а столбец dateRep преобразован в столбец даты, понятный Python.

Затем отсортируйте таблицу по дате и создайте совокупную сумму для случаев и смертей. Groupby создаст «мини-таблицу» для расчета этого показателя для каждой страны.
Столбец «флаг» создан для обозначения количества дней, прошедших с момента 100-го случая заражения в каждой стране. Это дает нам возможность «согласовать» относительные временные рамки для каждой страны.

Создайте список под названием «top_count», в котором будут подсчитаны 20 наиболее пострадавших стран.
Давайте отобразим четыре лучших результата: США, Великобритания, Италия и Испания (по состоянию на 08.05.2020).

Используйте список, чтобы обрезать «covid19_df» только до этих 20 стран. Также заполните поле «NaN’s» (не число) в столбце «flag», поскольку пакетам моделирования они не нравятся. Zero's более дружелюбны и имеют смысл использовать здесь.

Проверьте, существует ли папка data_export, и если нет, создайте ее. «Covid19_df» готов к экспорту, пока о нем можно забыть.

Пакеты моделирования не могут читать названия стран и использовать их в виде строк / текста, поэтому нам нужно преобразовать каждую страну в отдельный столбец, который мы заполняем 1, если данные относятся к этой конкретной стране, или 0, если нет. < br /> Затем мы разделяем данные на «df_y» - цель, которую мы хотим предсказать, которая в данном случае является столбцом «смертей», и «df_train», столбцы, которые используются для прогнозирования «смертей».

Подготовьте фреймы данных для экспорта для использования в наших рабочих книгах по моделированию. Создайте папки для экспорта, используя ту же логику, что и раньше. Нам нужна папка data, содержащая папки test и train.

Мы также хотим отбросить данные после установленной даты, чтобы мы могли проверить точность нашей модели после этой точки. Я выбрал 23 апреля, две недели назад. Данные «Поезд» до 23 апреля, а «тест» - после. Экспортируйте все четыре фрейма данных.

Моделирование и прогнозирование XGBoost

Мы не будем вдаваться в подробности о том, что такое XGBoost / Extreme Gradient Boosting в этой статье, но веб-сайт XGBoost предлагает некоторые подробности.

Это записная книжка для этого раздела.

Следующие ниже модули необходимо импортировать для этого ноутбука.

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

Перезагрузите фреймы данных train (train_X, train_y) и test (df_x, df_y), опустив столбец dateRep, поскольку вместо этого мы используем флаг как меру времени.

Параметры модели нуждаются в настройке. Использование импортированной нами функции «GridSearchCV» позволяет нам подогнать массив параметров для модели. Например. вместо использования только одного значения «max_depth» мы можем использовать три, одновременно изменяя другие параметры в сетке. Ниже представлена ​​установка, которую я использую. В этом примере мы будем упрощать ее и углубимся в анализ в следующей статье.

Мы готовы запустить модель! В зависимости от производительности вашему ноутбуку потребуется от 5 до 10 минут, чтобы соответствовать модели. По умолчанию здесь не запускается модель, а импортируется готовая. Если вы хотите запустить его самостоятельно, сначала удалите кавычки.

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

Если вы не обучаете свою собственную модель, запустите эту ячейку, чтобы импортировать готовую обученную модель.

Объедините тестовые кадры данных (df_x, df_y) и объедините кадры данных поезда (train_X, train_y).

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

Соедините эти два новых фрейма данных вместе. Теперь это дает нам полную таблицу, которую полезно сравнить с исходными результатами.

Загрузите covid19_df, который мы экспортировали в разделе подготовки данных, и объедините два важных столбца «deaths_pred» и «model_error». Создайте новый столбец с именем «cumulative_error», как показано ниже, чтобы мы могли измерить точность нашей модели для каждой страны индивидуально. Наконец, давайте воссоздадим список «top_count» для построения целей.

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

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

Давайте поэкспериментируем с созданием более привлекательной карты с помощью модуля «seaborn»:

Ручное прогнозирование

Идея этого прогноза состоит в том, чтобы воспроизвести то, что может быть достигнуто в электронной таблице Excel, для сравнения с случаями машинного обучения. Рабочая тетрадь доступна, но мы не будем вдаваться в подробности в этой статье.

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

Выше значения 1 ежедневное количество смертельных случаев covid увеличивается, ниже 1 - уменьшается в предыдущий день. После 70 дней данные очень зашумлены и обрезаются через 80 дней. Хотя в Китае есть данные за 110 дней, их мало, и расчет скользящего среднего не работает.

Мы видим, что примерно к 40-му дню глобальные показатели смертности стали нейтральными и начали снижаться, если выровнялись по временной шкале «флага».

Формируется новый фрейм данных, и данные после 23 апреля отбрасываются, так что прогнозы могут быть сделаны на две недели до 8 мая, когда закончится реальная информация. Расчет точности до 8 мая позволяет нам увидеть, насколько точными могут быть прогнозы на будущее.

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

Моделирование и прогнозирование нейронной сети

Интернет снова является богатым источником информации о том, что делают нейронные сети и как они работают.

Это рабочая тетрадь для нейросетевого ноутбука, для использования этого ноутбука установите версию python 3.7 или ниже.

В последний раз импортируйте соответствующие пакеты.

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

Читайте в том же составе поезда и тестовых фреймов данных, что и для XGBoost. На этот раз мы подключим функцию «sample», которая рандомизирует наши фреймы данных. Это используется, потому что разделение проверки, которое используют нейронные сети, будет принимать нижние 20% значений для проверки модели. Здесь мы используем упорядоченный временной ряд, что означает смещение модели. Параметр random_state сохраняет согласованность рандомизации между кадрами данных X и y (для их повторного объединения позже).

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

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

Проверьте, существует ли папка «модель», а если нет, создайте ее. Экспортируйте обученную модель нейронной сети.

Если вы не обучали свою собственную модель, запустите эту ячейку и импортируйте модель (сначала удалите кавычки).

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

Снова прочтите «covid19_df», чтобы мы могли сравнить реальные данные с предсказанными. Слияние с прогнозируемыми летальными исходами.

Воссоздайте список «top_count», чтобы мы могли создать красивый график.

Вычислите ошибку прогноза, затем суммируйте эту ошибку для каждой страны с помощью функции «.groupby».

Постройте кумулятивную ошибку отдельной линией для каждой страны.

Что лучше?

Ниже создается фрейм данных для сравнения результатов для трех методов.

XGBoost имеет самую низкую среднюю ошибку (MAE) и самое высокое значение R2 (R в квадрате), что указывает на самую сильную взаимосвязь между прогнозируемыми и наблюдаемыми результатами.

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

Округлять

Если вы зашли так далеко, то, очевидно, как и я, у вас нет жизни, и вам нравится копаться в данных для «развлечения». Теперь, когда вы закончили свою модель, вы полностью квалифицированы, чтобы выиграть любой аргумент Facebook, который встретится вам: «Да, но вы смотрели ДАННЫЕ, Брайан?»

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

Вклады Мэтью Гельсторп.