Hogyan lehet a gépi tanulással megjósolni a kórházi visszafogadást? (1. rész | 2. rész)

A cikk tartalma: Ez a bejegyzés leírja, hogyan lehet egyszerű gépi tanulási technikákat alkalmazni az egészségügyi adatok érdekes és értelmes elemzéséhez. Példaként a kórházi visszafogadás előrejelzését alkalmazzuk cukorbeteg fekvő betegeknél, és elmagyarázzuk, hogyan értük el a 94% -os pontosságot. Ez a bejegyzés egy négytagú csapat (Usman Raza, Harman Shah Singh, Ching-Yi Lin és Rohan Kar) által készített projekt eredménye, amelyet Harman és jómagam tovább alakítottunk olvasási örömére. Végigvezetjük Önt a folyamaton, kiemelve a döntéseink indokait, és bizonyos pontokon kicsit belemerülünk a Python-kódba. Megjegyzés: Bár ez a legtöbb számára elérhető, feltételezzük, hogy a python és a pandák bizonyos ismeretekkel rendelkeznek.

tanulást

jegyzet: A teljes kód- és adatfájlok itt érhetők el a Git-hub repo-nkon.

Kórházi visszafogadás az, amikor a kórházból elbocsátott beteget egy bizonyos időn belül újra felveszik. Bizonyos esetekben a kórházi visszafogadási arányok a kórházi minőség mutatójának számítanak, és hátrányosan befolyásolják az ellátás költségeit is. Ezért a Medicare & Medicaid Services központjai létrehozták a Kórházi Visszafizetések Csökkentési Programját, amelynek célja a betegek ellátásának minőségének javítása és az egészségügyi kiadások csökkentése azáltal, hogy fizetési szankciókat alkalmaznak azokra a kórházakra, amelyek bizonyos feltételekkel a vártnál magasabb visszafogadási aránnyal rendelkeznek. Bár a cukorbetegség még nem szerepel a büntetési intézkedések között, a program rendszeresen felveszi az új kórképeket a listára, amely 2018-ban összesen 6-ot tartalmaz. 2011-ben az amerikai kórházak több mint 41 milliárd dollárt költöttek diabéteszes betegekre, akiket a kiutalástól számított 30 napon belül visszafogadtak. Ha képes meghatározni azokat a tényezőket, amelyek magasabb visszafogadáshoz vezetnek az ilyen betegeknél, és ennek megfelelően képes megjósolni, hogy mely betegeket fogadják vissza, akkor a kórházak dollármilliókat takaríthatnak meg, miközben javul az ellátás minősége. Tehát, ezt a hátteret szem előtt tartva, orvosi kérdésekre vonatkozó adatállományt használtunk (az alábbi leírás), hogy megválaszoljuk ezeket a kérdéseket:

  • Milyen tényezők jósolják előre a kórházi visszafogadást cukorbetegeknél?
  • Mennyire tudjuk megjósolni a kórházi visszafogadást ebben a korlátozott funkciójú adatkészletben?

A gépi tanulási módszerek kipróbálása során (az értelmes kérdés meghatározása mellett) egy jó adatkészlet megtalálása az első kihívás. Az egészségügyi világ jelenlegi állapota olyan, hogy könnyen találhatunk olyan gazdag (hasznos információkkal teli), de piszkos (strukturálatlan tartalom vagy rendetlen sémák) vagy nagyon tiszta, de egyébként a bennük található információk szempontjából is steril adatkészleteket (lásd az alábbi ábrát) ).

Ezzel a korlátozással egy nyilvánosan elérhető adatkészletet választottunk az UCI adattárból (link), amely 130 amerikai kórház (1999–2008) azonosított diabéteszes beteg találkozási adatait tartalmazta, 10 év alatt 101 766 megfigyelést tartalmazva. Az adatkészlet több mint 50 jellemzővel rendelkezik, beleértve a beteg jellemzőit, állapotát, tesztjeit és 23 gyógyszert. Csak a diabéteszes találkozások tartoznak ide (vagyis a három elsődleges diagnózis közül legalább az egyik a cukorbetegség volt). Ezt az adatkészletet Strack et al. 2014-ben ugyanezen témáról szóló érdekes elemzésért (itt publikálva). Tehát azzal kezdjük, hogy az adatkészletet (a fenti linkről letöltött csv fájl) pandas adatkeretként töltjük be:

