Update: voorspelling van heropname binnen 30 dagen na ontslag

In januari werden hier de eerste resultaten gepresenteerd van een neuraal netwerk dat in staat was heropname binnen 30 dagen na ontslag uit een ziekenhuis te voorspellen. Sindsdien zijn de resultaten verbeterd en de inzichten veranderd. Daarom heb ik het artikel grotendeels herschreven en de resultaten van een update voorzien.

Samenvatting

  • Dit artikel beschrijft een methode waarmee een algoritme kan worden geconstrueerd dat in staat is om ziekenhuis-heropnames te voorspellen. Het algoritme presteert beter dan tot dusver gepubliceerde vergelijkbare algoritmen.
  • Het algoritme kan worden aangevuld met een functie die de uitkomst verklaart aan de hand van de gebruikte variabelen. Er zijn verschillende methoden waarmee de bijdrage van individuele variabelen of clusters van variabelen kan worden gevisualiseerd. Hiermee wordt een belangrijke drempel weggenomen voor gebruik van dit soort algoritmen.
  • Het algoritme is vanwege het leunen op de implementatie van het EPD bedoeld voor het St Jansdal Ziekenhuis. De gebruikte methode om tot dit algoritme te komen is daarentegen wél herbruikbaar in een ander ziekenhuis. Bestaande algoritmen, die wél in andere ziekenhuizen zouden moeten kunnen worden gebruikt blijken minder accuraat. Het gemak waarmee dit soort modellen nu kunnen worden gemaakt, suggereert dat het maken van minder nauwkeurige (inter)nationaal bruikbare algoritmen geen voordeel hebben.
  • Ieder ziekenhuis zou moeten beschikken over een afdeling die in staat is om samen met de zorgverleners dit soort algoritmen te maken. Een nationaal zorg AI platform zou kennis en methoden om algoritmen te maken kunnen verzamelen en het gebruik kunnen promoten. Dit zou zowel implementatie als gebruik van AI in de zorg stimuleren tegen waarschijnlijk lagere kosten dan een introductie en verspreiding door de markt met bijbehorende service- en licentiekosten. Omdat de verwachting is dat dit soort modellen een belangrijke rol gaan spelen in de zorg, is nadenken over dit kostenaspect op dit moment belangrijk.
deel van de Shap violinplot, zie Resultaten

Ik wil eerst nog enkele uitgangspunten herhalen, die ik in eerdere blog-posts noemde:

  1. Iedere arts kan zich bekwamen in machine learning, als er maar interesse is (en een growth-mindset). Er zijn inmiddels vele cursussen waaruit gekozen kan worden, enkele goede instapcursussen werden eerder al op dit blog genoemd. Er komt een punt waarop kennis van programmeren, calculus en waarschijnlijkheidsleer helpen, maar ook deze onderwerpen worden in vele online cursussen behandeld.
  2. Als met behulp van machine learning een voorspellend model gemaakt wordt, dan werkt dat model het beste op patiëntengegevens uit de populatie waaruit de patiëntengegevens kwamen die gebruikt werden om het model te trainen. Met andere woorden, als in ziekenhuis A een model wordt getraind, dat werkt dat model waarschijnlijk beter in ziekenhuis A dan in ziekenhuis B. Verdiep je er dus vooral in hoe je een model maakt, niet hoe je aan een model komt.
  3. Machine learning bestaat uit een krachtige instrumentenset die in ieder ziekenhuis zou moeten worden ingezet om kwaliteit en efficiëntie te verhogen. Ik zou ieder ziekenhuis daarom willen adviseren hun business intelligence afdeling uit te breiden met data-scientists zodat zelfstandig de technieken van machine learning kunnen worden ingezet. De meeste commerciële bedrijven met 1.500+ werknemers hebben dat al lang gedaan en doen er hun voordeel mee. Wacht er niet te lang mee want het duurt minimaal een jaar voordat de eerste machine learning modellen in productie zijn.

Eerste model: heropnamerisico

Ik heb ervoor gekozen om te beginnen met een model dat in staat moet zijn om heropnames te voorspellen. Hiervoor zijn enkele redenen. Allereerst is een heropname voor patiënten en naasten vaak een traumatische gebeurtenis. Heropnames gaan gepaard met toegenomen morbiditeit en mortaliteit. Het voorkomen van heropnames is dan ook een doel op zich. Daarnaast zijn er enkele eerdere modellen elders gemaakt, die heropnames kunnen voorspellen. Een nieuw model kan dus vergeleken worden met bestaande modellen. Omdat bestaande modellen niet in Nederland zijn gemaakt, laat staan in ons ziekenhuis, is het ten slotte de moeite waard om een model te maken met behulp van geanonimiseerde patiëntengegevens uit het ziekenhuis, zodat daarmee de eigen patiënten beter bediend kunnen worden, waarbij natuurlijk rekening wordt gehouden met de AVG.

