Надежные прогнозы динамики инфекционных заболеваний могут быть полезны для организаций общественного здравоохранения, которые планируют мероприятия по снижению или предотвращению передачи заболеваний. С ростом больших объемов данных в секторе здравоохранения и биомедицины точный анализ таких данных может помочь в раннем обнаружении заболеваний и улучшении ухода за пациентами. Благодаря наличию огромных вычислительных мощностей, использование «больших данных» для прогнозирования вспышки эпидемии и борьбы с ней стало весьма жизнеспособным. Наша идея состоит в том, чтобы проанализировать и определить распространение эпидемических заболеваний в деревнях и пригородах, где медицинская помощь может быть недоступна. Мы хотим построить модель машинного обучения, которая могла бы прогнозировать динамику эпидемических заболеваний и сообщать нам, где, скорее всего, будет следующая вспышка эпидемии. Наш подход учитывает географию, климат и распределение населения пораженной территории, поскольку они являются важными характеристиками и вносят незначительный вклад в динамику эпидемических заболеваний. Наша модель была бы полезной для органов здравоохранения, помогая им принимать соответствующие меры с точки зрения обеспечения наличия достаточных ресурсов для удовлетворения потребностей и, если возможно, сдерживания возникновения таких эпидемических заболеваний.

Ссылка на репозиторий GitHub



Использование технологии Intel: Intel Distribution для Python, Intel Parallel Studio XE, усилитель Intel VTune, AWS C5.2Xlarge экземпляр Intel

Общая цель:

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

Тема тематического исследования: эпидемия вируса Зика, 2015–2016 гг.

Почему Зика?

● Репозиторий данных о вирусе Зика, поддерживаемый Центром по контролю и профилактике заболеваний, содержит общедоступные данные об эпидемии вируса Зика. У него было достаточно данных для построения и тестирования нашей модели.

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

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

Подробная информация о реализации

Мы использовали Intel Distribution для Python * и Python API для Intel® Data Analytics Acceleration Library (Intel® DAAL) - под названием PyDAAL - для повышения производительности машинного обучения и анализа данных. . Используя преимущество оптимизированного scikit-learn * (Scikit-learn с Intel DAAL), которое поставляется с ним, мы смогли добиться хороших результатов для задачи прогнозирования.