Az első lépés az adatkészlet kiválasztásakor néhány adatprofil készítése és a főbb jellemzők vizsgálata, ahogy az alábbi táblázatban meg is tettük:

Ettől a ponttól kezdve széles körben követtük az alábbi ábrán bemutatott folyamatot. Fontos azonban megjegyezni, hogy nincs sok tiszta elválasztás a lépések között, és sok a vissza-visszatérő ismétlés, amikor a megközelítési módok és a modellezés különböző megközelítéseit próbálják ki. Vegye figyelembe azt is, hogy meglehetősen kevés átfedés van az olyan kifejezések között, mint a funkciókészítés, a szolgáltatástervezés és az előfeldolgozás, attól függően, hogy kivel beszél.

Mielőtt rátérnénk a tényleges modellezésre, szinte mindig szükség van némi birkózásra az adatokkal. Háromféle módszert alkalmaztunk itt:

  1. Tisztítási feladatok például rossz adatok eldobása, hiányzó értékek kezelése.
  2. Módosítás a meglévő funkciók közül pl. szabványosítás, log transzformációk stb.
  3. Létrehozás vagy levezetés új funkciók, általában a meglévők.

Az egyes lépéseket az alábbiakban részletesen ismertetjük. Azonban vegye figyelembe, hogy ami most szép lépéssorozatnak tűnik, sok kísérlet és hiba kísérlete volt annak kiderítésére, hogy mi működik jól az adataink legjobb formájának elérése érdekében.

A hiányzó értékek kezelése

Először meg kell látnunk, hogy hány hiányzó érték van (amelyeket az adatok legtöbb változója „?” -Ként kódolt):

Ez hosszú listát ad nekünk, de a következő változók értékei hiányoztak:

Most a fontos rész - a tennivalók eldöntése:

Új funkciók létrehozása és/vagy átkódolása

Ez erősen szubjektív, és részben az egészségügyi szolgáltatások ismeretétől és a jellemzők közötti lehetséges kapcsolatok értelmezésétől függ. Talán több ezerféleképpen próbálkozhat itt. Kipróbáltunk néhányat (egyik sem tökéletes), és íme, miért.

Szolgáltatás igénybevétele: Az adatok az előző egy évben az adott beteg fekvőbeteg (felvételi), sürgősségi és járóbeteg-látogatásainak változóit tartalmazzák. Ezek (durva) mérések arról, hogy egy személy mennyi kórházi/klinikai szolgáltatást vett igénybe az elmúlt évben. Ezt a hármat hozzáadva létrehoztunk egy új változót, az úgynevezett szolgáltatáskihasználást (lásd az alábbi ábrát). Az ötlet az volt, hogy megnézzük, melyik verzió nyújt jobb eredményeket. Igaz, nem alkalmaztunk külön súlyozást a szolgáltatás igénybevételének három összetevőjére, de ebben a szakaszban valami egyszerűt ki akartunk próbálni.

A pythonban ezt megtenni elég egyszerű:

A gyógyszeres változások száma: Az adatkészlet 23 gyógyszer (vagy kombináció) 23 tulajdonságát tartalmazza, amelyek mindegyikükre utalnak arra, hogy változtattak-e az adott gyógyszeren a beteg jelenlegi kórházi tartózkodása alatt. Korábbi kutatások kimutatták, hogy a cukorbetegek gyógyszeres változása a felvételkor alacsonyabb visszafogadási arányokkal jár. Úgy döntöttünk, hogy megszámoljuk, hány változtatást hajtottak végre minden beteg esetében, és kijelentettük, hogy új funkció. Ennek az az oka volt, hogy egyszerûen leegyszerûsítik a modellt, és esetleg kapcsolatot találnak számos változással, függetlenül attól, hogy melyik gyógyszert változtatták meg. A pythonban ezt:

Ennek eredményének ellenőrzéséhez az value_counts () metódust használjuk, amely szép kúpos eloszlást biztosít:

