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

Обычно обычная беременность длится от 37 до 42 недель (1). Этот период обычно делится на трехмесячные периоды (триместры), и плод растет и развивается в каждой фазе. Оценка состояния здоровья плода в эти периоды очень важна и может помочь сохранить здоровье родителя и ребенка, выявить проблемы, если таковые имеются, и предотвратить проблемы во время родов, помимо других преимуществ (2). Таким образом, возможность предсказать, здоров ли ребенок еще в утробе матери, становится важной проблемой, которую можно решить с помощью машинного обучения.

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

Важное примечание. В этой статье я не буду освещать очень интересные функции PyCaret. Вместо этого я отсылаю читателей к моему предыдущему посту о PyCaret или к собственной онлайн-книге PyCaret.

Подробную версию анализа смотрите в Jupyter Notebook.
Где меня найти: GitHub | ЛинкедИн

Данные

Данные для этого проекта были получены на Kaggle. Согласно странице набора данных, данные содержат 2126 наблюдений за 21 функцией. Эти особенности исходят из исследований кардиотокограммы. Кардиотокография, обычно называемая КТГ, представляет собой метод непрерывного мониторинга частоты сердечных сокращений плода, а также сокращений матки с помощью ультразвука и является широко используемым методом оценки состояния плода (3).

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

Наши переменные

Согласно веб-странице набора данных на Kaggle, наши переменные представляют собой следующее:

  • baseline value = исходная частота сердечных сокращений плода (ЧСС).
  • accelerations = количество ускорений в секунду.
  • fetal_movement = количество движений плода в секунду.
  • uterine_contractions = количество сокращений матки в секунду.
  • light_decelerations = количество LD в секунду.
  • severe_decelerations = Количество SD в секунду.
  • prolongued_decelerations = количество PD в секунду.
  • abnormal_short_term_variability = Процент времени с аномальной краткосрочной изменчивостью.
  • mean_value_of_short_term_variability = Среднее значение краткосрочной изменчивости.
  • percentage_of_time_with_abnormal_long_term_variability = Процент времени с аномальной долгосрочной изменчивостью.
  • mean_value_of_long_term_variability = Среднее значение долгосрочной изменчивости.
  • histogram_width = Ширина гистограммы, построенной с использованием всех значений из записи.
  • histogram_min = минимальное значение гистограммы.
  • histogram_max = Максимальное значение гистограммы.
  • histogram_number_of_peaks = количество пиков на гистограмме исследования.
  • histogram_number_of_zeroes = Количество нулей в гистограмме исследования.
  • histogram_mode = Режим гистограммы исследования.
  • histogram_mean = Среднее значение гистограммы исследования.
  • histogram_median = Медиана гистограммы исследования.
  • histogram_variance = Дисперсия гистограммы исследования.
  • histogram_tendency = Тренд гистограммы исследования.
  • fetal_health = Наша реальная интересующая переменная, соответствующая: 1 - Нормальная 2 - Подозрительная 3 - Патологическая.

Хьюстон, у нас возникла проблема! Наша целевая переменная fetal_health закодирована неправильно (начиная с 1, а не с 0, где начинаются индексы Python) и должна быть фиксируется перед началом анализа.

Изучение наших данных

Изучив предварительный анализ с помощью SweetViz, мы можем получить некоторое представление о наших переменных (нажмите здесь, чтобы просмотреть отчет).

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

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

Выбор признаков, или выбор переменных/атрибутов, в машинном обучении и статистике — это подход, использующий преимущества выбора подмножества соответствующих признаков (переменных или предикторов) для использования при построении моделей (4) . Работа с этим подмножеством признаков дает преимущества нашим моделям за счет уменьшения их размера (и, следовательно, времени обучения), снижения риска переобучения, повышения точности модели (5). PyCaret имеет параметр для построения модели, называемый feature_selection, который, если установить его на True, будет использовать несколько контролируемых методов для выбора функций в модели с использованием порога (5).

Давайте проверим нашу целевую переменную:

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

У них примерно одинаковые проценты, поэтому продолжим анализ.

Классификация с PyCaret

Чтобы начать наш классификационный анализ с помощью PyCaret, мы сначала создадим экземпляр установки с нашими параметрами. Здесь мы сделаем две настройки классификации: в одной мы будем использовать параметр feature_selection из конвейера PyCaret, а в другой — нет. Таким образом, мы сможем увидеть, как этот подход может улучшить наши модели.

Настройка моделей