Modellen van elders vs eigen model

Om te visualiseren dat een model dat in een ander land getraind is waarschijnlijk minder goed presteert in Nederland (of Harderwijk in dit geval). In ons EPD werd een bestaand model geimplementeerd, dat in de USA in een tweetal ziekenhuizen werd getraind. Het betrof een LASSO logistic regression analysis. De area under the curve was aldaar 0,74. In ons ziekenhuis kwam de area under the curve niet boven 0,68, beduidend lager en vergelijkbaar met een simpeler heropnamemodel zoals de LACE+ score.

Validatie van bestaand model uit USA in ons ziekenhuis

Point of care

Het is belangrijk om precies te specificeren waarvoor het model gebruikt gaat worden. Dat heeft namelijk direct invloed op de bouw van het model. Het doel van het model is om professionals een gereedschap in handen te geven waarmee ze bij ontslag hun aandacht kunnen focussen op die patiënten, die vanwege een verhoogd risico op heropname die aandacht nodig hebben. Met andere woorden, om de kwaliteit te verhogen zonder dat het meer gaat kosten. Het is de vraag of het de hoofdbehandelaar moet zijn die hierop gaat letten. Als een chirurgische patiënt bij ontslag een verhoogd risico op heropname heeft vanwege multimorbiditeit, bijvoorbeeld met hartfalen en diabetes mellitus, dan kan je beter aan de ziekenhuisarts, internist of geriater vragen hier een behandelplan voor op te stellen dan aan de chirurg. De uitkomst van het model moet daarbij interpretabel zijn; de factoren die sterk bijdragen aan de voorspelling moeten zichtbaar zijn voor de arts die hiermee verder gaat.

Project heropname

Daarmee ben je er natuurlijk nog niet. Om hier vervolgens mee aan de slag te gaan moet een project worden gestart met alle stakeholders gericht op implementatie in de kliniek. Het is niet het doel van dit blog om hier verder op in te gaan. Iedere projectmatig denkende clinicus kan dit in zijn eigen ziekenhuis opzetten.

Methoden (kort)

Allereerst wil ik benadrukken dat dit model nog niet af is. Belangrijke gegevens moeten worden toegevoegd zoals medicatiegegevens, geslacht, vitale parameters, orders en poliklinische contacten. Ondanks dat gemis blijkt het model nu al heropnames te kunnen voorspellen, waarmee wat mij betreft bevestigd wordt dat dit iets is dat ieder ziekenhuis zelf zou moeten kunnen. Daarnaast zullen verder in de tekst steeds meer technische termen gebruikt worden. Ik zou de collega’s die niet bekend zijn met het onderwerp zijn willen adviseren daar overheen te lezen en te focussen op de resultaten.

De uitleg van de methoden is kort en zeker niet uitputtend. In een later blog ga ik hier meer op in maar voor nu wil ik vooral een proof of concept neerleggen. Ik overweeg om in een later stadium mijn bevindingen elders te publiceren, waarbij het de conclusie niet niet het model zelf wordt, maar vooral de weg er naartoe. Buiten mijn ziekenhuis is dit model waarschijnlijk niet bruikbaar, maar de methode wel. Dit gebrek aan generaliseerbaarheid en extrapoleerbaarheid moet ook niet gezien worden als een gebrekkige uitkomst maar als een consequentie van één van de doelen van het model, namelijk een optimale lokale voorspelling geven, rekening houdend met lokale factoren. Andersom zou ik durven stellen dat modellen zoals LACE+ juist gebrekkig zijn omdat ze zo weinig lokale factoren kunnen meenemen in de voorspelling. Als blijft dat lokale factoren – zoals de cultuur van mijn ziekenhuis, afdelings- en specialismespecifieke karakteristieken – kunnen leiden tot verhoogde kans op heropname, dan biedt dat kansen op kwaliteitsverbetering. Het model werd geprogrammeerd in python 3.6 via Jupyter Notebook. Hieraan werden vele pakketten toegevoegd, waaronder Numpy, Pandas, Tensorflow, Keras, SciPi, SciKitPlot, SKLearn, Matplotlib, Shap, Imblearn, GpyOpt, enz.

De gebruikte features

In het model wordt gebruik gemaakt van gegevens over opnameduur en -datum, afdeling, specialisme, aantal SEH-bezoeken en bijbehorende parameters, een aantal laboratoriumbepalingen, problemen op de probleemlijst (ICD-10) en leeftijd. Zoals boven aangegeven komen hier in de toekomst nog medicatiegegevens, geslacht, orders en poliklinische contacten bij.

Het heropname-label

