Фон

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

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

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

Постановка проблемы (для текущего проекта)

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

Метрики оценки:

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

Данные: исследовательский анализ данных

Доступные наборы данных:

  • поезд.csv
  • test.csv

ПРИМЕЧАНИЕ. Из соображений безопасности, связанных с медицинскими данными, данные, доступные для анализа и построения алгоритмов машинного обучения, имели следующие изменения/маски:
 – имя пациента и личные данные опущены
 – идентификатор пациента зашифрован
 – исходные заголовки столбцов скрыты
 – доступно небольшое подмножество данных

Определения данных:

Набор данных train.csv содержит 617 строк и 56 столбцов (включая цель).

Непрерывные/числовые признаки: 55

NA1, NA2, NA3, NA4, NA5, NA6, NA7, NA8,
NB1, NB2, NB3, NB4, NB5, NB6, NB7,
NC1, NC2, NC3, NC4, NC5, NC6, NC7, NC8, NC9, NC10,
ND1, ND2, ND3, ND4, ND5, ND6, ND7, ND8, ND9, ND10,
NE1, NE2, NE3, NE4, NE5, NE6, NE7,
NF1, NF2, NF3, NF4, NF5, NF6, NF7, NG1,
NG2, NG3, NG4, NG5, NG6

Категорийные/нечисловые признаки: 1

Id, CE1

Целевая переменная:

Класс

Взгляните на данные:

Статистическая сводка данных:

Проверить наличие отсутствующих значений в данных

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

Различные категории и распределение для категориального признака
Для категориального признака CE1 мы рассмотрим график-график, чтобы увидеть различные категории и количество для каждой из них.

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

График для целевой переменной

Мы видим, что цель сильно несбалансирована: только 17,5% записей представляют класс 1. Это очень обычное наблюдение в любых медицинских данных. Например, в случае данных пациентов для прогнозирования диабета, нарушений зрения, рака и т. д., только небольшая часть данных будет представлять положительный класс (т. е. класс 1 или пациент с заболеванием). Это одна из самых больших проблем в таких исследованиях. Мы можем справиться с этим до определенного предела, используя class_weight и т. д.

Графики для непрерывных переменных

На графиках многих функций выше мы наблюдаем, что данные перекошены вправо или влево. Это связано с тем, что на большинстве графиков среднееи медиана отделены друг от друга на некотором расстоянии.
Для функции NB3 мы видим разные пики для классов 0 и 1.
Для функций NC10, NE5, NG6 мы наблюдаем несколько пиков.
> Мы провели подробный анализ некоторых из этих функций для случайной выборки одинакового размера для обоих классов, как показано на изображениях ниже:

Такой же анализ был проведен для многих других функций, таких как NB1, NA8, NB3, NC10, NE8, NG6. Наблюдение осталось таким же, как и при первоначальном анализе.

График TSNE для проверки кластеров

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

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

Корреляция между различными функциями

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

Сводка наблюдений из EDA:
 –
Некоторые функции имеют нулевые/отсутствующие значения
 – Мы наблюдаем правую асимметрию почти во всех функциях
 – Категориальная функция CE1 имеет только 2 категории – A и B
 – Целевой объект сильно несбалансирован: только 17,5 % данных с классом 1.
 – Всплеск наблюдается в начале для функции – NA8
 – Наблюдаются разные всплески для классов 0 и 1 – NB3
 – Равномерное распределение только для класса 0 (не класса 1) для функции NB5
 – Несколько пиков в распределениях для функций: NC10, NE5, NG6
 – После подробного анализа ( и преобразования), мы обнаружили, что неочевидное множество пиков или пиков в начале/конце произошло из-за обрезки данных.
- TSNE подчеркивает наличие некоторых кластеров, однако точки данных не могут быть легко разделены/отнесены к тому или иному классу
- Мы также наблюдаем очень высокую корреляцию между некоторыми функциями. Мы можем проверить влияние наличия/отсутствия этих функций при оценке моделей.

Подход и вызовы

Со всеми наблюдениями, сделанными с помощью EDA, очевидными шагами будут:
 – Обработка пропущенных значений.
 – Импутирование/удаление выбросов
 – Удаление любого из признаков с высокой корреляцией
 – Обучение и оценка моделей
 – Создание прогнозов на тестовых данных.

