Можем ли мы предсказать, примет ли пациент повторно?

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

Оглавление :

  • Введение.
  • Бизнес-проблемы и ограничения.
  • Обзор данных и формулировка машинного обучения.
  • Показатели эффективности.
  • Предварительная обработка данных.
  • Разработка функций и использование знаний в предметной области.
  • Исследовательский анализ данных.
  • Краткое изложение EDE и Feature Engineering.
  • Обучение различным моделям.
  • Сравнение моделей.
  • Развертывание модели
  • Вывод.
  • Будущая работа.
  • Профили для будущего подключения.
  • Использованная литература.

1. Введение

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

2. Деловые проблемы и ограничения

По оценкам, 9,3% населения США страдают диабетом, 28% из которых не диагностированы. Частота повторной госпитализации пациентов с диабетом через 30 дней составляет от 14,4 до 22,7%. Оценки частоты повторной госпитализации через 30 дней после выписки из больницы еще выше: более 26% пациентов с диабетом повторно госпитализируются в течение 3 месяцев и 30% - в течение 1 года. Затраты, связанные с госпитализацией пациентов с диабетом в США, составили 124 миллиарда долларов, из которых около 25 миллиардов долларов пришлось на 30-дневную повторную госпитализацию при 20% -ом уровне повторной госпитализации. Следовательно, сокращение 30-дневной повторной госпитализации пациентов с диабетом может значительно снизить расходы на здравоохранение при одновременном улучшении ухода.

Ограничения:

  • Interpretability of model is very important Интерпретируемость всегда важна в области здравоохранения, если модель предсказывает, что какой-то пациент будет повторно принимать, но не может объяснить, почему она пришла к такому выводу, врач не будет иметь ни малейшего представления о таком решении, а также врач не сможет сказать пациенту, почему ему необходимо вернуться на практике. это создаст множество неудобств как врачу, так и пациенту.
  • Latency is not strictly important Большинство приложений, связанных со здравоохранением, не зависят от задержки.
  • The cost of misclassification is high Если пациент не нуждается в повторном приеме, если модель говорит «да, чтобы повторно принять», это станет финансовым бременем для пациента. Если пациенту необходимо повторно принять, но модель говорит «нет» повторного приема, тогда это повлечет за собой расходы на повторную госпитализацию, поэтому процент ошибочной классификации должен быть как можно ниже.

3.Обзор данных и формулировка машинного обучения

База данных Health Facts (Cerner Corporation, Канзас-Сити, Миссури), национальное хранилище данных, которое собирает исчерпывающие медицинские записи из больниц по всей территории Соединенных Штатов. Фактическая база данных содержит все данные пациентов, но, в частности, я хотел работать с данными, связанными с диабетом, поэтому я использовал данные, которые отфильтрованы с использованием нижеупомянутых пяти критериев и доступны по ссылке на репозиторий машинного обучения UCI: ссылка на данные

  • Это стационарный прием (госпитализация).
  • Это «диабетический» контакт, то есть такой, во время которого любой вид диабета был введен в систему в качестве диагноза.
  • Продолжительность пребывания составляла от 1 до 14 дней.
  • Во время встречи были проведены лабораторные исследования.
  • Во время встречи вводили лекарства. Было обнаружено, что почти 1 лакх записей удовлетворяет указанным выше пяти критериям, а набор данных имеет 55 функций, таких как пол, вес, meet_id, повторно принят. Набор данных можно использовать для задач классификации и кластеризации. Я буду использовать его, чтобы предсказать, вернется ли пациент в течение 30 дней или нет. Это задача классификации.