De definitie van heropname is in dit model iedere spoedopname, die binnen 30 dagen na een indexopname start en die minimaal één nacht heeft geduurd. Een indexopname moet ook minimaal één nacht hebben geduurd. Tussen 1-10-2016 en 1-10-2018 waren volgens deze definitie in ons ziekenhuis 5,6% van de opnames heropnames.

Keuze van het machine learning model

In de medische setting moet een model in mijn ogen aan de volgende voorwaarden voldoen:

  • De uitkomst moet overeenkomen met een gouden standaard. In dit geval moet de voorspelde kans op heropname overeenkomen met de daadwerkelijke fractie heropnames. Dit is het doel van ieder model, dus bepaalt niet zo zeer de keuze. Er zijn diverse instrumenten beschikbaar om dit vast te stellen.
  • De uitkomst moet interpretabel zijn. Dat is bij machine learning modellen een aandachtspunt. Gelukkig zijn er inmiddels diverse instrumenten die hierbij helpen.
  • Het model moet goed om kunnen gaan met de aangeboden gegevens. Ook dat is een aandachtspunt. Medische gegevens in een patiëntendossier zijn berucht. Ze worden niet verzameld om achteraf als cohort te worden beoordeeld maar voor patiëntenzorg. Die moet zinnig en zuinig zijn. Daarom zullen gegevens vaak ontbreken als ze voor de patiënt niets opleveren. De gegevens moeten meestal worden bewerkt en klaargezet voor het model.
  • Het model moet op basis van de aangeboden gegevens een zinnige voorspelling kunnen doen. Dat betekent in dit geval dat gekozen moet worden voor een model dat met minder data een bruikbare uitkomst kan opleveren. End-to-end modellen – waarbij ruwe gegevens zonder voorbewerking worden aangeboden en bij de uitgang van het model na trainen een voorspelling volgt – worden daardoor minder interessant omdat zij vaak minstens het tienvoudige aan gegevens nodig hebben om te kunnen werken.
  • Het model moet verbanden tussen de gegevens kunnen herkennen en op basis hiervan de voorspelling kunnen aanpassen.
  • Het liefst wil je ook een uitspraak kunnen doen over de betrouwbaarheid van de voorspelling.

Op grond van bovenstaande voorwaarden kom ik uit op een ‘decision tree’-model gebaseerd model of een neuraal netwerk. De laatste voorwaarde is dan nog niet meegenomen, daarvoor is een bayesiaans neuraal netwerk nodig. Ik heb nu gekozen voor zowel een regulier neuraal netwerk met drie verborgen lagen, als het ‘decision tree’-model LightGBM. Het is de bedoeling om in een latere fase met Bayesiaanse neurale netwerken te experimenteren.

Preprocessing

Een neuraal netwerk kan niet gevoed worden met ruwe patiëntendata. De gegevens moeten leesbaar worden gemaakt voor het model. Er moet een tabel worden gemaakt met voor iedere opname een rij en voor iedere mogelijke factor of patiëntenkarakteristiek een kolom. Om het model te helpen heb ik problemen in de probleemlijst in HSMR-groepen ingedeeld. Daarnaast heb ik de 200 meest voorkomende problemen in de probleemlijst toegevoegd als kolom. Laboratoriumwaarden werden in twee mandjes gestopt: één voor de uitslagen van de laatste twee weken en één voor de uitslagen daarvoor. Voor iedere bepaling werd voor ieder mandje een kolom gemaakt met het gemiddelde, de standaarddeviatie, het aantal metingen, het ontbreken van metingen, de laatste meting en de verschillen tussen de mandjes. Categorische variabelen werden ‘one hot’ gecodeerd.

Medische gegevens zijn berucht om hun grillige karakter. Als zonder onderzoeksopzet achteraf gegevens uit een EPD geëxtraheerd worden blijken veel gegevens te ontbreken, simpelweg omdat ze voor het medisch proces niet nodig zijn en verzamelen ervan verspilling van gemeenschapsgeld zou betekenen en mogelijk risico voor de patiënt t.g.v. overdiagnostiek. Bovenstaande bewerkingen leverden een tabel op met veel ontbrekende waarden. Deze ontbrekende waarden kunnen op verschillende manieren worden ingevuld, zoals simpelweg met een nul, met het gemiddelde, de mediaan of met complexere methoden zoals een variational autoencoder, waarover later meer. In eerste instantie werden alle ontbrekende waarden, vervangen door het gemiddelde van de variabelen. Later in het proces zullen deze ontbrekende waarden worden ingevuld met behulp van een variational autoencoder.

De set werd verdeeld in een trainings-, validatie- en testset met een verhouding van 70:15:15. Alle transformaties van de dataset, zoals normalisatie en missing data imputation, werden gefit op de trainingsset, zodat er geen informatie uit de validatie- en testset in de trainingsdata lekte.