Однако проблема здесь заключается в том, что эти шаги легче сказать, чем сделать для текущего сценария, учитывая, что размер набора данных очень ограничен (617 записей). Удаление/вменение любой записи может привести к новым систематическим ошибкам. Однако на этот раз нам повезло наблюдать очень мало выбросов, которые мы можем отбросить.
Для минимальной и максимальной обрезки данных мы проигнорируем функции NB5, NC7, NC10, NA7, NB1, NA8, NB3, NE5, NG6 и проверим, помогает ли это улучшить производительность модели. Если нет, мы оставим их в модели. Судя по наблюдениям, сделанным во время EDA, линейная модель может не очень подходить для этой задачи классификации. Однако мы еще будем оценивать различные модели, в том числе и некоторые линейные модели.

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

Подход/решение
 – Мы продолжаем этапы предварительной обработки данных за вычетом обработки выбросов (и обработки максимального и минимального усечения).
 – Мы по-прежнему выполняем разбиение данных на поезд-тест.
 – Из-за небольшого набора данных поезда время обучения модели будет очень небольшим. Мы используем это в своих интересах и оцениваем многие базовые модели.
 – Оцените производительность базовых моделей с помощью перекрестной проверки K-Fold на разделении поезда набора данных.
 – Выберите модель(и) с наилучшей производительностью.
 – Выполните настройку Hypermeter для выбранных моделей.
 – Обучите эти модели на разделении поезда набора данных.
 – Сделайте прогнозы на тестовом наборе данных. Здесь мы можем использовать матрицу путаницы, чтобы выбрать окончательную модель.

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

Чтобы подготовить данные для моделей, мы делаем следующую предварительную обработку:

ПРИМЕЧАНИЕ. Чтобы избежать утечки информации в тестовую разбивку, мы выполняем разбивку обучения и проверки перед применением любого другого метода к данным. Однако нам также потребуется кодировать категориальные переменные для тестового разделения.

  • Train-Test Split — Использование test-size = 25%.
  • Null Value Treatment — Обработка отсутствующих значений с помощью медианы признаков. Мы также использовали KnnImputer и среднее значение признаков для вменения отсутствующих значений, однако модели, похоже, давали лучший результат для вменения, выполненного с медианой признаков.
  • Преобразование — в EDA мы заметили, что для некоторых функций данные были искажены или данные были сосредоточены в очень небольшом диапазоне значений. Мы попробовали логарифмическое преобразование и квадратное преобразование для этих функций и использовали эти новые функции во время оценки. Тем не менее, мы не наблюдали значительного улучшения показателей моделей. Поэтому мы отказались от изменений.
  • Кодирование категориальных переменных — для категориального признака CE1. Поскольку функция имеет только 2 уникальных значения, мы использовали LabelEncoder. Хотя лучшим выбором было бы однократное кодирование, чтобы избежать случайного введения порядка, который может ввести LabelEncoder. Но давайте пока оценим модели с LabelEncoder.
  • Стандартизация — StandardScaler используется для стандартизации всех функций до общего масштаба.

Модель

Наши базовые модели для оценки:
- LogisticRegression
- KNeighborsClassifier
- SVC
- DecisionTreeClassifier
- RandomForestClassifier
- LGBMClassifier
- VotingClassifier
- XGBClassifier
- GaussianNB
- BaggingClassifier

Мы использовали RepeatedStratifiedKFold(n_splits=5, n_repeats=5) для оценки базовых моделей с использованием оценки f1. Выбор этого метода обусловлен тем, что он позволяет повысить предполагаемую производительность модели машинного обучения, просто повторяя процедуру перекрестной проверки несколько раз (в соответствии со значением n_repeats) и сообщая средний результат по всем сгибам из всех запусков.
Ниже приведены результаты:

Производительность базовых моделей с преобразованием

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

Как видно из оценки, Light GBM и XGBoost работают лучше всего без настройки гиперпараметров и без преобразования функций.
Мы использовали RandomizedSearchCV для настройки гиперпараметров этих моделей с использованием оценки f1.
Мы использовали лучшие гиперпараметры, полученные на последнем этапе, для обучения на разделении данных поезда.
Ниже представлена ​​матрица путаницы, которую мы получили при применении этих моделей к тестовому разделению данных.

Заключение

Нам удалось получить f1 Score примерно 0,8 для обеих моделей XGBoost и Light GBM. И, как показывает матрица путаницы, обе модели показывают схожие результаты. Мы можем использовать любой из них для прогнозов.

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

Использованная литература:

www.scaler.com/
Машинное обучение и клинические исследования | Блог JLI (jliedu.com)
Машинное обучение в здравоохранении — преимущества и варианты использования (foreseemed.com)