Здесь мы предоставили краткое описание каждой функции.

  • Идентификатор встречи Уникальный идентификатор встречи.
  • Номер пациента Уникальный идентификатор пациента.
  • Раса. Значения: европеоид, азиат, афроамериканец, латиноамериканец и другие.
  • Пол. Значения: мужской, женский и неизвестно / недействительно.
  • Возраст Сгруппированы по 10-летним интервалам: 0, 10), 10, 20),…, 90, 100).
  • Вес Вес в фунтах
  • Тип приема Целочисленный идентификатор, соответствующий 9 различным значениям, например экстренный, срочный, выборный, новорожденный и недоступный.
  • Распоряжение Целочисленный идентификатор, соответствующий 29 различным значениям, например, выписан домой, просрочен и недоступен.
  • Источник поступления Целочисленный идентификатор, соответствующий 21 разному значению, например направление к врачу, отделение неотложной помощи и перевод из больницы.
  • Время в больнице Целое число дней между поступлением и выпиской
  • Код плательщика Целочисленный идентификатор, соответствующий 23 различным значениям, например Blue Cross / Blue Shield, Medicare и self-Pay Medical.
  • Медицинская специальность Целочисленный идентификатор специальности врача, принимающего участие в программе, соответствующий 84 различным значениям, например кардиология, внутренняя медицина, семья / общая практика и хирург.
  • Количество лабораторных процедур Количество лабораторных тестов, проведенных во время встречи.
  • Количество процедур. Числовое. Количество процедур (кроме лабораторных), выполненных во время встречи.
  • Количество лекарств. Количество различных родовых наименований, примененных во время встречи.
  • Количество амбулаторных посещений. Количество амбулаторных посещений пациента в год, предшествующий обращению.
  • Количество обращений за неотложной помощью Число обращений к пациенту за неотложной помощью в год, предшествующий обращению.
  • Количество стационарных посещений Количество стационарных визитов пациента в год, предшествующий обращению.
  • Диагноз 1. Первичный диагноз (кодируется первыми тремя цифрами МКБ9); 848 различных значений
  • Диагноз 2 Вторичный диагноз (кодируется первыми тремя цифрами МКБ9); 923 различных значения
  • Диагноз 3 Дополнительный вторичный диагноз (кодируется первыми тремя цифрами МКБ9); 954 различных значения
  • Количество диагнозов Количество диагнозов, введенных в систему 0%
  • Результат теста на глюкозу в сыворотке Указывает диапазон результата или результат теста, который не проводился. Значения: «› 200 »,« ›300», «normal» и «none», если не измерено.
  • Результат теста A1c. Указывает диапазон результатов, или если тест не проводился. Значения: «› 8 », если результат был больше 8%,« ›7», если результат был больше 7%, но меньше 8%, «нормальный», если результат был меньше 7%, и «нет», если не измеряется.
  • Смена лекарств. Указывает, изменились ли лекарства от диабета (дозировка или общее название). Ценности: «изменить» и «без изменений».
  • Лекарства от диабета Указывает, были ли прописаны лекарства от диабета. Значения: «да» и «нет».
  • 24 различных вида медицинских препаратов.
  • Повторная госпитализация Количество дней до повторной госпитализации. Значения: «0», если пациент был повторно госпитализирован менее чем за 30 дней, «› 30 », если пациент был повторно госпитализирован более чем через 30 дней, и« Нет », если реадмиссия не была зарегистрирована.

4. Показатели производительности

Наша задача - проблема классификации, поэтому мы можем использовать такие показатели производительности, как точность, полнота, точность и оценка F1.

1) точность:

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

2) Напомним:

Напоминание - это (TP / TP + FN), где TP - истинно положительное, а FN - ложно отрицательное. Мы можем думать об отзыве как об из всех действительно положительных точек, сколько из них предсказано моделью как положительные. Отзыв используется, когда ложноотрицательная стоимость высока, что действительно имеет место в данном случае. Для пациента, которому требуется повторная госпитализация, если модель предсказывает, что этого не произойдет, больница выпишет его, но пациент в конечном итоге снова поступит, и это увеличивает стоимость.

3) Harmonic_F1_Score:

Как уже говорилось выше, мы знаем, что ложноотрицательная стоимость и ложноположительная стоимость важны для нас, поэтому было бы хорошо, если бы у нас была мера, сочетающая и то, и другое. F1-score делает то же самое с нами; он объединяет отзыв и точность в одно уравнение.

F1_score = (2 * Точность * Отзыв) / (Точность + Отзыв)