Trainen met ongebalanceerde data

5,6% van de opnames in de dataset werd gevolgd door een heropname. Trainen met behulp van zulke ongebalanceerde data resulteert vaak in een model dat de neiging heeft de minder vaak voorkomende uitkomst niet te herkennen. Dit resulteert in een minder betrouwbaar model. Het is dus van belang om zo’s disbalans te herkennen en hier maatregelen tegen te treffen. Er zijn grofweg 3 methoden om hier mee om te gaan. Undersampling, oversampling of aanpassen van het algoritme om hier rekening mee te houden.

Bij undersampling wordt een willekeurig deel van de meest voorkomende uitkomst verwijderd. Dit wordt wel gedaan bij ‘huge data’, bij miljoenen of miljarden casus , omdat bij het verwijderen van een deel van die data waarschijnlijk weinig informatie verloren gaat. In ons geval, bij ruwweg 25000 opnames, is dat in mijn ogen geen optie. De kans is te groot dat belangrijke informatie uit onze populatie verloren gaat, waardoor het model slechter wordt.

Bij oversampling wordt met behulp van een methode, zoals SMOTE of generatief model zoals een variational autoencoder of een generative adversarial network, nieuwe data gegenereerd op basis van de oude data. Ik heb geëxperimenteerd met zowel SMOTE als de variational autoencoder en kwam tot de conclusie dat een getrainde variational autoencoder beter nieuwe trainingsdata genereert dan het SMOTE-algoritme. Het is niet de scope van dit blog om hierover uit te weiden maar ik zal wel kort de variational autoencoder bespreken omdat ik die later zal gebruiken voor het invullen van de missing data.

In feite is een variational autoencoder een neuraal netwerk, dat bestaat uit twee in spiegelbeeld aan elkaar geplakte neurale netwerken waarbij de middelste laag verdeeld is in een mu-laag (gemiddelde) en sigma-laag (standaard deviatie) die gebruikt worden als normaalverdeling waaruit gesampeld wordt voor het rechter deel van het netwerk:

Variational autoencoder

Nu volgt een wat wiskundig-technisch verhaal. Bij het trainen van dit netwerk wordt er namelijk naar gestreefd de output van het netwerk de input te laten benaderen. De informatie van de input wordt alleen wel door een vernauwing in het netwerk geperst. Deze vorm forceert het netwerk de ingevoerde gegevens te ‘coderen’ in een kleinere hoeveelheid variabelen in het midden. Een soort compressie. Bij deze variational autoencoder wordt – in tegenstelling tot bij een ‘gewone’ autoencoder – tijdens trainen de kansdichtheidsfunctie van de middelste knopen benaderd. Omdat uitrekenen van deze kansdichtheidsfunctie normaal gesproken vanwege de complexiteit leidt tot een niet oplosbare integraal, wordt gepoogd de achterafverdeling te benaderen met kansdichtheidsfuncties die wel uitgerekend kunnen worden, zoals de Normaalverdeling. Dit wordt variational inference genoemd. Door nu te samplen uit die getrainde verdelingen en ze aan het rechter deel van het netwerk aan te bieden ‘hallucineert’ het netwerk vervolgens nieuwe opnames die aan de dataset kunnen worden toegevoegd. Het bleek voor oversamplen wel noodzakelijk om het model te trainen met alleen de daadwerkelijke ‘wel heropname’-casus (conditioneel trainen bleef tot ongebalanceerde uitkomsten leiden). De nieuwe opnames zullen stochastisch verdeeld alle eigenschappen bevatten die het model na training heeft kunnen onthouden. Door deze opnames toe te voegen aan de originele dataset kunnen de klassen gebalanceerd worden. Dit blijkt verbazingwekkend goed te werken. Langs deze route kunnen ook ‘missing’ variabelen worden ingevuld in bestaande opnames. Hoewel de input van de missing variabelen het gemiddelde van die variabele was, is de output van de variational autoencoder een variabele die stochastisch gezien het meest waarschijnlijk is. Omdat het model niet alleen naar de variabele kijkt maar ook naar de samenhang van de hele dataset is de resulterende variabele waarschijnlijk meer realistisch dan een simpel gemiddelde van de hele groep. Het blijkt dat het resulterende voorspellende model beter is als de data op deze manier voorbewerkt wordt. Vanzelfsprekend mag de variational autoencoder alleen getraind worden op de trainingdata of ‘dataleakage’ te voorkomen. Saillant detail: deze variational autoencoder is een Nederlandse uitvinding.