A felhasznált gyógyszerek száma: Egy másik esetlegesen összefüggő tényező lehet a beteg által alkalmazott gyógyszerek teljes száma (ami állapotuk súlyosságára és/vagy az ellátás intenzitására utalhat). Tehát létrehoztunk egy másik funkciót a találkozás során alkalmazott gyógyszerek megszámlálásával (az alábbi kódban változó kulcsokat fentről folytatjuk):

A kimenet ellenőrzése:

A diagnózisok kategorizálása: Az adatkészlet legfeljebb három diagnózist tartalmazott egy adott beteg esetében (elsődleges, másodlagos és kiegészítő). Ezek mindegyikének azonban 700–900 egyedi ICD-kódja volt, és rendkívül nehéz ezeket beépíteni a modellbe és értelmesen értelmezni. Ezért ezeket a diagnosztikai kódokat 9 betegségkategóriába bontottuk, szinte hasonló módon, mint az eredeti kiadványban ezt az adatkészletet használva. Ez a 9 kategória magában foglalja a keringést, a légzést, az emésztést, a cukorbetegséget, a sérülést, a mozgásszervi, az urogenitális, a daganatos betegségeket és másokat. Noha ezt elsődleges, másodlagos és kiegészítő diagnózisok esetében tettük, végül úgy döntöttünk, hogy modellünkben csak az elsődleges diagnózist alkalmazzuk. Ennek a pythonban való elvégzése kissé nehézkes volt, mert nos, a betegség kódjait feltérképezzük bizonyos kategóriák nevére. Az alábbi kódnak ezt könnyen be kell mutatnia.

Most az eredmény ellenőrzéséhez:

Ezen a ponton érdemes elvégeznünk az elvégzett munkát egy csv fájlba biztonsági mentésként, így később onnan tölthető be, hogy a fenti lépéseket ne kellene elvégeznie.

Néhány más változó összecsukása: Csakúgy, mint a diagnózisok, jó néhány kategória volt a felvételi forrás, a felvételi típus és a mentesítési hajlandóság szempontjából. Ezeket a változókat kevesebb kategóriába bontottuk, ahol volt értelme. Például az 1., 2. és 7. felvételi típus megfelel a sürgősségi, sürgősségi ellátásnak és a traumának, ezért egyetlen kategóriába sorolták őket, mivel ezek mind nem választható helyzetek. A rövidség kedvéért az alábbiakban csak a belépési típushoz adunk mintát a python kódhoz:

Néhány változó átkódolása: Az eredeti adatkészlet karakterlánc-értékeket használt a nem, a faj, a gyógyszerváltozás és a felhasznált 23 gyógyszer mindegyike tekintetében. Annak érdekében, hogy e változókat jobban illesszük a modellünkbe, értelmezzük a változókat numerikus bináris változókká, hogy tükrözzék azok jellegét. Például kódoltuk a „gyógyszercsere” funkciót a „Nem” (nincs változás) és a „Ch” (megváltozott) értékre 0-ra és 1-re. A kódot az alábbiakban adjuk meg:

Az A1C teszt eredményét és a glükóz szérum teszt eredményeit is Normal, abnormális és Not tesztelt kategóriákba soroltuk.

Az eredményváltozó átkódolása: Az általunk vizsgált eredmény az, hogy a beteget 30 napon belül visszavisszük-e a kórházba, vagy sem. A változónak valójában 30 és nincs visszafogadási kategóriája. A probléma bináris besorolásra való csökkentése érdekében a 30 nap utáni visszafogadást és a visszafogadás nélkül egyetlen kategóriába kapcsoltuk:

Az életkor kezelése: Különböző módon lehet ezt kezelni. Az adatkészlet csak 10 éves kategóriákat ad meg nekünk, ezért nem tudjuk az egyes betegek pontos életkorát. Az ezen adatkészlettel kapcsolatos korábbi tanulmány nominális változóként használta az életkategóriákat, de szerettük volna látni, hogy az életkor növekedése milyen hatással van a visszafogadásra, még ha durván is. Ehhez feltételezzük, hogy a beteg életkora átlagosan a korosztály középpontjában fekszik. Például, ha a beteg korosztálya 20-30 év, akkor feltételezzük, hogy az életkor = 25 év. Tehát a korosztályokat középpontokká alakítottuk át, így numerikus változót kaptunk:

Több találkozás összeesése ugyanazon páciensnél

Az adatkészlet néhány betegének többször is találkozott. Nem számíthattuk őket független találkozásként, mert ez torzítja az eredményeket azokra a betegekre, akiknek többször is volt találkozása. Így több technikát is kipróbáltunk több találkozás összecsukására és megszilárdítására ugyanazon beteg számára, mint például:

  1. Több találkozáson felüli több mint 2 visszafogadás összecsukott rekord visszafogadásának tekintése.
  2. Figyelembe véve az átlagos kórházi tartózkodást többszörös találkozás során.
  3. Figyelembe véve a gyógyszeres változások százalékos arányát több találkozás során
  4. Figyelembe véve a találkozások teljes számát a találkozás egyedi azonosítójának helyettesítésére
  5. Figyelembe véve a többszörös találkozások diagnózisainak kombinációját listaként

Azonban például a „diagnózis” jellemzőinek figyelembe vételével nem találtuk értelmesnek több kategorikus értéket tömbbe egyesíteni az adatmodell elkészítéséhez. Ezután az első és az utolsó találkozást külön-külön tekintettük a többszörös találkozás lehetséges ábrázolására. A legutóbbi találkozások azonban rendkívül kiegyensúlyozatlan adatokat szolgáltattak az újracsatolásokról (96/4-es visszajelzések és nincsenek újraküldések), és ezért úgy döntöttünk, hogy többszörös találkozással rendelkező betegek első találkozásait alkalmazzuk. Ez azt eredményezte, hogy az adatkészlet körülbelül 70 000 találkozásra csökkent:

Numerikus jellemzőink előzetes elemzése feltárta, hogy ezek közül sok erősen ferde és magas kurtosisú. Összehasonlításképpen: a normális eloszlás ferdesége 0, és a kurtosis feleslege (a tényleges kurtosis különbsége az ideális normális eloszlás 3-as értékétől), amelyet a kurtosis () függvény normális eloszlás esetén ad vissza, 0, ami hatással lenne a szabványosításra. Az olyan jellemzők, mint a sürgősségi látogatások száma, a szolgáltatás igénybevétele, a fekvőbeteg-befogadások száma és a járóbeteg-látogatások száma nagy volt a torzulás és a kurtosis. Így log transzformációt hajtottunk végre, ahol a ferdeség vagy a kurtosis meghaladja a -2 ≤ ferde és a kurtosis ≤ 2 határokat. Mivel a log (0) nincs meghatározva, úgy döntöttünk, hogy a következő szabályt alkalmazzuk:

  1. Számítsa ki a log (x) értéket bármely x elemre, ha a 0-k százaléka x ≤ 2% -ban, a nullák eltávolítása után. Ez biztosította, hogy ne távolítsuk el tömegesen azokat a rekordokat, amelyek prediktív erővel rendelkeznek más oszlopok számára.
  2. Más módon számítsa ki a log1p (x) értéket (a log1p (x) log (x + 1) -t jelent, a nullák megtartása mellett.

A tényleges napló transzformáció végrehajtásához a python kód eléggé egyenes. Létrehozunk egy új oszlopot, és megegyezünk az átalakítandó oszlop np.log vagy np.log1p értékével:

A log1p használata log helyett attól függ, hogy az értékek milyen kicsiek. Erről külön oktatóanyag áll rendelkezésünkre, és kódot fog tartalmazni a napló-átalakítások automatikus ellenőrzéséhez és végrehajtásához. Nézz vissza később.

Mivel log transzformációt használtunk annak biztosítására, hogy a numerikus változók Gauss-szerű vagy normális eloszlásúak legyenek (a log transzformáció előtt), vagy log transzformáltak legyenek a normális eloszlás biztosítása érdekében, úgy döntöttünk, hogy numerikus jellemzőinket a képlet segítségével egységesítjük:

Ennek kódolása a pythonban egy egyszerű függvény, amely tömböket és adatkereteket vesz be inputként, és visszaadja azok szabványosított verzióit:

A kiugró értékek eltávolítása

Mivel biztosítottuk, hogy a log transzformáció után minden változónk majdnem normális legyen (ahol szükséges), az eloszlásoknak többé-kevésbé normálisaknak kell lenniük. A lefedettségi szabály használata a normál eloszláshoz, amelyet az alábbi ábrával lehet összefoglalni:

Az átlag két oldalán lévő 3 SD-n belüli adatok 99,7% -ot tartalmaznak, a fennmaradó 0,3% -ot pedig outlierként kezeljük. Ennek a logikának az alkalmazásával adatainkat 3 SD-ra korlátoztuk mindkét oldalon, az egyes numerikus oszlopok átlagától:

Interakciós feltételek

A változók kölcsönösen befolyásolhatják a visszafogadást, az úgynevezett interakciókat. Az interakciós kifejezések lehetséges jelöltjeit úgy tudjuk azonosítani, hogy elméleti értelme van, és megfigyeljük a prediktor változók korrelációs mátrixát, hogy lássuk, melyek tűnnek erősen korreláltnak. Korrelációs mátrix létrehozása a pythonban egyszerű, de tiszta módszert szeretnénk a korrelációs értékek rendezésére. Mivel ez hosszú listát eredményez, felül kell írnunk a listáknál a jupyter notebook alapértelmezett megjelenítési méretét is:

Ez remekül formázott kimenetet nyújt számunkra. Az alábbiakban csak hármat mutatunk be kétféle helyzet bemutatására:

Ebben a listában kétféle helyzet van:

  1. Az egyik változó a másik származékában található: A fenti példákban a járóbeteg-látogatások száma a szolgáltatás igénybevételének része. Ezt a funkciót azonban mi magunk hoztuk létre, ezért ebben az esetben az a döntésünk, hogy ezeket ne tegyük ugyanabba a tulajdonságkészletbe (két később leírt jellemzőkészletet használtunk). Hasonlóképpen, a diabetesMed (bármilyen előírt diabetikus gyógyszer) szerepel az alkalmazott gyógyszerek számában. Úgy döntöttünk, hogy ebben az esetben elvetjük a diabetesMed-et az elemzésből, mert jól látható, hogy ezek a betegek valamilyen diabéteszes gyógyszert kapnak.
  2. Lehetséges tényleges ko variancia: A másik helyzet két változó tényleges ko-varianciája. Úgy tűnik, hogy ez a helyzet a gyógyszerek számával és azzal kapcsolatban, hogy változtatást hajtottak-e végre, vagy sem, és van némi intuitív értelme is. Így létrehoztunk interakciós feltételeket ilyen esetekre.

A pythonban ezt a következő módon tették meg:

Adategyensúlyozás

Az adatok viszonylag kiegyensúlyozatlanok voltak a visszafogadások tekintetében (a 30 napos visszavételeknél csak 10% rekord), ami nagy pontosságot eredményezett. Ezenkívül a nagy pontosság nem annak köszönhető, hogy modellünket általánosítottuk volna a különféle betegrekordokkal, hanem az alapszintű 90% -os pontossággal: azt jósoltuk, hogy egyetlen beteget sem fogadnak vissza. Ez nyilvánvaló volt a modellünk rossz pontossága és felidézése alapján a betegek visszafogadásának előrejelzésében. Szintetikus kisebbségi túlmintavételi technikát (SMOTE) használtunk az alulreprezentált visszafogadási osztály felülmintázására és a felülreprezentált és alulreprezentált osztályok egyenlő képviseletére.

A technikáról bővebben itt olvashat. Az alábbi pillanatkép az egyik modellünk előrejelzéseiből az adatok kiegyenlítése előtt és után azt mutatja, hogy a hatás lényegesen alacsonyabb a 2. típusú hibaként:

Mint láthatjuk, a 2-es típusú hibák jelentősen csökkentik az egyensúlyozást, ami jobb visszahívást jelent a modellünk számára. Ez azt jelenti, hogy a visszafogadottak alacsonyabb hányada várható, hogy nem fogadják vissza őket: kritikus mutató a kórházak és a biztosítási ügynökségek számára mind pénzügyi, mind megelőző egészségügyi szempontból.