В нашем случае есть проблема с данными о дисбалансе. После тщательного анализа мы обнаружили, что оценка F1 на микро- и макроуровнях бесполезна для работы с несбалансированными данными. Гармоническое среднее значение точности и отзыва используется для компромисса между точностью и отзывом. Здесь мы находимся в той же ситуации, когда хотим, чтобы F1_score, соответствующий классу большинства, не доминировал в нашей метрике производительности, поэтому мы можем рассмотреть возможность принятия гармонического среднего значения F1_scores отдельных классов.

Harmonic_F1_score = (2 * F1_class0 * F1_class1) / (F1_class0 + F1_class1)

4) AUC:

Нормальная точность и отзыв рассчитываются с использованием единого порога. Этот единый порог может не правильно классифицировать все точки. AUC - это не что иное, как площадь под кривой ROC, кривая ROC строится путем вычисления FPR и TPR и помещения их на оси x и y соответственно. Таким образом, AUC принимает все возможные пороги при расчете списков FPR и TPR и, следовательно, раскрывает нам реальную мощь модели.

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

Сначала давайте импортируем все необходимые библиотеки,

Данные хранятся на диске в файле «diabetic_data.csv», который можно прочитать с помощью метода pandas.read_csv.

1. Возрастные особенности:

Значения возраста даны как [0–10), [10–20), [20–30). Возрастной признак не категориальный, а порядковый, поэтому мы должны преобразовать его в числа и рассматривать его как числовой признак. Мы преобразовываем возрастную функцию в числовую, как показано ниже.

[0–10) → 5, [10–20) → 15, [20–30) — -> 25

2. Работа с повторяющимися записями:

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

3. Преобразование и слияние в меньшее количество категорий:

Мы выполнили некоторые преобразования, такие как UP → 10, Down → -10, аналогичным образом. Мы также объединили похожие категории в отдельные категории, такие как идентификатор источника допуска [2, 3] → 1, [5, 6, 10, 22, 25] → 4. Эти процессы преобразования и слияния говорят сами за себя: вы можете просмотреть фрагмент кода, показанный ниже, чтобы понять процесс преобразования и слияния.

4. Работа с недостающими значениями:

Отсутствующие значения в этом наборе данных обозначаются знаком «?». Лишь в очень немногих столбцах отсутствуют значения. Эти,

«Раса», «вес», «код_плательщика», «медицинская_специальность», «diag_1», «diag_2», «diag_3»

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

diag_1 = Counter(list(data[‘diag_1’])).most_common(1)[0][0]
diag_2 = Counter(list(data[‘diag_2’])).most_common(1)[0][0]
diag_3 = Counter(list(data[‘diag_3’])).most_common(1)[0][0]
data[‘diag_1’] = data[‘diag_1’].apply(lambda x : diag_1 if x == ‘?’ else x)
data[‘diag_2’] = data[‘diag_1’].apply(lambda x : diag_2 if x == ‘?’ else x)
data[‘diag_3’] = data[‘diag_3’].apply(lambda x : diag_3 if x == ‘?’ else x)

Чтобы заполнить недостающие значения для medical_specialty, мы создали новую категорию «Пропавшие без вести», а отсутствующие значения для функции «Раса» заполняются с использованием вменения модели. Мы обучили случайную модель леса с пятью классами, а именно:

«Испаноязычный», «азиатский», «кавказский», «другой», «афроамериканский»

Мы сохранили строки, соответствующие значению гонки = ‘?’ В качестве тестового набора, а также сохранили метку «повторно принятого» класса как одну из функций при обучении модели RF. После обучения мы загрузили тестовые данные в модель и получили метки гонок.

6. Разработка функций и использование знаний в предметной области.

6.1) Использование знаний предметной области по специальности «Медицинская специальность»:

После исследования мы обнаружили, что medical_specialty - важная функция, однако у нее слишком много различных значений, поэтому, когда мы применяем одну горячую кодировку, она без необходимости создает множество функций. Чтобы сгруппировать их в меньшее количество категорий, мы использовали частотный подход, и знания в предметной области, так как все хирурги должны быть отнесены к категории «хирург». Нам не удалось сгруппировать ниже медицинских специальностей, поэтому мы сгруппировали их в «несгруппированную» категорию.

  • Эндокринология → железы, Гастроэнтерология → желудок, Гинекология → репродуктивная система женщин, Гематология → Кровь
  • Гематология / Онкология → Кровь, Госпиталист → Тот, кто заботится о госпитализированных пациентах, Онкология → Рак, Офтальмология → Глаз, отоларингология → уши, нос и горло
  • Пульмонология → респираторная, Радиология - диагностика и лечение травм и заболеваний с использованием процедур медицинской визуализации (радиологии) (экзаменов / тестов), таких как рентген