Источники данных

  • Репозиторий данных о вирусе Зика, поддерживаемый Центром по контролю и профилактике заболеваний, содержит общедоступные данные об эпидемии Зика. (Https://github.com/cdcepi/zika)
  • Google Geolocation API для определения широты и долготы мест, связанных со вспышкой.
  • Данные о местоположении аэропортов по всему миру получены из Falling rain
  • Данные о погоде взяты с Wunderground.com по коду ближайшего аэропорта.
  • Плотность населения различных регионов была извлечена из карты с координатной привязкой через NASA (SEDAC) (https://earthdata.nasa.gov/about/daacs/daac-sedac)
  • Возникновения переносчиков (Aedes albopictus, Aedes aegypti) из Глобального справочника по Aedes aegypti и Ae. albopictus (https://datadryad.org/resource/doi:10.5061/dryad.47v3c)
  • Данные ВВП / ВВП по ППС из Перспектив развития мировой экономики МВФ

Репозиторий содержит записные книжки Jupyter, которые реализуют методы, относящиеся к очистке и изменению данных.

Результатом оценки является вероятность возникновения вспышки в районе.

Предварительная обработка

Предварительная обработка и корректировка дисбаланса классов:

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

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

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

Структура A: местоположения, использованные в классе без вспышек, считались теми, в которых никогда не было вспышек, и для этих данных использовалась информация о характеристиках с первой доступной даты. Класс вспышки был определен как место, в котором была вспышка в любое время в течение анализируемых дат. Для этих мест были протестированы характеристики, относящиеся к двум разным датам: те, которые относятся к дате начала вспышки и дате, когда вспышка достигла своего максимального уровня (в течение периода сбора данных). Эти два набора данных были названы framework_a_first и framework_a_max соответственно.

Структура B: использовались только данные из мест, где произошла эпидемия. Затем эти данные были разделены на первую доступную дату, предполагая, что вспышек не было. Эти данные использовались как класс, не связанный со вспышкой. Затем из временных рядов для этих точек для класса вспышки использовались характеристики либо с даты начала вспышки, либо с даты, когда вспышка достигла своего максимального уровня (в течение периода сбора данных). Эти два набора данных были названы framework_b_first и framework_b_max соответственно.

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

Выбор функций

Наборы данных могут содержать нерелевантные или избыточные функции, которые могут усложнить модель машинного обучения. На этом этапе мы стремимся удалить нерелевантные функции, которые могут вызвать увеличение времени выполнения, генерировать сложные шаблоны и т. Д. Сгенерированное подмножество функций используется для дальнейшего анализа. Выбор функции может быть выполнен с использованием алгоритма Random Forest или Xgboost. В нашем проекте алгоритм Xgboost используется для выбора лучших функций, которые имеют оценку выше предопределенного порогового значения. Наши результаты согласуются с литературными данными об эпидемии Зика 1. Температура, количество осадков, близость к районам размножения комаров, плотность населения и близость к другим местам с большим населением (измерено с помощью airport_dist_large) играют значительную роль в распространении эпидемии.

Разделение данных

Разделение обучающих и тестовых данных: затем данные разделяются на обучающие и тестовые наборы для дальнейшего анализа. 70% данных используется для обучения, а 30% - для тестирования. Функция StratifiedShuffleSplit (n_splits = 1, test_size = 0.3, random_state = 0) в scikit-learn используется для разделения данных. Стратифицированное разделение необходимо для устранения дисбаланса классов между случаями вируса Зика и случаями, не связанными с вирусом Зика. Стратифицированное разделение поддерживает соотношение положительных и отрицательных случаев для всей выборки в обучающей и тестовой выборках.

Построение модели

scikit-learn с Intel DAAL

Балансировка набора данных

Набор данных сильно несбалансирован: 86% данных содержат положительные случаи вируса Зика. Этот дисбаланс данных обрабатывается алгоритмом SMOTETomek (SMOTE + Tomek) *, который генерирует новый сглаженный набор данных, который решает проблему несбалансированного класса. Он искусственно генерирует наблюдения за классами меньшинств, используя ближайших соседей этого класса элементов, чтобы сбалансировать обучающий набор данных. Он сочетает в себе избыточную и недостаточную выборку с использованием ссылок SMOTE и Tomek.

Построение моделей и обучение

На этом этапе для обучения выбираются модели машинного обучения. Все классификаторы в scikit-learn используют метод fit (X, y), чтобы соответствовать модели для заданных данных поезда X и метки поезда y. Для сравнения производительности различных моделей используется ансамбль классификаторов. Как только модель обучена, ее можно использовать для прогнозирования. Мы протестировали ADABoost, XGBoost, SVM, Multi Layer Perceptron, Logistic Regression.

Прогноз

На этом этапе обученная модель предсказывает выходные данные для заданных входных данных на основе своего обучения. Таким образом, для немаркированного наблюдения X, predic (X) возвращает прогнозируемую метку y.

Оценка

Чтобы измерить производительность модели, доступны различные показатели оценки производительности. Мы использовали точность, точность и отзывчивость в качестве показателей оценки, чтобы выбрать лучшую модель для проблемы.

Полученные результаты

Мы получили отличные оценки для лучшего оценщика - XGBoostClassifier как по пятикратной стратифицированной перекрестной проверке (0,96), так и по точности (0,95) на тестовом наборе. Другие соответствующие показатели представлены ниже.

Оптимизация кода

Intel Distribution для Python предлагает ускоренные пакеты Intel® Math Kernel Library (Intel® MKL), такие как NumPy, SkLearn и т. Д. PyDAAL - для повышения производительности машинного обучения (ML) и анализа данных. Далее мы использовали Даск. Dask.distributed - это облегченная библиотека для распределенных вычислений на Python.

Мы использовали его в нашей основной программе, которая должна была сделать GridSearchCV для настройки гиперпараметров лучшей модели оценки - XGBoost (Gradient Tree Boosting). Мы использовали его, поскольку он предлагает распределенную библиотеку повышения градиента, которая отличается высокой эффективностью, гибкостью и переносимостью.

Классификатор XGBoost запускается с параметром njobs = -1 (для использования максимального количества потоков)

Для его реализации мы запустили локальный клиент Dask.distributed на нашей локальной машине.

import dask
from dask.distributed import Client
client = Client () # без параметров означает запуск локально
из dask_ml.model_selection import GridSearchCV, RandomizedSearchCV

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

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

Существенное улучшение наблюдается, когда пул задач, такой как ThreadPool из стандартной библиотеки или библиотек, таких как Dask или Joblib, выполняет задачи, вызывающие ресурсоемкие функции Numpy / Scipy / PyDAAL и другие, которые, в свою очередь, распараллеливаются с использованием Intel MKL и / или Строительные блоки Intel® Threading (Intel® TBB).

Все скрипты запускались с флагом-модификатором -m tbb, который включает Intel Threading Building Block.

Пример: python -m tbb / путь / к / вашему / коду

Разблокировка составного параллелизма в Python с помощью Intel TBB

• Включение возможности компоновки потоков между двумя или более библиотеками с поддержкой потоков.

• Возможность компоновки потоков ускоряет программы, избегая превышения лимита подписки, когда программных потоков больше, чем доступных аппаратных ресурсов.

• Поддержка многопроцессорности (планировщик DASK) , которая помогает нескольким процессам взаимодействовать друг с другом для координации общего количества потоков.

Рекомендации и будущее направление

  • Учитывая, что наше доказательство концепции сработало хорошо, мы хотим расширить его, добавив новые параметры, такие как данные о симптомах в социальных сетях, образ жизни, динамика населения и т. Д.
  • Мы хотим изучить и спрогнозировать вспышку эпидемии, если таковая возникнет, например, Нипах, лептоспироз в районах, пострадавших от наводнения.
  • Мы можем дополнительно запросить у государственных органов и учреждений здравоохранения дополнительные данные, которые в настоящее время недоступны в открытом доступе.
  • Важнейшим, но часто игнорируемым фактором в моделях машинного обучения является отсутствие достаточно структурированных данных. В частности, в секторе здравоохранения множество доступных данных часто являются «неструктурированными» или текстовыми данными, которые не поддаются машинному обучению.
  • В ближайшем будущем мы будем использовать двунаправленный LSTM, который реализуем в Intel TensorFlow * для обработки естественного языка (NLP). Его можно будет использовать для построения классификатора различных факторов вспышки болезней, для которых не так много структурированных данных.