Ten slotte kan er ook voor gekozen worden het voorspellende model zelf rekening te laten houden met de disbalans van uitkomsten. In het geval van een neuraal netwerk kan de ‘loss-function’ aangepast worden zodanig dat het verkeerd voorspellen van de minst voorkomende uitkomst (bij ons de daadwerkelijke heropname, die kwam immers maar 5,6% voor) een hogere penalty krijgt. Keras en tensorflow hebben hier functionaliteit voor ingebouwd die gemakkelijk gebruikt kan worden. Hoewel ik in het begin de variational autoencoder gebruikte voor oversampling blijkt uiteindelijk een hogere penalty voor verkeerd voorspellen van de kleinere groep in ons geval het beste werken. Ik denk dat dit komt omdat ik in de loop van de tijd meer variabelen aan het model heb toegevoegd.

Het neurale netwerk

Er werd gebruik gemaakt van een standaard neuraal netwerk. Voor de kenners: met drie verborgen lagen, ieder met dropout en batchnormalization. De activatiefunctie van de verborgen lagen was ‘relu’ en van de voorspellende laag de sigmoid-functie. Naast dropout werd L2-regularizatie gebruikt om overfitten te voorkomen.

schematische weergave van het neurale netwerk

Het trainen: Bayesiaanse optimalisatie

Om vervolgens het neurale netwerk optimaal te trainen moeten de verschillende verborgen lagen in het netwerk de optimale hoeveelheid knopen hebben. Er zijn verschillende methoden om achter deze aantallen te komen. Met de hand zou ik niemand aanraden. Vaak wordt ‘random search’ gebruikt, een techniek waarbij de grootte van de verborgen lagen, de dropout-ratio en de learning-rate binnen grenzen willekeurig worden gekozen, net zo vaak tot een keer een mooie uitkomst wordt gevonden. Eleganter is het om Bayesiaanse optimalisatie te gebruiken, waarbij op grond van Gaussiaanse curven wordt getracht de meest logische volgende grootte van de verborgen lagen, de dropout-ratio en de learning-rate te kiezen. Dit werkt sneller en zorgt uiteindelijk ook voor betere optimalisatie dan random search. Het doel van de Bayesiaanse optimalisatie was het maximaliseren van de F1.5-score (een aangepaste F1-score, zie resultaten).

De gradient boosting machine

Het tweede algoritme dat gebruikt werd betreft de ‘gradient boosting machine’. Dit is een algoritme dat automatisch veel beslisbomen genereert en de minder goed passende beslisbomen verwerpt, terwijl de sterke beslisbomen worden behouden. De uiteindelijke voorspelling is een ‘ensemble’ van de beslisbomen die enige voorspellende waarde hebben. Hierbij levert iedere beslisboom een gewogen bijdrage aan de voorspelling. Dit algoritme geldt als één van de sterkste machine learning algoritmen. Smaken zijn onder andere het XGBoost-algoritme en het LightGBM-algoritme.

Voorbeeld van een gedeelte van een automatisch gegenereerde beslisboom. In het kader is de contour van de hele beslisboom te zien.

Resultaten: tijdsinvestering

De meeste tijd zat in het trainen van mezelf: ik ben nu ruim een jaar in mijn vrije tijd bezig en die tijd heb je nodig om uiteindelijk dit soort modellen in python te leren programmeren. Ik kan me voorstellen dat er weinig dokters zijn die dat ook willen doen. Ziekenhuizen zullen een weg moeten vinden om dit te organiseren samen met een enthousiaste dokter, die genoeg weet om dit samen met een BI-team te doen. Ik zou ziekenhuizen nogmaals willen adviseren deze kennis in huis te halen en niet uit te besteden.

Ik kon vanaf begin oktober aan de slag met de data en na drie maanden had ik de eerste resultaten. Inmiddels is het model een stuk beter zodat ik het nodig vond om dit blog van een update te voorzien. Zou ik met de kennis van nu opnieuw beginnen, dan zou ik vermoedelijk binnen een maand een werkend model hebben. Overigens is er altijd ruimte voor verbetering maar ’the worst enemy of good is better’.

Resultaten: de modellen

Onderstaande resultaten hebben allen betrekking op de testset. Het neurale netwerk wordt verder ‘Keras’ genoemd. De gradient boosting machhine wordt verder LightGBM genoemd. Het Keras-model en het LightGBM-model hebben de volgende area’s under the curve:

AUC- of ROC-curve van neuraal netwerk
AUC- of ROC-curve van LightGBM-model

De AUC hangt af van de verhouding tussen de sensitiviteit en de specificiteit of zoals hier weergegeven de echtpositieve ratio en de foutpositieve ratio. Als de kromme curve op de stippellijn zit dan kan je evengoed een muntje opgooien, de AUC is dan 0,5. In dit geval hebben de modellen een AUC van gemiddeld 0,8 en daarmee voorspellende waarde, waarbij het LightGBM-model iets beter lijkt. Ter vergelijking: het model van Google heeft een AUC van 0.75 en het model van Epic 0.74. Ik ben in de literatuur geen beter model tegengekomen. We zullen de testwaarden verder bestuderen, afgezet tegen de mogelijke afkapwaarden:

Metrics van neuraal netwerk
Metrics van LightGBM-model

Opvallend is dat het neurale netwerk bij hogere cut-off waarden een acceptabeler sensitiviteit (in de grafiek ‘recall’) heeft dan het LightGBM-model. Daar staat tegenover dat de precision, ofwel positief voorspellende waarde, zeer matig blijft vergeleken met het LightGBM-model.

ongecorrigeerde kalibratiecurve
gecorrigeerde kalibratiecurve

De calibratiecurve wordt getoond van het neurale netwerk. Boven zonder correctie, onder met correctie (predictie ^ 1,8 * 0,37). De plots lijken bedroevend. De sterkste voorspellingen van het neurale netwerk vangen namelijk maximaal ca. 35% van de echt-positieven. Dat betekent trouwens niet dat het neurale netwerk onbruikbaar is. De kalibratiecurve van he LightGBM-model is beduidend beter (volgt). Hieronder volgen confusion-plots van beide modellen. Hiervoor wordt een cut-off waarde gebruikt waarbij de sensitiviteit 0,75 is. Bovenstaande metricscurven visualiseren dat deze cut-off waarde verschilt per model.

Confusion-matrix van neuraal netwerk bij een sensitiviteit van 0,75

Confusion-matrix van LightGBM-model bij een sensitiviteit van 0,75

Bij het neurale netwerk gaat een sensitiviteit van 0,75 gepaard met een specificiteit van 0,69, terwijl de specificiteit bij het LightGBM-model in dat geval 0,72 is. Het lightGBM-model lijkt dus weer iets beter. Dit betekent, dat de ~30% hoogst scorende patiënten in 3 op de 4 gevallen heropgenomen worden. Of bij alle patiënten extra middelen moeten worden ingezet ter voorkoming van heropnames of slechts bij 30%, zal aanzienlijk schelen in de kosten.

Resultaten: interpretabiliteit

Machine learning algoritmes worden door gebruikers (en zeker artsen) vaak als ‘black box’ beschouwd, juist vanwege het ontbreken van inzicht in hoe het model tot zijn voorspelling komt. Dit heeft een ongunstig effect op geloofwaardigheid en adoptie. Om dit te voorkomen, is het nodig die variabelen te laten zien die de grootste invloed op de voorspelling hadden. Hiervoor zijn inmiddels prachtige tools beschikbaar zoals SHAP en sommige algoritmen, zoals LightGBM, laten zelf zien welke variabelen belangrijk zijn voor de uitkomst:

Visualisatie van bijdrage van variabelen aan uitkomst van LightGBM-model, weergegeven met behulp van het model. Of de invloed positieve of negatief is wordt niet weergegeven.

Visualisatie van bijdrage van variabelen aan uitkomst van LightGBM-model, weergegeven met behulp van SHAP. SHAP visualiseert ook met behulp van de kleur of de bijdrage positief of negatief was.

De bar-chart van het LightGBm model geeft wel een contributie weer maar niet of deze contributie positief of negatief is. De SHAP-grafiek daarentegen toont ‘violin-plots’ van de variabelen met de hoogste impact. De dikte van de horizontale figuur geeft weer hoe vaak de waarde voorkomt, de plaats op de x-as geeft weer hoe groot het effect is en de kleur rood geeft weer dat het de voorspelling versterkt. Een probleem is dat deze visualisatie beperkt is tot de beste variabelen. De modellen gebruiken ~2800 variabelen en het neurale netwerk maakt ook nog binaire variabelen van de continu variabelen zodat het neurale netwerk in totaal zelfs ~8000 variabelen heeft. Het is dus nodig om de gebruikte variabelen op de een of andere manier te clusteren. Het ligt voor de hand dat op basis van de soort variabele te doen, zoals hieronder gevisualiseerd voor een aantal variabelen uit de probleemlijst:

Bijdrage van variabelen uit de probleemlijst. De HSMR-variabelen blijken na de totale aantallen problemen het sterkst bij te dragen.

Visualiseren van de bijdrage van de variabelen en clusters van variabelen zal een belangrijke bijdrage leveren aan het ont-‘blackboxen’ van machine learning modellen. Dat betekent natuurlijk niet dat in dit geval de heropnames voorkomen kunnen worden door de sterk bijdragende factoren te elimineren. Als bijvoorbeeld zou blijken dat gebruik van antistolling het risico op heropname verhoogd, dan weet iedere zorgverlener dat staken van antistolling niet de oplossing is. Iedere patiënt met een verhoogd risico moet zorgvuldig beoordeeld worden voordat een beleid kan worden gemaakt, dat gericht is op het voorkomen van heropname.