6.2) Использование знаний предметной области на diag_1, diag_2, diag_3:

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

1. Кровеносная → 390–459, 785 → Заболевания системы кровообращения
2. Респираторная → 460–519, 786 → Заболевания дыхательной системы
3. Пищеварительная → 520–579, 787 → Болезни пищеварительная система
4. Диабет → 250.xx → Сахарный диабет
5. Травма → 800–999 → Травма и отравление
6. Скелетно-мышечный → 710–739 → Заболевания опорно-двигательного аппарата и соединительная ткань
7.Мочеполовая → 580–629, 788 → Заболевания мочеполовой системы
8. Новообразования → 140–239 → Новообразования
9. Беременность → 630–679 → Осложнения беременности, роды и послеродовой период
10. Другое

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

6.3) Создание новых функций:

Мы отказались от некоторых функций, таких как «meet_id», «Patient_nbr», payer_code, weight, они не важны для нашего анализа.

3.1) Индекс здоровья:

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

Индекс здоровья = (1 / (число_экстренных + число_больничных + число_ амбулаторных))

3.2) Тяжесть болезни

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

severity_of_disease = (время_в_ больнице + число_процедур + число_медикаментов + число_лабораторий + число_диагностик)

3.3) Количество изменений

Исследования показали, что пациенты, которые продолжают менять (вверх / вниз) пропорции лекарств, склонны повторно принимать лекарства, поэтому мы разработали новую переменную под названием «number_of_changes». Это количество лекарств, пропорция которых изменилась. Мы рассчитали его для каждого пациента.

6.4) Удаление наименее значимых категориальных признаков с помощью критерия хи-квадрат:

  • Критерий хи-квадрат используется для проверки того, связаны ли два категориальных признака какой-либо взаимосвязью. Здесь мы хотим, чтобы функции имели некоторую связь с меткой класса, если некоторые функции не имеют отношения к метке класса, имеет смысл удалить их. Chi-Squared внутренне выполняет проверку гипотез и дает нам p-значение, используя это p-значение, мы можем удалить некоторые функции, которые не важны, мы сохранили уровень значимости / альфа равным 0,4, то есть если вероятность того, что эта функция больше 60% важно, то только мы сохраним эту функцию в нашем последнем наборе функций.
categorical_features = [‘gender’, ‘admission_type_id’, ‘discharge_disposition_id’, ‘admission_source_id’, ‘medical_specialty’, ‘diag_1’, ‘diag_2’, ‘diag_3’, ‘readmitted’]

6.5) Удаление наименее значимых числовых характеристик с использованием коэффициента корреляции Спирмена

  • Давайте использовать коэффициент корреляции Спирмена, чтобы проверить, являются ли числовые функции и повторно принятый столбец зависимыми или независимыми, если некоторые функции оказываются независимыми при повторном приеме, мы просто удалим их.
  • Мы обнаружили, что корреляция всегда близка к нулю, но Спирмен не фиксирует нелинейные отношения, поэтому вместо использования коэффициента корреляции мы будем использовать p-значение для получения «списка отклоненных функций». Здесь проверка гипотез выполняется с предположением нулевой гипотезы как переменные независимы. Давайте установим уровень значимости / альфа равным 0,4. Теперь мы можем удалить функции с p-значением ›альфа, объявив их статистически независимыми от метки класса« повторно принят ».
