RETAIN ist ein interpretierbares Vorhersagemodell für Anwendungen im Gesundheitswesen. Anhand von Patientenakten kann es Vorhersagen treffen und gleichzeitig erklären, wie jeder medizinische Code (Diagnosecodes, Medikamentencodes oder Verfahrenscodes) bei jedem Besuch zur Vorhersage beiträgt. Die Interpretation ist aufgrund der Verwendung neuronaler Aufmerksamkeitsmechanismen möglich.
Mit RETAIN können Sie berechnen, wie positiv/negativ jeder medizinische Code (Diagnose, Medikament oder Verfahrenscode) bei verschiedenen Besuchen zum Endergebnis beiträgt. In diesem Fall prognostizieren wir, ob bei dem jeweiligen Patienten eine Herzinsuffizienz (HF) diagnostiziert wird. Sie können sehen, dass die Codes, die einen hohen Bezug zu HF haben, positive Beiträge leisten. RETAIN lernt auch, neuen Informationen mehr Aufmerksamkeit zu schenken als alten Informationen. Sie können sehen, dass die Herzrhythmusstörung (CD) einen größeren Beitrag leistet, da sie bei dem neueren Besuch auftritt.
RETAIN implementiert einen Algorithmus, der im folgenden Artikel vorgestellt wurde:
RETAIN: An Interpretable Predictive Model for Healthcare using Reverse Time Attention Mechanism
Edward Choi, Mohammad Taha Bahadori, Joshua A. Kulas, Andy Schuetz, Walter F. Stewart, Jimeng Sun,
NIPS 2016, pp.3504-3512
Das RETAIN-Papier formuliert das Modell so, dass es in jedem Zeitschritt Vorhersagen treffen kann (z. B. versuchen Sie vorherzusagen, welche Diagnosen der Patient bei jedem Besuch erhalten wird) und behandelt die Sequenzklassifizierung (z. B. wird bei ihm anhand einer Patientenakte eine Herzinsuffizienz diagnostiziert). die Zukunft?) als Sonderfall, da die Sequenzklassifizierung die Vorhersage nur im letzten Zeitschritt trifft.
Dieser Code ist jedoch implementiert, um die Sequenzklassifizierungsaufgabe auszuführen. Mit diesem Code können Sie beispielsweise vorhersagen, ob es sich bei dem jeweiligen Patienten um einen Patienten mit Herzinsuffizienz handelt oder nicht. Oder Sie können vorhersagen, ob dieser Patient in Zukunft wieder aufgenommen wird. Die allgemeinere Version von RETAIN wird in Zukunft veröffentlicht.
SCHRITT 1: Installation
Installieren Sie Python, Theano. Wir verwenden Python 2.7, Theano 0.8. Theano kann wie hier vorgeschlagen einfach in Ubuntu installiert werden
Wenn Sie GPU-Berechnungen verwenden möchten, installieren Sie CUDA
Laden Sie den RETAIN-Code herunter bzw. klonen Sie ihn
SCHRITT 2: Schnelle Möglichkeit, RETAIN mit MIMIC-III zu testen
In diesem Schritt wird beschrieben, wie RETAIN mit einer minimalen Anzahl von Schritten mithilfe von MIMIC-III trainiert wird, um die Sterblichkeit von Patienten anhand ihrer Besuchsaufzeichnungen vorherzusagen.
Sie müssen zunächst Zugriff auf MIMIC-III beantragen, eine öffentlich zugängliche elektronische Gesundheitsakte, die von Intensivpatienten über einen Zeitraum von 11 Jahren gesammelt wurde.
Sie können „process_mimic.py“ verwenden, um den MIMIC-III-Datensatz zu verarbeiten und einen geeigneten Trainingsdatensatz für RETAIN zu generieren. Platzieren Sie das Skript an demselben Speicherort, an dem sich die MIMIC-III-CSV-Dateien befinden, und führen Sie das Skript aus. Der Ausführungsbefehl ist python process_mimic.py ADMISSIONS.csv DIAGNOSES_ICD.csv PATIENTS.csv <output file>
.
Führen Sie RETAIN mit der von „process_mimic.py“ generierten Datei „.seqs“ und „.morts“ aus. Die Datei „.seqs“ enthält die Reihenfolge der Besuche für jeden Patienten. Jeder Besuch besteht aus mehreren Diagnosecodes. Wir empfehlen jedoch stattdessen die Verwendung der Datei „.3digitICD9.seqs“, da die Ergebnisse viel besser interpretierbar sind. (Oder Sie können die einstufige klinische Klassifizierungssoftware für ICD9 verwenden, um die Anzahl der Codes auf einige Hundert zu reduzieren, was die Leistung noch weiter verbessert.) Die Datei „.morts“ enthält die Reihenfolge der Mortalitätskennzeichnungen für jeden Patienten. Der Befehl lautet python retain.py <3digitICD9.seqs file> 942 <morts file> <output path> --simple_load --n_epochs 100 --keep_prob_context 0.8 --keep_prob_emb 0.5
. 942
ist die Nummer aller im Datensatz verwendeten dreistelligen ICD9-Codes.
Um das Modell auf seine Interpretation hin zu testen, lesen Sie bitte Schritt 6. Ich persönlich habe festgestellt, dass perinatale Gelbsucht (ICD9 774) eine hohe Korrelation mit der Mortalität aufweist.
Das Modell erreicht mit dem obigen Befehl eine AUC über 0,8, aber die Interpretationen sind nicht ganz klar. Sie könnten die Hyperparameter optimieren, aber ich bezweifle, dass sich die Dinge dramatisch verbessern werden. Immerhin machten nur 7.500 Patienten mehr als einen einzigen Krankenhausbesuch, und die meisten von ihnen hatten nur zwei Besuche.
SCHRITT 3: So bereiten Sie Ihren eigenen Datensatz vor
Der Trainingsdatensatz von RETAIN muss eine Python-cPickled-Liste oder eine Liste sein. Die äußerste Liste entspricht den Patienten, die mittlere der Besuchssequenz, die jeder Patient durchgeführt hat, und die innerste Liste entspricht den medizinischen Codes (z. B. Diagnosecodes, Medikamentencodes, Verfahrenscodes usw.), die bei jedem Besuch aufgetreten sind. Zunächst müssen medizinische Codes in eine Ganzzahl umgewandelt werden. Dann kann ein einzelner Besuch als eine Liste von ganzen Zahlen betrachtet werden. Dann kann ein Patient als Besuchsliste angezeigt werden. Beispielsweise bedeutet [5,8,15], dass dem Patienten bei einem bestimmten Besuch die Codes 5, 8 und 15 zugewiesen wurden. Wenn ein Patient zwei Besuche [1,2,3] und [4,5,6,7] durchgeführt hat, kann dies in eine Liste mit den Listen [[1,2,3], [4,5,6,7] umgewandelt werden ]]. Mehrere Patienten können als [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]] dargestellt werden, was bedeutet Es gibt zwei Patienten, bei denen der erste Patient zwei Besuche und der zweite Patient drei Besuche machte. Diese Liste muss mit cPickle eingelegt werden. Wir bezeichnen diese Datei als „Besuchsdatei“.
Zur Ausführung von RETAIN ist die Gesamtzahl der eindeutigen medizinischen Codes erforderlich. Wenn der Datensatz beispielsweise 14.000 Diagnosecodes und 11.000 Verfahrenscodes verwendet, beträgt die Gesamtzahl 25.000.
Der Label-Datensatz (nennen wir ihn „Label-Datei“) muss eine Python-cPickled-Liste sein. Jedes Element entspricht der wahren Bezeichnung jedes Patienten. Beispielsweise kann 1 der Fallpatient und 0 der Kontrollpatient sein. Wenn es zwei Patienten gibt, bei denen nur der erste Patient ein Fall ist, dann sollten wir [1,0] haben.
Die „Besuchsdatei“ und die „Labeldatei“ müssen jeweils drei Sätze haben: Trainingssatz, Validierungssatz und Testsatz. Die Dateierweiterung muss „.train“, „.valid“ bzw. „.test“ sein.
Wenn Sie beispielsweise eine Datei mit dem Namen „my_visit_sequences“ als „Besuchsdatei“ verwenden möchten, versucht RETAIN, „my_visit_sequences.train“, „my_visit_sequences.valid“ und „my_visit_sequences.test“ zu laden.
Dies gilt auch für die „Label-Datei“
Als zusätzliche Informationsquelle können Sie die Zeitangaben zu den Besuchen nutzen. Nennen wir dies „Zeitdatei“. Beachten Sie, dass die Zeitinformationen beliebig sein können: Dauer zwischen aufeinanderfolgenden Besuchen, kumulierte Anzahl von Tagen seit dem ersten Besuch usw. „Zeitdatei“ muss als Python-cPickled-Liste vorbereitet werden. Die äußerste Liste entspricht den Patienten und die innerste Liste enthält die Zeitinformationen jedes Besuchs. Beispiel: Bei einer „Besuchsdatei“ [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]] , könnte die entsprechende „Zeitdatei“ wie folgt aussehen: [[0, 15], [0, 45, 23]], wenn wir die Dauer zwischen den aufeinanderfolgenden Besuchen verwenden. (Natürlich sind die Zahlen gefälscht und ich habe die Dauer für den ersten Besuch auf Null gesetzt.) Verwenden Sie die Option --time_file <path to time file>
um „Zeitdatei“ zu verwenden. Denken Sie daran, dass „.train“, „. gültig“ gilt die „.test“-Regel auch für die „Zeitdatei“.
Zusätzlich: Verwendung Ihrer eigenen medizinischen Codedarstellungen
RETAIN lernt intern während des Trainings die Vektordarstellung medizinischer Codes. Diese Vektoren werden natürlich mit Zufallswerten initialisiert.
Sie können jedoch auch Ihre eigenen medizinischen Codedarstellungen verwenden, sofern Sie über eine solche verfügen. (Sie können mithilfe von Skip-Gram-ähnlichen Algorithmen trainiert werden. Weitere Informationen finden Sie unter Med2Vec oder hier.) Wenn Sie die medizinischen Codedarstellungen bereitstellen möchten, muss es sich um eine Liste (im Grunde eine Matrix) mit N Zeilen und handeln M Spalten, wobei N die Anzahl der eindeutigen Codes in Ihrer „Besuchsdatei“ und M die Größe der Codedarstellungen ist. Geben Sie den Pfad zu Ihrer Codedarstellungsdatei mit --embed_file <path to embedding file>
an. Selbst wenn Sie Ihre eigenen medizinischen Codedarstellungen verwenden, können Sie diese außerdem neu trainieren (auch Feinabstimmung genannt), während Sie RETAIN trainieren. Verwenden Sie dazu die Option --embed_finetune
. Wenn Sie keine eigenen medizinischen Codedarstellungen bereitstellen, verwendet RETAIN eine zufällig initialisierte Darstellung, was offensichtlich diesen Feinabstimmungsprozess erfordert. Da standardmäßig die Feinabstimmung verwendet wird, müssen Sie sich darüber keine Gedanken machen.
SCHRITT 4: RETAIN ausführen
Die Mindesteingabe, die Sie zum Ausführen von RETAIN benötigen, ist die „Besuchsdatei“, die Anzahl der eindeutigen medizinischen Codes in der „Besuchsdatei“, die „Etikettendatei“ und der Ausgabepfad. Im Ausgabepfad werden die gelernten Gewichte und das Protokoll gespeichert.
python retain.py <visit file> <# codes in the visit file> <label file> <output path>
Durch Angabe der Option --verbose
wird der Trainingsprozess nach jeweils 10 Mini-Batches gedruckt.
Sie können die Größe des einbettenden W_emb, die Größe der verborgenen Ebene der GRU, die Alpha generiert, und die Größe der verborgenen Ebene der GRU, die Beta generiert, angeben. Die entsprechenden Befehle sind --embed_size <integer>
, --alpha_hidden_dim_size <integer>
und --beta_hidden_dim_size <integer>
. Beispielsweise weist --alpha_hidden_dim_size 128
RETAIN an, eine GRU mit einer 128-dimensionalen verborgenen Ebene zum Generieren von Alpha zu verwenden.
Dropouts werden an zwei Stellen angewendet: 1) auf die Eingabeeinbettung, 2) auf den Kontextvektor c_i. Die jeweiligen Abbrecherquoten können mit --keep_prob_embed {0.0, 1.0}
und --keep_prob_context {0.0, 1.0}
angepasst werden. Dropout-Werte wirken sich auf die Leistung aus, daher wird empfohlen, sie an Ihre Daten anzupassen.
L2-Regularisierungen können auf W_emb, w_alpha, W_beta und w_output angewendet werden.
Zusätzliche Optionen können angegeben werden, z. B. die Größe der Batch-Größe, die Anzahl der Epochen usw. Detaillierte Informationen können über python retain.py --help
abgerufen werden
Meine persönliche Empfehlung: Verwenden Sie eine milde Regularisierung (0,0001 ~ 0,001) für alle vier Gewichtungen und einen moderaten Dropout nur für den Kontextvektor. Dies hängt jedoch vollständig von Ihren Daten ab, daher sollten Sie die Hyperparameter immer selbst anpassen.
SCHRITT 5: Erhalten Sie Ihre Ergebnisse
RETAIN überprüft die AUC des Validierungssatzes nach jeder Epoche und speichert das aktuelle Modell, wenn sie höher als alle vorherigen Werte ist. Die Modelldatei wird von numpy.savez_compressed generiert.
Schritt 6: Testen Sie Ihr Modell
Mithilfe der Datei „test_retain.py“ können Sie die Beiträge jedes medizinischen Codes bei jedem Besuch berechnen. Zuerst benötigen Sie ein trainiertes Modell, das von numpy.savez_compressed gespeichert wurde. Beachten Sie, dass Sie die Konfiguration kennen müssen, mit der Sie RETAIN trainiert haben (z. B. Verwendung von --time_file
, Verwendung von --use_log_time
).
Auch hier benötigen Sie die auf die gleiche Weise vorbereitete „Besuchsdatei“ und „Etikettendatei“. Diesmal müssen Sie jedoch nicht die Regel „.train“, „.valid“, „.test“ befolgen. Das Testskript versucht, den Dateinamen wie angegeben zu laden.
Sie benötigen außerdem die Zuordnungsinformationen zwischen den tatsächlichen medizinischen Zeichenfolgencodes und ihren Ganzzahlcodes. (Beispiel: „Hypertonie“ wird auf 24 abgebildet.) Diese Datei (nennen wir sie „Zuordnungsdatei“) muss ein Python-cPickled-Wörterbuch sein, in dem die Schlüssel die Zeichenfolgen für medizinische Codes und die Werte die entsprechenden ganzen Zahlen sind. (Beispiel: Die von „process_mimic.py“ generierte Zuordnungsdatei ist die „.types“-Datei.) Diese Datei ist erforderlich, um die Beiträge jedes medizinischen Codes in einem benutzerfreundlichen Format auszudrucken.
Für die zusätzlichen Optionen wie --time_file
oder --use_log_time
sollten Sie genau dieselbe Konfiguration verwenden, mit der Sie das Modell trainiert haben. Für detailliertere Informationen verwenden Sie die Option „--help“.
Die Mindesteingaben zum Ausführen des Testskripts sind „Modelldatei“, „Besuchsdatei“, „Labeldatei“, „Zuordnungsdatei“ und „Ausgabedatei“. In der „Ausgabedatei“ werden die Beiträge gespeichert. python test_retain.py <model file> <visit file> <label file> <mapping file> <output file>