Комплексное решение проблемы реадмиссии в больницу. Этот блог в основном будет охватывать исследовательский анализ данных, часть предварительной обработки данных, обучение модели, сравнение моделей и демонстрацию окончательного приложения.
Содержание:
* Объяснение проблемы
* Понимание данных
* Существующие подходы
* Исследовательский анализ данных
* Первый подход
* Предварительная обработка данных
* Двумерный анализ
* Особенности кодирования
* Модельное обучение
* Сравнение моделей
* Демонстрационное видео приложения
* Будущая работа
* Использованная литература
Объяснение проблемы
Когда пациент, страдающий гипергликемией, попадает в больницу, предполагается, что ему необходимо обеспечить систематический уход за ним. Неправильное лечение гипергликемии в больнице может отрицательно сказаться на здоровье пациента. Многие больницы в последнее время начали следовать определенным протоколам с целевыми показателями уровня глюкозы в отделениях интенсивной терапии, но пациенты, не входящие в ОИТ, по-прежнему не контролируют уровень сахара в крови.
Данные свидетельствуют о том, что стационарное лечение не носит систематического характера. Их ведение может привести к повторной госпитализации пациента через определенный период времени. Поэтому, если мы заранее знаем, что у этого конкретного пациента высока вероятность повторной госпитализации, мы можем изменить лечение, чтобы избежать повторной госпитализации.
В этом исследовании используется Национальная база данных Health Facts National Database (Cerner Corporation, Канзас-Сити, Миссури), в которой собраны обширные клинические записи из сотен больниц по всей территории США, но здесь мы используем только часть этой базы данных, которая состоит из встреч между примерно 100000 и 130 пациентами с диабетом. Больницы США.
Источник: https://archive.ics.uci.edu/ml/datasets/Diabetes+130-US+hospitals+for+years+1999-2008
Приложение из реальной жизни
Эта проблема очень важна, поскольку она заставит руководство больницы позаботиться о пациенте. Если в случае пациента применяются определенные лекарства и процесс управления, больница или даже семья пациента могут получить данные о пациенте, поместить данные в приложение и предсказать, проявятся ли у руководства пациента симптомы повторной госпитализации пациента. Если будет обнаружена высокая вероятность повторной госпитализации, больница может внести в свой процесс некоторые существенные изменения и в конечном итоге может спасти жизнь.
Все встречи, используемые для анализа, удовлетворяют пяти ключевым критериям:
- Это госпитализация.
2. Пациент был классифицирован как диабетик (по крайней мере, один из трех первоначальных диагнозов включал диабет).
3. Срок пребывания от 1 до 14 дней.
4. Больному проведено лабораторное обследование.
5. Во время пребывания в стационаре больной принимал лекарства.
Реадмиссию можно разделить на три большие категории:
1. Запланировано: по прямому назначению врача.
2. Незапланированный: повторная госпитализация, которой не должно было произойти, если бы были приняты надлежащие меры.
3. Неизбежно: вполне предсказуемые повторные госпитализации из-за характера состояния пациента.
Итак, эта проблема состоит в том, чтобы разделить некоторых пациентов на три класса:
1. Нет реадмиссии
2. Повторная госпитализация ‹30 дней: очень плохая ситуация и сильно зависит от качества медицинской помощи в медицинском центре.
3. Реадмиссия ›30 дней: это тоже плохо, но меньше связано с качеством медицинского обслуживания и может быть вызвано другими внешними факторами.
Понимание данных
Приведенная ниже таблица взята из этого документа - Влияние измерения HbA1c на частоту повторной госпитализации: анализ 70 000 историй болезни пациентов из клинической базы данных (hindawi.com)
Существующие подходы
- Документ 1: 5244347.pdf (stanford.edu)
3. Документ 3: Прогнозирование 30-дневной повторной госпитализации пациентов с диабетом с использованием многослойного персептрона (thesai.org)
Теперь позвольте мне познакомить вас с моим решением:
Исследовательский анализ данных
Так же, как диета контролирует функциональность человеческого тела, модели работают так же хорошо, как и данные, которые мы им вводим. Итак, во-первых, мы разберемся и проведем обширный исследовательский анализ данных.
Примечание. Полный код см. В моем github- https://github.com/Saurabhraj5162/Diabetes_Hospital_Readmission
У нас есть 2 набора данных:
- diabetic_data.csv
Столбцы: ['meet_id', 'Patient_nbr', 'race', 'пол', 'age', 'weight',
'admission_type_id', 'разряда_disposition_id', < br /> 'admission_source_id', 'time_in_hospital', 'payer_code',
'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', 'метформин',
'репаглинид', 'натеглинид', ' хлорпропамид, глимепирид,
ацетогексамид, глипизид, глибурид, толбутамид,
пиоглитазон, розиглитазон, акарбоза, миглитол,
'троглитазон', 'толазамид', 'экзамен', 'цитоглиптон', 'инсулин',
'глибурид-метформин', 'глипизид-метформин',
'глимепирид-пиоглитазон', 'метформин- розиглитазон,
метформин-пиоглитазон, изменение, диабетMed, повторный прием]
- IDs_mapping.csv
Итак, в нашем основном наборе данных (df) давайте посмотрим, каковы уникальные классы и их распределение:
Итак, у нас есть 3 класса: «Нет», «› 30 »и« ‹30», где 30 обозначает количество дней. Давайте определим эти проблемы как классификацию 2 класса, где:
- 0: повторно принят = {НЕТ или ›30 дней}
- 1: повторный прием = {‹30 дней}
Нет, давайте посмотрим на распределение классов 1 и 0:
Теперь, как мы можем наблюдать, только 11,16% от общего числа встреченных пациентов были повторно госпитализированы в течение 30 дней, и, следовательно, это несбалансированный набор данных.
Разобьем фрейм данных на 4 части (df_1, df_2, df_3, df_4) и проанализируем тепловую карту корреляционной матрицы:
Наблюдение 1:
- time_in_hospsital сильно коррелирует с разрядом_disposition_id
- Encter_id и Patient_id - это просто уникальные идентификаторы, поэтому нас это не волнует.
- admission_source_id имеет некоторую корреляцию с admission_type_id
Наблюдение 2:
- num_lab_procedures хорошо коррелирует с num_medication.
- num_procedures сильно коррелирует с num_medication
- number_emergency немного коррелирует с number_inpatient
Разберем некоторые особенности на основе пропущенных значений:
Как мы видим, есть некоторые функции с гораздо большим количеством пропущенных значений, но имена на графике нечеткие, но после печати имен я получил следующее:
- «Вес» почти все значения равны нулю («?»), Я опущу этот столбец.
- medical_speciality и payer_codes также имеют много нулевых значений, но все же у нас есть более 50% значений, поэтому мы увидим их позже.
Безвариантный анализ
Я построю графики подсчета с оттенком классов (0 и 1), а также распечатаю фрейм данных, который содержит процент каждой категории конкретной функции, которая была повторно принята, используя:
- «пол»
%age belonging to class 1 Female 11.245156 Male 11.061524 Unknown/Invalid 0.000000 Total observations %age of total data Female 54708 53.758623 Male 47055 46.238429 Unknown/Invalid 3 0.002948
И у мужчин, и у женщин почти одинаковые случаи с почти одинаковыми шансами на повторную госпитализацию.
2. «Возраст»
%age belonging to class 1 [20-30) 14.242607 [80-90) 12.083503 [70-80) 11.773055 [30-40) 11.231788 [60-70) 11.128408 [90-100) 11.099177 [40-50) 10.604027 [50-60) 9.666203 [10-20) 5.788712 [0-10) 1.863354 Total observations %age of total data [70-80) 26068 25.615628 [60-70) 22483 22.092840 [50-60) 17256 16.956547 [80-90) 17197 16.898571 [40-50) 9685 9.516931 [30-40) 3775 3.709490 [90-100) 2793 2.744532 [20-30) 1657 1.628245 [10-20) 691 0.679009 [0-10) 161 0.158206
- Как и ожидалось, пациенты пожилого возраста чаще всего встречаются в больницах.
- Шансы на реадмиссию выше в возрастной группе 20–30 лет.
- Я переведу их в числовое значение, взяв средний возраст для всех категорий.
3. «Гонка»
%age belonging to class 1 Caucasian 11.290556 AfricanAmerican 11.218116 Hispanic 10.407462 Asian 10.140406 Other 9.628154 ? 8.271007 Total observations %age of total data Caucasian 76099 74.778413 AfricanAmerican 19210 18.876639 ? 2273 2.233555 Hispanic 2037 2.001651 Other 1506 1.479866 Asian 641 0.629876
- Как мы видим, люди «кавказской» расы чаще всего встречаются в больницах.
- Кроме того, вероятность повторной госпитализации выше (11,29%), если пациент принадлежит к «кавказской» расе.
4. «Admission_type_id»
%age belonging to class 1 1 11.522504 2 11.179654 6 11.075411 3 10.392708 5 10.344828 4 10.000000 8 8.437500 7 0.000000 Total observations 1 53990 3 18869 2 18480 6 5291 5 4785 8 320 7 21 4 10 admission_type_id description 0 1 Emergency 10 1 Discharged to home 42 1 Physician Referral ==================================================================================================== admission_type_id description 1 2 Urgent 11 2 Discharged/transferred to another short term h... 43 2 Clinic Referral ==================================================================================================== admission_type_id description 5 6 NaN 15 6 Discharged/transferred to home with home healt... 47 6 Transfer from another health care facility
‘Admission_type_id’ = 1, что
- Чрезвычайное происшествие
- Выписан домой
- Направление к врачу имеет большинство обращений (более 50%).
Кроме того, шансы на повторный госпитализацию выше, если у пациента тип госпитализации 1, по сравнению с другим типом госпитализации.
Типы допуска 2 и 3 также имеют много встреч, но шансы на повторный допуск больше, когда тип допуска 6, чем 3.
5. ‘Admission_source_id’
%age belonging to class 1 22 16.666667 3 15.508021 20 13.664596 8 12.500000 5 11.812865 7 11.688176 1 10.586843 17 10.411444 9 10.400000 2 10.054348 4 9.695639 6 9.363958 14 0.000000 10 0.000000 11 0.000000 25 0.000000 13 0.000000 Total observations 7 57494 1 29565 17 6781 4 3187 6 2264 2 1104 5 855 3 187 20 161 9 125 8 16 22 12 10 8 14 2 11 2 25 2 13 1
- Исходный ID7 имеет большинство встреч, за которым следует ID 1.
6. ‘Разгрузка_disposition_id’
%age belonging to class 1 12 66.666667 15 44.444444 9 42.857143 28 36.690647 22 27.696939 5 20.861486 2 16.071429 3 14.662462 24 14.583333 7 14.446228 8 13.888889 4 12.760736 6 12.695706 18 12.435654 25 9.302326 1 9.300395 23 7.281553 14 6.451613 13 4.761905 17 0.000000 20 0.000000 16 0.000000 10 0.000000 11 0.000000 19 0.000000 27 0.000000 Total observations %age of total data 1 60234 59.188727 3 13954 13.711849 6 12902 12.678105 18 3691 3.626948 2 2128 2.091072 22 1993 1.958414 11 1642 1.613505 5 1184 1.163453 25 989 0.971837 4 815 0.800857 7 623 0.612189 23 412 0.404850 13 399 0.392076 14 372 0.365544 28 139 0.136588 8 108 0.106126 15 63 0.061907 24 48 0.047167 9 21 0.020636 17 14 0.013757 16 11 0.010809 19 8 0.007861 10 6 0.005896 27 5 0.004913 12 3 0.002948 20 2 0.001965
У многих идентификаторов очень мало наблюдений, почти ноль. В то же время в ID 1,3,6 имеется неплохой объем наблюдений.
7. ‘Time_in_hospital’
%age belonging to class 1 10 14.346712 8 14.233660 9 13.724184 12 13.328729 14 12.955854 7 12.834955 6 12.587876 13 12.314050 5 12.030905 4 11.806952 3 10.666817 11 10.512129 2 9.939619 1 8.178491
- Если мы посмотрим на 5 основных категорий дней с наибольшим шансом на повторный перевод, мы увидим 10, 8, 9, 12 и 14, что довольно интуитивно понятно, потому что чем больше времени проведено в больнице, тем тяжелее было состояние.
- Если мы посмотрим на 5 нижних категорий дней с наименьшими шансами на повторный перевод, мы увидим 4,3,11,2 & 1, что также объяснимо. Но эти идентификаторы отражают большинство наблюдений.
8. "Payer_code"
%age belonging to class 1 OG 13.165537 SI 12.727273 MD 11.778029 MC 11.745122 DM 11.657559 ? 11.493939 MP 11.392405 HM 10.264584 CM 10.221993 SP 10.185740 UN 9.272876 BC 9.151450 CH 8.904110 CP 8.448480 PO 7.432432 OT 7.368421 WC 3.703704 FR 0.000000
- В большинстве наблюдений нет записи о payer_code.
- payer_code, MC, имеет большинство наблюдений после наблюдений нулевых значений.
9. «Медицинская_специальность»
%age belonging to class 1 Resident 50.000000 AllergyandImmunology 42.857143 Hematology 31.707317 Pediatrics-Hematology-Oncology 25.000000 InfectiousDiseases 21.621622 ... ... Pediatrics-EmergencyMedicine 0.000000 Proctology 0.000000 Pediatrics-InfectiousDiseases 0.000000 Psychiatry-Addictive 0.000000 Dermatology 0.000000 [73 rows x 1 columns] Total observations ? 49949 InternalMedicine 14635 Emergency/Trauma 7565 Family/GeneralPractice 7440 Cardiology 5352 ... ... SportsMedicine 1 Speech 1 Perinatology 1 Neurophysiology 1 Pediatrics-InfectiousDiseases 1
- Как мы видим, в большинстве наблюдений отсутствует значение для medical_specialty.
- Кроме того, InternalMedicine имеет большинство наблюдений.
- У класса резидента самый высокий шанс повторного перевода (50%), за которым следует гематология.
- Но у большинства классов очень мало наблюдений.
10. ‘Number_diagnoses’
%age belonging to class 1 11 27.272727 15 20.000000 13 18.750000 10 17.647059 14 14.285714 9 12.380240 8 11.812359 12 11.111111 7 10.766862 6 10.412361 5 9.154744 16 8.888889 4 8.253567 3 7.372134 2 6.060606 1 5.936073 Total observations 9 49474 5 11393 8 10616 7 10393 6 10161 4 5537 3 2835 2 1023 1 219 16 45 10 17 13 16 11 11 15 10 12 9 14 7
- У большинства пациентов было поставлено 9 диагнозов.
- Шансы на повторную госпитализацию кажутся немного выше, если вы пойдете на большее количество диагнозов.
11. «A1Cresult»
%age belonging to class 1 None 11.423278 >7 10.047219 >8 9.870983 Norm 9.659319 Total observations None 84748 >8 8216 Norm 4990 >7 3812
- Шансы на повторный прием немного выше, если пациент не пройдет этот тест.
- Но разница между шансами на повторный перевод во всех 4 случаях не столь значительна.
- Большинство пациентов не прошли этот тест.
12. «Изменить»
%age belonging to class 1 Ch 11.822765 No 10.590814 Total observations No 54755 Ch 47011
Если кто-то пойдет на смену лекарства, то вероятность повторной госпитализации немного больше, иначе это кажется идеально сбалансированным признаком, почти уравновешенным пациентом в обеих категориях.
13. ‘Num_lab_procedures’
%age belonging to class 1 132 100.000000 105 33.333333 109 25.000000 108 25.000000 106 20.000000 .. ... 129 0.000000 102 0.000000 113 0.000000 114 0.000000 118 0.000000 [118 rows x 1 columns] Total observations 1 3208 43 2804 44 2496 45 2376 38 2213 .. ... 120 1 132 1 121 1 126 1 118 1
- Больше выбросов, когда нет реадмиссии.
- Коробчатый сюжет почти совпадает, так что здесь не очень много помощи.
14. ‘Num_procedures’
%age belonging to class 1 1 12.207116 2 11.181883 0 11.077767 4 11.028708 3 10.685164 6 9.588212 5 9.421702 Total observations 0 46652 1 20742 2 12717 3 9443 6 4954 4 4180 5 3078
- Большинство пациентов не проходили никаких дополнительных тестов, кроме лабораторных, потому что num_procedures указывает количество процедур, отличных от лабораторных.
- Похоже, что пациенты с большим количеством процедур, помимо лабораторных, имеют меньше шансов на повторную госпитализацию.
15. ‘Num_medications’
%age belonging to class 1 81 100.000000 72 100.000000 70 50.000000 68 28.571429 67 28.571429 .. ... 66 0.000000 69 0.000000 79 0.000000 75 0.000000 74 0.000000 [75 rows x 1 columns] Total observations 13 6086 12 6004 11 5795 15 5792 14 5707 .. ... 70 2 75 2 81 1 79 1 74 1
«Num_medications» кажется искаженным, как и вероятность повторной госпитализации.
Как мы ясно видим, в этой функции присутствует много выбросов. График почти совпадает как для реадмиссии, так и для отказа от реадмиссии, так что полезной информации не так много.
16. ‘Number_outpatient’
%age belonging to class 1 40 100.000000 23 50.000000 19 33.333333 22 20.000000 12 20.000000 13 19.354839 14 17.857143 9 15.662651 7 15.483871 4 15.104641 11 14.285714 1 13.923014 2 13.745131 6 13.201320 17 12.500000 3 12.291871 5 11.819887 0 10.674256 15 10.000000 10 8.771930 8 5.102041 21 0.000000 34 0.000000 38 0.000000 37 0.000000 28 0.000000 25 0.000000 33 0.000000 26 0.000000 42 0.000000 39 0.000000 16 0.000000 24 0.000000 20 0.000000 27 0.000000 18 0.000000 36 0.000000 29 0.000000 35 0.000000 Total observations 0 85027 1 8547 2 3594 3 2042 4 1099 5 533 6 303 7 155 8 98 9 83 10 57 11 42 13 31 12 30 14 28 15 20 16 15 17 8 21 7 20 7 18 5 22 5 19 3 27 3 24 3 26 2 23 2 25 2 33 2 35 2 36 2 29 2 34 1 39 1 42 1 28 1 37 1 38 1 40 1
Большинство пациентов не посещали амбулаторных больных до поступления в стационар. Поскольку количество амбулаторных пациентов увеличивается, количество приемов очень быстро снижается.
Большинство точек являются выбросами, и ящичная диаграмма здесь не помогает.
17. ‘Number_emergency’
%age belonging to class 1 64 100.000000 28 100.000000 20 50.000000 22 50.000000 21 50.000000 19 50.000000 16 40.000000 9 36.363636 10 35.294118 15 33.333333 13 33.333333 8 32.000000 4 30.748663 7 26.027397 5 24.479167 6 23.404255 11 21.739130 3 20.275862 18 20.000000 12 20.000000 2 18.266405 1 14.354566 0 10.474315 14 0.000000 42 0.000000 46 0.000000 76 0.000000 37 0.000000 25 0.000000 63 0.000000 54 0.000000 24 0.000000 29 0.000000 Total observations 0 90383 1 7677 2 2042 3 725 4 374 5 192 6 94 7 73 8 50 10 34 9 33 11 23 13 12 12 10 22 6 16 5 18 5 19 4 20 4 15 3 14 3 25 2 21 2 28 1 42 1 46 1 76 1 37 1 64 1 63 1 54 1 24 1 29 1
Большинство пациентов не обращаются за неотложной помощью в больницы до поступления в стационар.
18. ‘Number_inpatient’
%age belonging to class 1 15 100.000000 21 100.000000 17 100.000000 11 67.346939 13 50.000000 12 50.000000 19 50.000000 8 44.370861 10 42.622951 9 42.342342 14 40.000000 7 35.447761 6 34.583333 16 33.333333 5 31.403941 4 23.612824 3 20.287306 2 17.433254 1 12.924543 0 8.437084 18 0.000000 Total observations 0 67630 1 19521 2 7566 3 3411 4 1622 5 812 6 480 7 268 8 151 9 111 10 61 11 49 12 34 13 20 14 10 15 9 16 6 19 2 17 1 21 1 18 1
- Большинство пациентов не обращались в стационар за год, предшествующий обращению. Поскольку количество стационарных пациентов увеличивается, общее количество обращений за ними очень быстро падает.
- Также у пациентов с большим количеством стационарных пациентов есть высокие шансы на повторную госпитализацию.
Это кажется полезной функцией, поскольку количество стационарных пациентов увеличивает шансы на повторную госпитализацию.
19. «Diag_1»
%age belonging to class 1 543 100.0 347 100.0 391 100.0 299 100.0 904 100.0 .. ... 991 0.0 229 0.0 939 0.0 686 0.0 V51 0.0 [717 rows x 1 columns] Total observations 428 6862 414 6581 786 4016 410 3614 486 3508 .. ... 373 1 314 1 684 1 217 1 V51 1
- Первичный диагноз 428 (код МКБ) является наиболее частым, за ним следует 414.
- Уникальных кодов МКБ слишком много, поэтому сюжет неясен.
20. «Diag_2»
%age belonging to class 1 250.31 100.0 364 100.0 186 100.0 114 100.0 975 100.0 ... ... 519 0.0 239 0.0 906 0.0 945 0.0 927 0.0 [749 rows x 1 columns] Total observations 276 6752 428 6662 250 6071 427 5036 401 3736 ... ... E918 1 46 1 V13 1 E850 1 927 1
- Вторичный диагноз 276 (код МКБ) является наиболее частым, за ним следует 428.
- Имеется 749 уникальных кодов МКБ, поэтому сюжет неясен.
21. «Diag_3»
%age belonging to class 1 744 100.0 E876 100.0 111 100.0 365.44 100.0 215 100.0 ... ... 359 0.0 360 0.0 V25 0.0 180 0.0 971 0.0 [790 rows x 1 columns] Total observations 250 11555 401 8289 276 5175 428 4577 427 3955 ... ... 657 1 684 1 603 1 E826 1 971 1
- Вторичный диагноз 276 (код МКБ) является наиболее частым, за ним следует 428.
- Имеется 749 уникальных кодов МКБ, поэтому сюжет неясен.
22. Все лекарства
Я вместе проанализирую все лекарства. Давайте построим график подсчета с помощью этой функции:
- Лекарства, которые не назначались пациентам: метформин-пиоглитазон, метформин-розиглитазон, глимепирид-пиоглитазон, глипизид-метформин, экзамен, цитоглиптон, ацетогексамид, толбутамид
- отсюда видно, что все лекарства чаще всего встречаются там, где их не прописывают пациентам.
- Затем 2-й по частоте статус лекарства - «Устойчивый».
Теперь проанализируем распределение всех лекарств по категориям: «Вверх», «Вниз», «Устойчиво» и «Нет».
23. Доля Meds «Up»
total repaglinide 110 rosiglitazone 178 pioglitazone 234 glimepiride 327 glipizide 770 glyburide 812 metformin 1067 insulin 11316
Этот сюжет рассматривает только медицину с минимум 100 случаями улучшения. Очевидно, что из всех случаев увеличения дозировки больше всего случаев приходилось на Инуслин (76,1%), за ним следовал метформин. Есть много лекарств, дозировка которых не была увеличена ни в одном случае.
23. Доля Meds "Down"
total pioglitazone 118 glimepiride 194 glipizide 560 glyburide 564 metformin 575 insulin 12218
На этом графике учитываются только лекарства с минимум 100 случаями снижения дозировки. Из всех случаев, когда дозировка была снижена, в большинстве случаев наблюдался Инуслин (85,9%), затем следовали метформин, глибурид и затем глипизид.
23. Медс «Устойчивая» доля
total acarbose 295 nateglinide 668 glyburide-metformin 692 repaglinide 1384 glimepiride 4670 rosiglitazone 6100 pioglitazone 6976 glyburide 9274 glipizide 11356 metformin 18346 insulin 30849
Опять же, в тех случаях, когда лекарство оставалось стабильным, в большинстве случаев использовался инсулин (34%), затем следовали метформин (20,2%), глипизид (12,5%), а затем глибурид (10,2%).
23. Meds «Нет» поделиться
total insulin 47383 metformin 81778 glipizide 89080 glyburide 91116 pioglitazone 94438 rosiglitazone 95401 glimepiride 96575 repaglinide 100227 glyburide-metformin 101060 nateglinide 101063 acarbose 101458 chlorpropamide 101680 tolazamide 101727 miglitol 101728 tolbutamide 101743 glipizide-metformin 101753 troglitazone 101763 metformin-rosiglitazone 101764 acetohexamide 101765 glimepiride-pioglitazone 101765 metformin-pioglitazone 101765 examide 101766 citoglipton 101766
- Почти все лекарства столкнулись с одинаковым количеством случаев, когда они не были прописаны, за исключением нескольких. У инсулина самые низкие случаи, когда он не был назначен.
- Проведя весь анализ 23 лекарств, мы можем сказать, что инсулин является наиболее важным лекарственным средством, после которого следует метформин. Таким образом, мы можем использовать инсулин для создания каких-то функций.
34. «ДиабетМед»
%age belonging to class 1 Yes 11.626661 No 9.597060 Total observations Yes 78363 No 23403
- Шансы на повторную госпитализацию несколько выше, если лекарство от диабета пациента меняется, чем в случае, когда оно не менялось.
- В большинстве случаев (77%) лекарства от диабета меняли.
Вывод от EDA:
- Большинство функций не являются полезными напрямую, поскольку нет прямой связи между отдельной функцией и меткой повторного допуска.
- Поэтому мне нужно много разрабатывать функции, и я должен смотреть в сторону создания новых функций.
- Кроме того, у некоторых функций есть много отклонений, поэтому я тоже должен обратить внимание на это.
Первый подход
Я создам два набора фреймов данных:
- С текстовым описанием admission_type_id, разряда_disposition_id, admission_source_id, diag_1, diag_2 и diag_3.
- Без текстового описания
Для данных с текстом я буду использовать следующие модели:
- Логистическая регрессия (BoW Vect), Дерево решений (BoW Vect), Случайный лес (BoW Vect) и XGBoost (BoW Vect)
- Логистическая регрессия (TfIDF Vect), дерево решений (TfIDF Vect), случайный лес (TfIDF Vect) и XGBoost (TfIDF Vect)
- Нейронная сеть (LSTM), нейронная сеть (LSTM + CNN)
Для данных без текста я буду использовать следующие модели:
- Логистическая регрессия (SMOTE), дерево решений (SMOTE), случайный лес (SMOTE) и XGBoost (SMOTE)
- Нейронная сеть (CNN + SMOTE) и простой MLP (SMOTE)
Предварительная обработка данных
Теперь, когда мы выполнили весь анализ и понимаем природу нашей проблемы машинного обучения, давайте предварительно обработаем данные, которые включают в себя вменение пропущенных значений, разработку функций, кодирование функций и т. Д.
- Заполнение нулевых значений (в данном случае «?») Признака «гонки», поскольку в нем отсутствует менее 50% данных. мы будем вменять наиболее частые значения пропорционально.
2. Извлечь возраст из диапазона:
Возраст дан в формате диапазона, я возьму медианное значение диапазона.
3. Я сопоставлю идентификаторы госпитализации, выписки, первичного и вторичного диагноза с их соответствующим текстовым описанием. Для этого я сделал несколько веб-скраппинга и создал фреймворк кодов ICD:
Теперь объедините это относительно «diag_1», «diag_2» и «diag_3».
Затем я переименовал новые функции: «diag_1_des», «diag_2_des» и «diag_3_des». Но в этих трех столбцах есть некоторые недостающие значения. Так что давайте вменяем им «сахарный диабет», потому что в кодах МКБ9 это диапазон сахарного диабета, который содержит большинство пропущенных значений.
Теперь и для разряда_disposition_id я сделал небольшую запись в Интернете и создал фрейм данных с идентификатором и его описанием.
Затем создал новую функцию «disch_description». Затем вменяли недостающие значения с помощью «Зарезервировано для национального назначения».
Затем я выполнил некоторую предварительную обработку текста для этих новых текстовых функций.
4. Затем я отбросил все записи, в которых выписка описывалась как «Просрочено» или просто говорила, что если пациент мертв, то нет смысла предсказывать его реадмиссию.
5. Выполнены те же шаги для admission_source_id.
Наш df после создания этих новых текстовых функций:
6. Теперь давайте опустим некоторые особенности:
- Просто опустите веса, потому что большинство значений - "?"
- Мы также опустим "payer_code" и "medical_speciality", потому что у них отсутствует более 50% данных.
- Мы также удалим diag_1, diag_2, diag_3, поскольку у нас уже есть их текстовое описание.
7. Давайте создадим еще несколько новых функций:
- procedure_per_med = («num_lab_procedures» + «num_procedures») / «num_medications»
- num_med_up = количество лекарств, дозировка которых была увеличена
- num_med_used = total med - лекарства, которые не были прописаны = (23 - лекарства с меткой «NO»)
- count_encounter = Количество встреч каждого пациента. Для этого я создал новый фрейм данных о количестве пациентов в сравнении с общим количеством встреч с этим пациентом. И сопоставил его с нашим основным файлом df.
Итак, после всего этого, наш последний фрейм данных (df):
Прежде чем перейти к моделированию, я просто сделаю быстрый двумерный анализ, так как здесь у нас есть некоторые новые функции.
Двумерный анализ
Этот парный сюжет не принесет особой пользы.
- number_outpatient vs time_in_hospital: я вижу какое-то разделение между обоими классами. Похоже, что number_outpatient увеличивается. Строка уравнения (3y + 2x = 60), кажется, разделяет оба класса. Итак, я создам новую функцию с помощью этой формулы.
- num_lab_procedure vs number_outpatient: по мере увеличения количества амбулаторных пациентов шансы на повторную госпитализацию снижаются. Четкого разделения нет, но кажется, что классы разделяет изгиб.
- num_procedure vs number_outpatient: строка с уравнением (2x + y = 17), кажется, разделяет много точек.
- num_emergency vs procedure_per_med: Уравнение xy = c, кажется, разделяет многие точки, поскольку num_emergency и procedure_per_med увеличивают шансы на повторное принятие.
- number_diagnosis vs procedure_per_med: кажется, что точки разделяет некоторая кривизна.
- number_inpatient vs procedure_per_med: Больше процедур на одно лекарство означает, что вероятность повторной госпитализации меньше.
Никакой помощи отсюда не придет.
‘number_inpatient’ vs ‘time_in_hospital’
Кажется, что линия x + y = k разделит диаграмму разброса на две области, где левая область будет гарантировать повторный допуск.
Теперь давайте посмотрим, помогает ли длина текстового описания.
Те, кто повторно допущен, имеют немного большую длину текста, но четкого разделения нет.
Итак, в целом у меня есть несколько функций, с которыми мы можем провести эксперимент по разработке функций:
- time_outpatient = 3 num_outpatients + 2 time_in_hospital
- proc_outpatient = 2 * num_procedures + num_outpatients
- product_emerg_proc = num_emergency * procedure_per_med
- sum_time_inpatient = number_inpatient + time_in_hospital
Но здесь, в этом примере, я не буду использовать эти функции, но тем, кто хочет попробовать этот пример, следует попробовать и эти новые функции.
Особенности кодирования
Кодирование категориальных функций
'пол', 'раса', 'max_glu_serum', 'A1Cresult', 'метформин', 'репаглинид', 'натеглинид', 'хлорпропамид', 'глимепирид', 'ацетогексамид', 'глипизид', глибурид, толбутамид, пиоглитазон, розиглитазон, акарбоза, миглитол, троглитазон, толазамид, экзамен, цитоглиптон, инсулин, глибурид-метформин, «глипизид-метформин», «глимепирид-пиоглитазон», «метформин-розиглитазон», «метформин-пиоглитазон», «изменение», «диабетМед», «изменение», «диабетМед»
Я создам фиктивные функции для всех упомянутых категориальных функций:
Shape of dummy features for all categorical features: (101764, 121)
Теперь давайте объединим все текстовые функции в один столбец под названием «текст», а затем отбросим «diag_1_des», «diag_2_des», «diag_3_des», «disch_description», «admit_description»:
Теперь я выполнил предварительную обработку текста на этих текстовых объектах.
Затем поезд-тест разделился на наш результирующий df:
SHAPES:- -------------------------------------------------- x_train: (71234, 112) x_test: (30530, 112) -------------------------------------------------- Percent share of data:- -------------------------------------------------- x_train: 69.99921386737942 x_test: 30.000786132620572
Затем закодировал «текстовые» функции с помощью Bag of Words и TfIDF. Ниже приведен фрагмент кода для BoW:
x_train_text_bow: (71234, 100) x_test_text_bow: (30530, 100)
Кодирование числовых функций
Наконец, мы создадим три набора входных данных:
- Ввод, включая текст (лук)
Final Data matrix (71234, 211) (71234,) (30530, 211) (30530,)
2. Ввод, включая текст (TfIDF)
Final Data matrix (71234, 211) (71234,) (30530, 211) (30530,)
3. Ввод без текста
Final Data matrix (71234, 111) (71234,) (30530, 111) (30530,)
Модельное обучение
1. Логистическая регрессия без текста
- Во-первых, давайте сделаем передискретизацию нашего X_train с помощью SMOTE, поскольку наши данные сильно несбалансированы.
Before OverSampling, counts of label '1': 7950 Before OverSampling, counts of label '0': 63284
After SMOTE, the shape of train_X: (126568, 111) After SMOTE, the shape of train_y: (126568,) After SMOTE, counts of label '1': 63284 After SMOTE, counts of label '0': 63284
Затем новые данные дополнительной выборки были подогнаны и обучены логистической регрессии. Матрица оценок и недоразумений:
Roc-Auc : 0.70 Accuracy : 0.73 Precision : 0.22 Recall : 0.55 Macro f1 : 0.57
2. Дерево решений без текста
- Данные с передискретизацией были подогнаны и обучены в классификаторе дерева решений. Матрица оценок и недоразумений:
Roc-Auc : 0.48 Accuracy : 0.25 Precision : 0.11 Recall : 0.79 Macro f1 : 0.25
3. Радомский лес без текста
- Данные с передискретизацией были подогнаны и обучены в классификаторе случайных лесов. Матрица оценок и недоразумений:
Roc-Auc : 0.66 Accuracy : 0.79 Precision : 0.20 Recall : 0.28 Macro f1 : 0.56
4. XGBoost без текста
- Данные с передискретизацией были подогнаны и обучены в XGBoost Classifier. Матрица оценок и недоразумений:
Roc-Auc : 0.61 Accuracy : 0.43 Precision : 0.14 Recall : 0.77 Macro f1 : 0.39
5. Логистическая регрессия с текстом (BoW)
- Поскольку здесь задействован текст, мы не можем выполнять передискретизацию с помощью SMOTE. Мы должны смириться с самим дисбалансом.
Roc-Auc : 0.71 Accuracy : 0.89 Precision : 0.42 Recall : 0.04 Macro f1 : 0.51
6. Дерево решений с текстом (BoW)
Roc-Auc : 0.58 Accuracy : 0.76 Precision : 0.17 Recall : 0.30 Macro f1 : 0.54
7. Случайный лес с текстом (BoW)
Roc-Auc : 0.69 Accuracy : 0.88 Precision : 0.30 Recall : 0.03 Macro f1 : 0.50
8. XGBoost с текстом (BoW)
Roc-Auc : 0.78 Accuracy : 0.89 Precision : 0.45 Recall : 0.03 Macro f1 : 0.50
9. Логистическая регрессия с текстом (TfIDF)
Roc-Auc : 0.71 Accuracy : 0.89 Precision : 0.42 Recall : 0.04 Macro f1 : 0.51
10. Дерево решений с текстом (TfIDF)
Roc-Auc : 0.58 Accuracy : 0.80 Precision : 0.18 Recall : 0.23 Macro f1 : 0.54
11. Случайный лес с текстом (TfIDF)
Roc-Auc : 0.68 Accuracy : 0.89 Precision : 0.33 Recall : 0.03 Macro f1 : 0.49
12. XGBoost с текстом (TfIDF)
Roc-Auc : 0.78 Accuracy : 0.89 Precision : 0.44 Recall : 0.03 Macro f1 : 0.50
13. NN Model_1 с текстом (LSTM)
- Здесь мы создадим матрицу встраивания слов, используя предварительно обученные векторы Glove. Вы можете получить все коды из моего профиля на github.
- Здесь нет SMOTE, потому что речь идет о тексте.
- Затем создайте нашу модель_1, используя LSTM + плотные слои:
- Наша диаграмма model_1:
Я также создал метрическую функцию обратного вызова для f1_score, AUC score, repl_score:
Результаты этой модели:
14. Модель_2 с текстом (LSTM + Conv1D)
- Здесь я беру все три типа входных данных из разных входных слоев.
- Категориальные и числовые характеристики передаются отдельно через слой Convultion 1D.
- Я использовал слой BatchNormalization также потому, что он давал лучшие результаты.
- Затем все входные данные были объединены и, наконец, пропущены через несколько плотных слоев и слоев BatchNorm.
Результаты:
15. Модель_3 без текста (Conv1D)
- Здесь я отбросил текстовые функции и просто взял категориальные и числовые функции через разные входные каналы, а затем отдельно пропустил слои Conv1D.
- Затем объединение обоих каналов для подачи в более плотные слои и слои пакетной нормализации.
Результаты:
16. Модель_4 без текста (Simple MLP)
- В этой модели я попытался упростить задачу, используя всего несколько плотных слоев и слои пакетной нормализации.
Очки:
Примечание. Полный код см. В моем github- https://github.com/Saurabhraj5162/Diabetes_Hospital_Readmission
Сравнение моделей:
- Оценки неплохие, учитывая тот факт, что это были сильно несбалансированные данные.
- Я должен сосредоточиться на показателях запоминания как на нашей метрике, потому что это медицинская проблема.
- Но поскольку данные несбалансированы, я не могу игнорировать макро-результат F1.
- Когда речь идет об отзыве, это связь между деревом решений без текста и простой моделью MLP_4 без текста (SMOTE).
- когда речь идет о f1_score, это связь между Log. Рег. без текста (SMOTE) и Conv1D Model_3 без текста (SMOTE).
- В целом, учитывая, что f1 является нашей основной метрикой, Log. Рег. без текста (SMOTE) - лучшая модель.
- Поэтому я буду использовать логистическую регрессию в бэкэнде моего последнего приложения.
Демо-версия приложения
После окончательного выбора модели я создаю окончательную программу с использованием Python, Flask и HTML для создания приложения, которое предоставляет пользователю форму для заполнения. Форма просит пользователя заполнить все необходимые данные, и после их отправки приложение предсказывает, есть ли у пациента шансы на повторную госпитализацию:
Будущая работа
Здесь я экспериментировал с текстом, который я удалил из Интернета, например с кодами ICD9, идентификаторами выписки и т. Д., Что в конечном итоге мне не помогло. Так что мне было бы лучше, если бы мы могли больше сосредоточиться на разработке качественных функций. Например, выше я упоминал в части «Двумерный анализ», что мы могли бы создать еще несколько новых функций:
- time_outpatient = 3 num_outpatients + 2 time_in_hospital
- proc_outpatient = 2 * num_procedures + num_outpatients
- product_emerg_proc = num_emergency * procedure_per_med
- sum_time_inpatient = number_inpatient + time_in_hospital
Ссылки:
- Https://www.appliedaicourse.com/
- Https://medium.com/r/?url=http%3A%2F%2Fcs229.stanford.edu%2Fproj2017%2Ffinal-reports%2F5244347.pdf
- Https://medium.com/r/?url=https%3A%2F%2Fwww.hindawi.com%2Fjournals%2Fbmri%2F2014%2F781670%2F
- https://archive.ics.uci.edu/ml/datasets/Diabetes+130-US+hospitals+for+years+1999-2008
- Https://medium.com/r/?url=https%3A%2F%2Fthesai.org%2FDownloads%2FVolume10No2%2FPaper_36-Predicting_30_Day_Hospital_Readmission_for_Diabetes_Patients.pdf
Мой Github: https://github.com/Saurabhraj5162/
Мой LinkedIn: https://www.linkedin.com/in/saurabh-raj-445821153/