Uitdagingen

Zoals boven aangegeven is dit model niet voltooid. Dat zal het overigens ook nooit zijn. Van de volgende acties verwacht ik dat ze een gunstig effect op de kwaliteit van het model hebben:

  • Fout-analyse: zijn er factoren in het EPD aan te wijzen die nu niet bekeken worden maar die gebruikt kunnen worden voor betere voorspellingen?
  • Artsen willen ook weten hoe betrouwbaar de voorspelling is. De voorspelling moet dus een geloofwaardigheidsinterval krijgen. Daarvoor is een Bayesiaans neuraal netwerk nodig.

Belangrijkste conclusies

  • Het blijkt goed mogelijk om met machine learning op basis van de data in een elektronisch patiëntendossier een bruikbaar model te creëren dat heropnames kan voorspellen.
  • Een competitief model voor voorspelling van heropnames kan in ieder ziekenhuis worden gemaakt als de data in het EPD toegankelijk zijn en kennis en kunde beschikbaar zijn.
  • Generaliseerbaarheid en nauwkeurigheid zitten elkaar bij machine learning in de weg. Als het model nauwkeuriger wordt voor ziekenhuis A vanwege variabelen die typisch zijn voor dat ziekenhuis, wordt het minder nauwkeurig voor ziekenhuis B. Variabelen in een EPD weerspiegelen de cultuur van een ziekenhuis en dit kan bijdragen aan voorspellende waarde van een model. Volgens mij moeten we met machine learning niet altijd nastreven een model te creëren dat in alle ziekenhuizen werkt, maar juist profiteren van de ziekenhuis-specifieke variabelen om kwaliteitsslagen te maken.
  • Als ieder ziekenhuis de kennis in huis creëert om dit soort modellen te maken dan maakt dat vele verbeteringen op het vlak van kwaliteit en efficiency mogelijk.
  • Het zou veel tijd en geld besparen als in Nederland een centraal zorg-AI-platform zo worden opgericht waar de kennis op het vlak van machine learning wordt samengebalt om alle ziekenhuizen de mogelijkheid te geven deze technologie in te zetten om kwaliteit van zorg te verbeteren.

Laat gerust een commentaar achter als je opmerkingen hebt. Dit blog zal waarschijnlijk in de nabije toekomst worden aangevuld. Blijf op de hoogte: schrijf je in voor de mailing.

