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

Содержание:

* Объяснение проблемы

* Понимание данных

* Существующие подходы

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

* Первый подход

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

* Двумерный анализ

* Особенности кодирования

* Модельное обучение

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

* Демонстрационное видео приложения

* Будущая работа

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

Объяснение проблемы

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

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

В этом исследовании используется Национальная база данных Health Facts National Database (Cerner Corporation, Канзас-Сити, Миссури), в которой собраны обширные клинические записи из сотен больниц по всей территории США, но здесь мы используем только часть этой базы данных, которая состоит из встреч между примерно 100000 и 130 пациентами с диабетом. Больницы США.

Источник: https://archive.ics.uci.edu/ml/datasets/Diabetes+130-US+hospitals+for+years+1999-2008

Приложение из реальной жизни

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

Все встречи, используемые для анализа, удовлетворяют пяти ключевым критериям:

  1. Это госпитализация.

2. Пациент был классифицирован как диабетик (по крайней мере, один из трех первоначальных диагнозов включал диабет).

3. Срок пребывания от 1 до 14 дней.

4. Больному проведено лабораторное обследование.

5. Во время пребывания в стационаре больной принимал лекарства.

Реадмиссию можно разделить на три большие категории:

1. Запланировано: по прямому назначению врача.

2. Незапланированный: повторная госпитализация, которой не должно было произойти, если бы были приняты надлежащие меры.

3. Неизбежно: вполне предсказуемые повторные госпитализации из-за характера состояния пациента.

Итак, эта проблема состоит в том, чтобы разделить некоторых пациентов на три класса:

1. Нет реадмиссии

2. Повторная госпитализация ‹30 дней: очень плохая ситуация и сильно зависит от качества медицинской помощи в медицинском центре.

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

Понимание данных

Приведенная ниже таблица взята из этого документа - Влияние измерения HbA1c на частоту повторной госпитализации: анализ 70 000 историй болезни пациентов из клинической базы данных (hindawi.com)

Существующие подходы

  1. Документ 1: 5244347.pdf (stanford.edu)

2. Документ 2: Влияние измерения HbA1c на частоту повторной госпитализации: анализ 70 000 историй болезни пациентов из клинической базы данных (hindawi.com)

3. Документ 3: Прогнозирование 30-дневной повторной госпитализации пациентов с диабетом с использованием многослойного персептрона (thesai.org)

Теперь позвольте мне познакомить вас с моим решением:

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

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

Примечание. Полный код см. В моем github- https://github.com/Saurabhraj5162/Diabetes_Hospital_Readmission

У нас есть 2 набора данных:

  1. 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, повторный прием]

  1. 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:

  1. time_in_hospsital сильно коррелирует с разрядом_disposition_id
  2. Encter_id и Patient_id - это просто уникальные идентификаторы, поэтому нас это не волнует.
  3. admission_source_id имеет некоторую корреляцию с admission_type_id

Наблюдение 2:

  1. num_lab_procedures хорошо коррелирует с num_medication.
  2. num_procedures сильно коррелирует с num_medication
  3. number_emergency немного коррелирует с number_inpatient

Разберем некоторые особенности на основе пропущенных значений:

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

  1. «Вес» почти все значения равны нулю («?»), Я опущу этот столбец.
  2. medical_speciality и payer_codes также имеют много нулевых значений, но все же у нас есть более 50% значений, поэтому мы увидим их позже.

Безвариантный анализ

Я построю графики подсчета с оттенком классов (0 и 1), а также распечатаю фрейм данных, который содержит процент каждой категории конкретной функции, которая была повторно принята, используя:

  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:

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

Первый подход

Я создам два набора фреймов данных:

  1. С текстовым описанием admission_type_id, разряда_disposition_id, admission_source_id, diag_1, diag_2 и diag_3.
  2. Без текстового описания

Для данных с текстом я буду использовать следующие модели:

  • Логистическая регрессия (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)

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

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

  1. Заполнение нулевых значений (в данном случае «?») Признака «гонки», поскольку в нем отсутствует менее 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)

Кодирование числовых функций

Наконец, мы создадим три набора входных данных:

  1. Ввод, включая текст (лук)
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

Ссылки:

  1. Https://www.appliedaicourse.com/
  2. Https://medium.com/r/?url=http%3A%2F%2Fcs229.stanford.edu%2Fproj2017%2Ffinal-reports%2F5244347.pdf
  3. Https://medium.com/r/?url=https%3A%2F%2Fwww.hindawi.com%2Fjournals%2Fbmri%2F2014%2F781670%2F
  4. https://archive.ics.uci.edu/ml/datasets/Diabetes+130-US+hospitals+for+years+1999-2008
  5. 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/