numeric_features = [‘age’,’time_in_hospital’, ‘num_lab_procedures’, ‘num_procedures’, ‘num_medications’, ‘number_outpatient’, ‘number_emergency’, ‘number_inpatient’, ‘number_diagnoses’, ‘health_index’, ‘severity_of_disease’, ‘number_of_changes’, ‘A1Cresult’,‘max_glu_serum’,‘metformin’,’repaglinide’,’nateglinide’,’chlorpropamide’,’glimepiride’,’acetohexamide’,‘glipizide’,’glyburide’,’tolbutamide’,’pioglitazone’,’rosiglitazone’,’acarbose’,’miglitol’,‘troglitazone’,’tolazamide’,’examide’,’citoglipton’,’insulin’,’glyburide-metformin’,’glipizide-metformin’,‘glimepiride-pioglitazone’,’metformin-rosiglitazone’,’metformin-pioglitazone’, ‘change’, ‘diabetesMed’]

Вот окончательный список функций, которые мы будем использовать при построении модели:

[‘gender’, ‘age’, ‘admission_type_id’, ‘discharge_disposition_id’, ‘admission_source_id’, ‘time_in_hospital’, ‘medical_specialty’, ‘num_lab_procedures’, ‘num_procedures’, ‘num_medications’, ‘number_outpatient’, ‘number_emergency’, ‘number_inpatient’, ‘diag_1’, ‘diag_2’, ‘diag_3’, ‘number_diagnoses’, ‘max_glu_serum’, ‘A1Cresult’, ‘metformin’, ‘repaglinide’, ‘nateglinide’, ‘chlorpropamide’, ‘glipizide’, ‘glyburide’, ‘tolazamide’, ‘insulin’, ‘change’, ‘diabetesMed’, ‘race’, ‘health_index’, ‘severity_of_disease’, ‘number_of_changes’]

7. Исследовательский анализ данных

1. сбалансированные данные:

Из графика мы можем ясно видеть, что у нас 91,2% точек данных относится к классу 0, а остальные относятся к классу 1, у нас есть проблема дисбаланса данных.

2. Идентификатор выписки:

Из графика видно, что если идентификатор выписки равен 18, пациент не вернется.

3. Идентификатор источника допуска:

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

4. Лекарства от диабета:

Эта функция сообщает, принимал ли пациент лекарства от диабета. В нашем наборе данных количество пациентов, принимавших лекарства от диабета и «повторно госпитализированных», почти такое же, как количество пациентов, принимавших лекарства от диабета и «не допущенных повторно». Но, взаимодействуя с другой функцией, Diabetes Med может раскрыть много информации, полезной для данной задачи.

5. количество лабораторных процедур:

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

6. Между изменениями и DiabetesMed:

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

7. Между time_in_hospital и Age:

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

8. Между возрастом и числом стационарных пациентов:

Молодые люди чаще попадают в больницу. Пациенты, которые повторно госпитализированы, имеют большое количество стационарных характеристик, которые можно увидеть для группового возраста [20–30]

9. Между admission_source_id и Change:

Из круговой диаграммы мы можем сделать вывод, что, если есть пациент с идентификатором источника = 4, а функция изменения имеет значение «НЕТ», то у этого пациента меньше шансов на повторную отправку, чем у пациента с идентификатором поступления в [1, 9], и у него нет изменений. .

10. Парный график между подмножеством функций:

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

8. Краткое изложение EDA и проектирования функций

  • Из EDA мы узнаем, что такие функции, как количество лабораторных процедур, лекарства от диабета, госпитализация, важны для нашей задачи. Комбинация функций, таких как «изменение + DiabetesMed», «возраст + время_в_больнице», «возраст + число_импатент» и «изменение + admission_source_id», может дать нам много полезной информации для решения данной задачи.
  • Мы попробовали вменение на основе модели, чтобы заполнить недостающие значения, но обнаружили, что признаки с очень меньшим количеством различных значений должны быть вменены с использованием подхода на основе модели, поэтому мы использовали вменение на основе модели только для заполнения отсутствующих значений признака расы.
  • При разработке функций для столбцов, таких как изменение, инсулин и т. Д., У нас есть значения «Нет», «Вверх», «Устойчивый», но после экспериментов мы обнаружили, что лучше преобразовать их в числа.
  • Сначала мы сохранили категориальные значения неизменными, но с этим подходом мы получили очень низкий AUC, поэтому мы использовали знания предметной области, чтобы уменьшить отдельные категории категориальных функций, и это фактически повысило точность.
  • В начале у нас были все функции, и большинство функций не были важны для данной задачи. Поэтому мы использовали коэффициент корреляции Пирсона и критерий хи-квадрат, чтобы удалить ненужные функции, и это повысило точность нашей модели.