13 gedachten over “Update: voorspelling van heropname binnen 30 dagen na ontslag”

  1. Inzichtelijk verhaal.

    Wel de vraag of alle model-matige verbeteringen nodig zijn voor invoeren. Als t model al heel goed presteert is maar de vraag hoeveel winst er nog in zit. Ik denk dat goede implementatie dan waardevoller is. Hoe zie jij dit?

    1. Hoi Jesse, dank voor het commentaar. Ik denk dat het voor de stabiliteit van het model op lange termijn beter is om de input variabelen zo breed mogelijk te laten zijn. Voor mijn gevoel is dat nu nog niet zo. Maar dat is misschien meer intuïtie dan dat ik het hard kan maken.

      Daarnaast blijft het natuurlijk leerzaam om te bekijken wat het effect is van die veranderingen. Ook met het oog op alle toekomstige modellen.

      Implementatie is een hoofdstuk op zich. Daar kan ik later waarschijnlijk ook meerdere blogs over schrijven..

  2. Hoi Bart-Jan,
    Dank voor je heldere blogpost, klinkt inderdaad als een interessante casus!

    Omdat het inderdaad gaat om een ongebalanceerde dataset heb ik eens gekeken naar de precision, recall en F1 score, berekend vanuit de confusionplot die je laat zien. Precision benoem je zelf al, met 0.16. Recall kom ik uit op 0.5 (120/(120+119)), wat de F1 score 0.25 maakt. Dit is in ieder geval beter dan een all-negative (F1 = 0) of all-positive model (F1 = 0.11). In vergelijking heeft het model dus inderdaad in ieder geval wat voorspellende waarde ten opzichte van alles negatief of alles positief.

    Als het gaat om fout-analyse, op welke fouten zou je dan eerst willen focussen? Zijn het de false negatives – de patiënten die je zonder nazorg naar huis zou sturen – of het grotere aantal false positives – de patiënten die je onnodig nazorg zou geven? Lijkt me interessant om te zien wat je veranderingen gaan doen met het model!

    1. Beste Kirsten, leuke analyse! Ik zal de plots toevoegen die ik gebruikt heb ter illustratie. Zowel foutpositieven als foutnegatieven zijn leerzaam. Ik verwacht alleen meer van toevoegen van features en slimme correctie van missing/infinite data, dus dat ga ik eerst doen. Wordt vervolgd!

  3. Beste Bart-Jan,
    Mooi artikel van je; bedankt!
    Zie onderstaand citaat; heb je hier een referentie van?
    Groet, Paul Algra

    Als met behulp van machine learning een voorspellend model gemaakt wordt, dan werkt dat model het beste op patiëntengegevens uit de populatie waaruit de patiëntengegevens kwamen die gebruikt werden om het model te trainen. Met andere woorden, als in ziekenhuis A een model wordt getraind, dat werkt dat model waarschijnlijk beter in ziekenhuis A dan in ziekenhuis B. Verdiep je er dus vooral in hoe je een model maakt, niet hoe je aan een model komt.

    1. Beste Paul, dank voor je compliment. Ik heb geen referentie, maar het is een algemeen onderzoeksgegeven, dat ik heb kunnen staven met de validatie van een bestaand heropname-algoritme dat in de USA een AUC van 0.74 heeft en op onze data slechts AUC van 0.68.

  4. Hi Bart-Jan,

    Thank you for sharing your work! In particular, the variational autoencoder seems to have many interesting applications.

    Did you consider training a LASSO logistic regression? It has built-in feature selection, you get interpretable global- and individual-prediction level feature contributions, and in my experience has performance that is usually competitive with more advance methods (XGBoost, neural nets). As an extra bonus, prediction confidence intervals address the uncertainty in the predictions.

    Although your data set is unbalanced (6% readmission rate) it is not horribly so, so I wonder if you omitted the oversampling step with the autoencoder how both LASSO and your net would do on the raw data. (At least for LASSO, the model would be self-calibrating, saving one more step in your pipeline.)

    Regards,

    Alejandro

    1. Hi Alejandro,

      Thanks for your comment. Since I posted this blog, I’ve implemented a number of extra techniques:
      – I am indeed using LASSO (or L1 regularization) for feature selection / shrinkage of the input layer of the neural net (with visualization to the end-user and speed in mind) but I haven’t tried a single logistic regression, I’ll give it a try.
      – I am still using the variational autoencoder, but especially for missing data imputation. This way training yields better scores than with conventional imputation tools
      – I don’t need the variational autoencoder anymore for balancing the dataset: I am using the class_weight parameter of Keras (why didn’t anyone tell me that before…). This yields better results than oversampling. The GPyOpt finds a class_weight for ‘1’ of about 6 (considerably less than the 1:18 ratio of readmissions).
      – I started using L2-regularization as well to avoid overfitting even more.
      – I’m using KBinsDiscretizer to discretize continuous data, hoping that the neural net will find relations more easy.
      Despite all these efforts I couldn’t get a better AUC than 0.78 with a neural network (which happens to be the best reported AUC for this classification problem so far, so I could argue that it’s not bad at all).

      Interestingly, I achieved an AUC of 0.81 with a LightGBM-classifier! I had to leave al new discretized/binarized features out, otherwise the classifier was worse (I guess a decision tree algorithm creates better discretization by itself when compared to the simple quantiles from KBinsDiscretizer).

      Still, my plan was to optimize a neural network and train a comparable Bayesian neural network after that to be able to come up with a credibility interval, just the way we – doctors – like it.
      As far as I know there is no real Bayesian gradient boosting algorithm. Thus, if the neural net doesn’t get any better, I’ll have to settle for point estimates and use the LightGBM-algorithm for on-line validation. I’ll try to find some time to write this up in a new blog.

      1. This is great work, Bart-Jan. I think if you decided on publishing this it would be very well received, especially if you could address how predictions would be used in workflow to inform decision making, and the eventual impact on readmission scores/patient outcomes. (Maybe the subject for a 2nd blog post.) Thanks once again!

        Alejandro

  5. Interessant verhaal uit de praktijk! Ik kwam hier via een linked-in post van Marion Beumer en ben zelf ook erg geinteresseerd in ML en AI. Ik ben me via zelfstudie verder aan het ontwikkelen. Bedankt voor het delen!

    Michiel Huitema

  6. Beste Bart-Jan, mooi artikel en stimulerend om er zelf mee aan de slag te gaan! Ik zou het erg op prijst stellen mocht je hierover een webinar willen geven voor de EuSoMII, weliswaar in het Engels. Je kan enkele voorbeelden van webinars vinden op https://www.eusomii.org/webinars/
    Het interessante aan onze society is dat het een mix betreft van radiologen, klinisch fysici, IT professionals e.d. met als bedoeling onze kennis en ervaring onderling te delen, alsook (en dat is misschien nog het belangrijkst) de medici / artsen specialisten / radiologen actief te engageren in de imaging informatics, inclusief A.I.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.