Без выбора функций

В этих настройках мы уже добились отличных значений наших показателей, особенно AUC и отзыва, и XGBoost был нашей лучшей моделью. Из-за парадокса точности измерение точности модели само по себе не является хорошим показателем для оценки нашей модели. В этих случаях лучше обратить внимание на показатели точность, отзыв и показатель AUC ROC.

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

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

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

AUC представляет площадь под ROC-кривой. Кривая ROC отображает чувствительность (доля истинных положительных результатов) в зависимости от 1 — Специфичность (доля ложных срабатываний). Чем выше площадь под кривой (т.е. чем ближе значение к 1), тем ближе вероятность того, что мы правильно назначаем наши классы.

Имея в виду эти показатели, мы видим, что мы уже достигли больших значений для прогнозирования здоровья плода, с тремя лучшими показателями отзыва между 0,88 и 0,89 и AUC более 0,98 во всех трех случаях. Можем ли мы улучшить это, используя Feature Selection?

С выбором функций

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

После этого при сравнении моделей получаем:

С выбором функций мы видим, что показатели для классификатора XGBoost на самом деле ухудшились, но все еще близки к тому, что было достигнуто ранее. LightGBM в целом показал наилучшие показатели, однако этот алгоритм плохо работает с небольшими наборами данных (‹10000 строк) и переопределяет данные.

XGBoost добился в целом лучших результатов, чем GBC, за исключением отзыва с очень низким отрывом и более быстрым временем (~ вдвое), а также достиг лучшего показателя AUC. Таким образом, мы продолжим использовать XGBoost и посмотрим, как настройка модели влияет на обе модели, с выбором функций или без.

Настройка XGBoost

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

Без выбора функций

Без выбора функций мы смогли улучшить нашу полноту, потеряв при этом некоторую точность, точность и AUC. Компромисс здесь был в целом сбалансированным (потеря ~ 1% других показателей с увеличением отзыва ~ 1%). Давайте посмотрим, ведут ли себя наши данные с выбором признаков по-другому.

С выбором функций

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

Оценка нашей модели

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

Из этого видно, что очень немногие случаи были отмечены как нормальные (8 подозреваемых и 4 реальных случая). Это означает, что наша модель действительно очень хорошо предсказывала случаи, даже если иногда она «переоценивала» нашу классификацию (нормальные случаи помечены как подозрительные/патологические случаи), поскольку это можно дополнительно исследовать, чтобы исключить любые возможные проблемы. Еще одним хорошим аспектом нашей модели является то, что она почти всегда (~90%) правильно предсказывала наши патологические случаи, и даже когда это не удавалось, она классифицировала образцы как подозрительные, что автоматически требует дальнейшего изучения этого вопроса. Единственным недостатком нашей модели является то, что она не смогла предсказать ~ 26% (n = 21) подозрительных случаев и пометила их как нормальные.

Давайте посмотрим, какие из наших переменных лучше предсказывали наш класс.

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

«Аномальная краткосрочная изменчивость» и «Процент времени с аномальной долгосрочной изменчивостью», а также «Ускорения» и «Средние значения гистограммы» были лучшими для различения наших классов, за которыми следовали «Продолжительные замедления». Те же самые 5 основных переменных здесь появились в 5 основных важных функциях на графике только что.

Давайте рассмотрим кривые ROC, то есть способность наших моделей правильно предсказывать наши классы:

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

Применение нашей модели

Сначала мы доработаем и протестируем нашу модель.

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

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

Давайте посмотрим, что на графике:

При применении нашей модели мы смогли правильно классифицировать почти 95% просмотров!

Заключение

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

Наш набор данных был очень хорош в обеспечении предсказательной силы для наших данных. Тот факт, что мы смогли предсказать все предполагаемые и патологические случаи, кроме 1,13%, только подчеркивает силу таких подходов, как методы машинного обучения, в улучшении нашей системы здравоохранения. В целом, мы смогли построить очень хорошую модель для наших данных!

Рекомендации

1: https://www.nhs.uk/pregnancy/finding-out/due-date-calculator/
2: https://medlineplus.gov/fetalhealthanddevelopment.html
3 : https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6510058/
4: https://en.wikipedia.org/wiki/Feature_selection
5: https://pycaret.gitbook.io/docs/get-started/preprocessing/feature-selection

Спасибо за чтение! :)

Подробный разбор: Jupyter Notebook.
Где меня найти: GitHub | ЛинкедИн