9. Тренировка различных моделей:

Чтобы справиться с несбалансированными данными, мы пробовали различные методы, такие как недостаточная выборка, передискретизация, SMOTE. Мы также пробовали комбинировать SMOTE и передискретизацию. Мы заметили, что «техника передискретизации» работает лучше по сравнению с другими методами. Мы обучили от 8 до 10 различных моделей, здесь мы покажем только 4 лучшие модели, которые показали хорошие результаты. Для всей модели мы сохранили размер обучающих данных = 0,8, допустимый размер данных = 0,1 и размер тестовых данных = 0,1, за исключением модели пользовательского ансамбля. который все вместе следует разной методологии. Я не буду объяснять «работу модели» и «что означает каждый гиперпараметр», вы можете прочитать о них в официальной документации моделей.

9.1) Логистическая регрессия:

  • Настройка модели линейной регрессии
  • Установка оптимальных гиперпараметров:
  • Результаты :
AUC_LR = 0.6534044933934898 
F1_POS = 0.22583926754832148 F1_NEG = 0.7950444384594667 HARMONIC_F1_LR = 0.3517584864826567

9.2) Пользовательская модель ансамблера:

  • Разделение всего набора данных на обучающую и тестовую (80–20)
  • Набор поездов 80%. Мы разделили его на D1 и D2 (50–50). Теперь из D1, выполнив выборку с заменой. Мы создали d1, d2, d3… .dk (k выборок). Затем мы создали «k» моделей и обучили каждую из этих моделей, например, модель 1 будет обучена на образцах d1, модель 2 будет обучена на образцах d2 и т. Д.
  • После передачи набора D2 каждой из этих k моделей мы получим k прогнозов для D2 от каждой из этих k моделей.
  • Используя эти k прогнозов, мы создали новый набор данных (преобразованный D2), а для D2 мы уже знаем соответствующие целевые значения, поэтому мы обучили метамодель с этими k прогнозами.
  • Теперь для оценки модели мы использовали 20% данных, которые мы сохранили в качестве тестового набора.
  • Мы настроили модель на количество базовых моделей и количество выборок в каждом поднаборе данных (d1, d2, ..). После настройки мы получили n = 95 и number_of_samples = 5000 как оптимальные.
  • Установка оптимальных гиперпараметров:
  • Результаты
AUC_CE = 0.6401524560504123 
F1_POS = 0.23093156466686765 F1_NEG = 0.8567899848425309 HARMONIC_F1_CE = 0.3638060712869564

9.3) CatBoost:

  • Тюнинг модели CatBoost
  • Установка оптимальных гиперпараметров
  • Результаты
AUC_CAT = 0.650942309050603 
F1_POS = 0.22088068181818182 F1_NEG = 0.8053584102200142 HARMONIC_F1_CAT = 0.3466796697524027
  • Важность функции: здесь мы показали только 10 основных функций, имеющих большое значение для модели CatBoost.

9.4) Случайный лес:

  • Настройка модели RF
  • Установка оптимальных гиперпараметров
  • Результаты
AUC_RF = 0.6633526103243218 
F1_POS = 0.23723723723723722 F1_NEG = 0.8221288515406163 Harmonic_F1_RF = 0.36821940867963326

10. Сравнение моделей

Из графика мы можем ясно видеть, что Random Forest и Custom Ensembler дают очень хорошие показатели Harmonic F1. Дерево решений, которое мы видим, работает хуже, чем все другие модели. Производительность Logistic Regression, AdaBoost, CatBoost очень похожа.

11.Развертывание модели

Часто люди игнорируют этот шаг, но это один из важных шагов в жизненном цикле науки о данных. Я собираюсь развернуть модель, используя Flask и экземпляр AWS EC2.

Предпосылки:

  • Знание об инстансе AWS EC2
  • Python Flask
  • HTML, CSS, JavaScript
  • Команды Linux, такие как ssh, scp

Структура файлов

Папка масштабирования, original_column.pkl, rf_model.joblib, train_columns.txt и cat_model.joblib - это сохраненные параметры различных моделей, которые необходимы для масштабирования функций и прогнозирования конечного результата.

Необходимо хранить все файлы, связанные с html, в папке с шаблонами. Файл index.html предоставит форму, содержащую такие поля, как возраст, инсулин, медицинская_специальность, пол. После заполнения информации пользователь может нажать кнопку «Отправить для прогноза», чтобы просмотреть прогноз. Если пропустить некоторые значения, он будет принимать значения по умолчанию.

Значения, предоставленные в форме, будут отправлены на путь маршрута «/ прогноз» API-интерфейса flask, который вызывает функцию «def final_prediction». Эта функция собирает данные и создает фрейм данных с помощью метода request.form.get (‘age’). Как только данные становятся доступными в форме «dataframe», final_prediction использует уже сохраненный параметр (в таких файлах, как cat_model.joblib), чтобы предсказать результат и отправить метку класса в файл «show_result.html».

Файл show_result.html в зависимости от метки класса выводит либо «Пациент не принимает повторно !!!» или «Предупреждающий, что пациент вернется !!!!»

На стороне AWS сначала необходимо создать бесплатный экземпляр ec2 уровня «ubuntu server» и запустить его. Убедитесь, что у вас установлено правило для входящего трафика «Весь трафик», «Все порты» в группе безопасности. У вашего приложения должна быть низкая задержка. Избегайте перезагрузки сохраненных весов в функции «final_prediction», прочтите все файлы вне функции, иначе это вызовет нежелательное поведение.

После успешного создания экземпляра EC2 для подключения к экземпляру используйте следующую команду.

ssh -i "deployment.pem" [email protected]

Скопируйте папку deployment_new на экземпляре, используя следующую команду:

scp -i "deployment.pem" -r deployment_new [email protected]:~/deployment_new

В этом экземпляре EC2 может не быть всех библиотек, необходимых для запуска файла app.py, установите все необходимые библиотеки с помощью команды pip3 install ‹имя библиотеки›, наконец, чтобы запустить приложение, используйте команду ниже,

nohup python3 app.py &

Вот ссылка на мое приложение, которое вы можете попробовать использовать: http: //[email protected]: 8080 / index

12. Заключение

После настройки многих моделей мы смогли достичь 0,368 как наивысшего балла по гармонике F1 и 0,66 как самого высокого AUC. Мы лично выяснили, что SMOTE плохо справляется с проблемой дисбаланса классов, поэтому мы избегали его использования. Я надеюсь, что это тематическое исследование поможет вам лучше понять данные о сфере здравоохранения и о том, как использовать машинное обучение в сфере здравоохранения, где преобладает проблема дисбаланса классов.

13 работа на будущее

Как я уже сказал, интерпретируемость очень важна, можно попробовать ELI5, SHAP (Shapely Additive Explanation), LIME (Local Intepretable Model Agnostic Explanation), чтобы получить интерпретируемость. В этом блоге я больше сосредоточился на классических алгоритмах машинного обучения. Также могут быть реализованы алгоритмы глубокого обучения, такие как RNN, CNN, MLP. В разработке функций я реализовал базовую технику, но есть огромные возможности для использования продвинутой техники, такой как полиномиальное ядро, ядро ​​RBF, математическое преобразование функций.

14. Профили для Future Connect

Ссылка на GitHub: -



Ссылка на LinkedIn: -



15. Ссылки

Использование машинного обучения для прогнозирования повторной госпитализации пациентов с диабетом с помощью Scikit-Learn | Эндрю Лонг | К науке о данных

Https://www.appliedaicourse.com/

Https://www.researchgate.net/publication/333015077_Feature_Engineering_FE_Tools_and_Techniques_for_Better_Classification_Performance

Link_to_pdf

Https://www.kaggle.com/aldrinl/interpretable-ml-for-diabetes-patient-readmissionhttps://www.analyticsvidhya.com/blog/2019/11/shapley-value-machine-learning-interpretability-game -теория /