RETAIN は、医療アプリケーション向けの解釈可能な予測モデルです。患者記録が与えられると、各訪問時の各医療コード (診断コード、投薬コード、または処置コード) が予測にどのように寄与するかを説明しながら予測を行うことができます。神経的注意メカニズムを使用しているため、解釈が可能です。
RETAIN を使用すると、さまざまな来院時の各医療コード (診断、投薬、または処置コード) が最終スコアにどの程度プラス/マイナスで寄与するかを計算できます。この場合、特定の患者が心不全 (HF) と診断されるかどうかを予測します。 HF と関連性の高いコードがプラスに寄与していることがわかります。 RETAIN はまた、古い情報よりも新しい情報に注意を払うことを学びます。不整脈 (CD) は、最近の訪問で発生するほど大きく寄与していることがわかります。
RETAIN は、次の論文で紹介されているアルゴリズムを実装します。
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
RETAIN 論文は、各タイムステップで予測できるようにモデルを定式化し (たとえば、各訪問で患者がどのような診断を受けるかを予測しようとする)、順序分類を扱います (たとえば、患者の記録が与えられた場合、彼は次の時点で心不全と診断されるかどうか)将来?) シーケンス分類は最後のタイムステップでのみ予測を行うため、特殊なケースとして扱われます。
ただし、このコードはシーケンス分類タスクを実行するために実装されています。たとえば、このコードを使用して、特定の患者が心不全患者であるかどうかを予測できます。あるいは、この患者が将来再入院するかどうかを予測することもできます。 RETAIN のより一般的なバージョンは将来リリースされる予定です。
ステップ 1: インストール
Python、Theanoをインストールします。 Python 2.7、Theano 0.8を使用します。ここで提案されているように、Theano は Ubuntu に簡単にインストールできます
GPU 計算を使用する場合は、CUDA をインストールしてください
RETAIN コードをダウンロード/複製する
ステップ 2: MIMIC-III を使用して RETAIN をテストする簡単な方法
このステップでは、MIMIC-III を使用して最小限のステップ数で RETAIN をトレーニングし、来院記録を使用して患者の死亡率を予測する方法について説明します。
まず、11 年間にわたって ICU 患者から収集された公的に利用可能な電子医療記録である MIMIC-III へのアクセスをリクエストする必要があります。
「process_mimic.py」を使用して MIMIC-III データセットを処理し、RETAIN に適切なトレーニング データセットを生成できます。 MIMIC-III CSV ファイルと同じ場所にスクリプトを配置し、スクリプトを実行します。実行コマンドはpython process_mimic.py ADMISSIONS.csv DIAGNOSES_ICD.csv PATIENTS.csv <output file>
です。
process_mimic.py によって生成された「.seqs」および「.morts」ファイルを使用して RETAIN を実行します。 「.seqs」ファイルには、各患者の一連の訪問が含まれています。各訪問は複数の診断コードで構成されます。ただし、結果がより解釈しやすくなるため、代わりに「.3digitICD9.seqs」ファイルを使用することをお勧めします。 (または、ICD9 用の単一レベル臨床分類ソフトウェアを使用して、コードの数を数百に減らすこともできます。これにより、パフォーマンスがさらに向上します) 「.morts」ファイルには、各患者の一連の死亡ラベルが含まれています。コマンドは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
データセットで使用されている 3 桁の ICD9 コード全体の番号です。
解釈用のモデルをテストするには、ステップ 6 を参照してください。私は個人的に、周産期黄疸 (ICD9 774)が死亡率と高い相関関係があることを発見しました。
上記のコマンドでモデルは 0.8 を超える AUC に達しますが、その解釈はあまり明確ではありません。ハイパーパラメータを調整することもできますが、状況が劇的に改善されるとは思えません。結局のところ、複数回病院を訪れたのは 7,500 人の患者だけで、ほとんどの患者は 2 回しか来院していません。
ステップ 3: 独自のデータセットを準備する方法
RETAIN のトレーニング データセットは、Python cPickled リストのリストのリストである必要があります。最も外側のリストは患者に対応し、中間のリストは各患者が行った訪問シーケンスに対応し、最も内側のリストは各訪問内で発生した医療コード (診断コード、投薬コード、処置コードなど) に対応します。まず、医療コードを整数に変換する必要があります。そうすれば、1 回の訪問を整数のリストとして見ることができます。これにより、患者を訪問リストとして表示できるようになります。たとえば、[5,8,15] は、特定の訪問時に患者にコード 5、8、および 15 が割り当てられたことを意味します。患者が [1,2,3] と [4,5,6,7] の 2 回の訪問を行った場合、リスト [[1,2,3]、[4,5,6,7] のリストに変換できます。 ]]。複数の患者は [[[1,2,3], [4,5,6,7]]、[[2,4]、[8,3,1]、[3]]] として表すことができます。つまり、 2 人の患者がおり、最初の患者は 2 回来院し、2 番目の患者は 3 回来院しました。このリストのリストは、cPickle を使用してピクルする必要があります。このファイルを「訪問ファイル」と呼びます。
RETAIN を実行するには、一意の医療コードの総数が必要です。たとえば、データセットで 14,000 の診断コードと 11,000 の手順コードが使用されている場合、合計数は 25,000 になります。
ラベル データセット (これを「ラベル ファイル」と呼びます) は、Python cPickled リストである必要があります。各要素は各患者の真のラベルに対応します。たとえば、1 が症例患者で、0 が対照患者である可能性があります。患者が 2 人いて、最初の患者のみが症例である場合は、[1,0] になるはずです。
「訪問ファイル」と「ラベル ファイル」には、それぞれトレーニング セット、検証セット、テスト セットの 3 つのセットが必要です。ファイル拡張子はそれぞれ「.train」、「.valid」、「.test」である必要があります。
たとえば、「my_visit_sequences」という名前のファイルを「訪問ファイル」として使用する場合、RETAIN は「my_visit_sequences.train」、「my_visit_sequences.valid」、および「my_visit_sequences.test」をロードしようとします。
「ラベルファイル」も同様です
訪問に関する時間情報を追加の情報源として使用できます。これを「タイムファイル」と呼ぶことにします。時間情報は、連続する訪問間の期間、最初の訪問からの累積日数など、何でもよいことに注意してください。「時間ファイル」は、リストの Python cPickled リストとして準備する必要があります。最も外側のリストは患者に対応し、最も内側のリストは各訪問の時間情報に対応します。たとえば、「訪問ファイル」[[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]] があるとします。 、連続する訪問間の期間を使用している場合、対応する「タイム ファイル」は [[0, 15], [0, 45, 23]] のようになります。 (もちろん、数字は偽であり、最初の訪問の期間をゼロに設定しました。) 「タイム ファイル」を使用するには--time_file <path to time file>
オプションを使用します。「.train」、「」であることを覚えておいてください。 valid」、「.test」ルールは「タイムファイル」にも適用されます。
追加: 独自の医療コード表現の使用
RETAIN は、トレーニング中に医療コードのベクトル表現を内部で学習します。もちろん、これらのベクトルはランダムな値で初期化されます。
ただし、独自の医療コード表現がある場合は、それを使用することもできます。 (スキップグラムのようなアルゴリズムを使用してトレーニングできます。詳細については、Med2Vec またはこれを参照してください。) 医療コード表現を提供したい場合、それは N 行のリスト (基本的には行列) でなければなりません。 M 列。N は「訪問ファイル」内の固有のコードの数、M はコード表現のサイズです。 --embed_file <path to embedding file>
を使用して、コード表現ファイルへのパスを指定します。さらに、独自の医療コード表現を使用している場合でも、RETAIN をトレーニングするときにそれらを再トレーニング (微調整) することができます。これを行うには、 --embed_finetune
オプションを使用します。独自の医療コード表現を提供していない場合、RETAIN はランダムに初期化された医療コード表現を使用しますが、これには明らかにこの微調整プロセスが必要です。デフォルトでは微調整が使用されるため、これについては心配する必要はありません。
ステップ 4: RETAIN の実行
RETAIN を実行するために必要な最小限の入力は、「訪問ファイル」、「訪問ファイル」内の固有の医療コードの数、「ラベル ファイル」、および出力パスです。出力パスは、学習された重みとログが保存される場所です。
python retain.py <visit file> <# codes in the visit file> <label file> <output path>
--verbose
オプションを指定すると、10 個のミニバッチごとにトレーニング プロセスが出力されます。
埋め込み W_emb のサイズ、アルファを生成する GRU の隠れ層のサイズ、およびベータを生成する GRU の隠れ層のサイズを指定できます。それぞれのコマンドは、 --embed_size <integer>
、 --alpha_hidden_dim_size <integer>
、および--beta_hidden_dim_size <integer>
です。たとえば、 --alpha_hidden_dim_size 128
、アルファの生成に 128 次元の隠れ層を持つ GRU を使用するように RETAIN に指示します。
ドロップアウトは 2 つの場所に適用されます: 1) 入力エンベディング、2) コンテキスト ベクトル c_i。それぞれのドロップアウト率は--keep_prob_embed {0.0, 1.0}
および--keep_prob_context {0.0, 1.0}
を使用して調整できます。ドロップアウト値はパフォーマンスに影響するため、データに合わせて調整することをお勧めします。
L2 正則化は、W_emb、w_alpha、W_beta、および w_output に適用できます。
バッチサイズのサイズ、エポック数などの追加オプションを指定できます。詳細情報には、 python retain.py --help
でアクセスできます。
私の個人的な推奨事項: 4 つの重みすべてに穏やかな正則化 (0.0001 ~ 0.001) を使用し、コンテキスト ベクトルにのみ適度なドロップアウトを使用します。ただし、これは完全にデータに依存するため、ハイパーパラメーターは常に自分で調整する必要があります。
ステップ 5: 結果を取得する
RETAIN は、各エポックの後に検証セットの AUC をチェックし、それが以前のすべての値よりも高い場合は、現在のモデルを保存します。モデルファイルはnumpy.savez_compressedによって生成されます。
ステップ 6: モデルをテストする
ファイル「test_retain.py」を使用すると、各訪問時の各医療コードの寄与を計算できます。まず、numpy.savez_compressed によって保存されたトレーニング済みモデルが必要です。 RETAIN をトレーニングした設定を知る必要があることに注意してください (例: --time_file
の使用、 --use_log_time
の使用)。
こちらも同様に「訪問ファイル」と「ラベルファイル」を用意する必要があります。ただし、今回は、「.train」、「.valid」、「.test」のルールに従う必要はありません。テスト スクリプトは、指定されたファイル名をロードしようとします。
実際の文字列医療コードとその整数コードの間のマッピング情報も必要です。 (例: 「高血圧」は 24 にマッピングされます) このファイル (これを「マッピング ファイル」と呼びます) は、キーが文字列の医療コード、値が対応する整数である Python cPickled 辞書である必要があります。 (例: process_mimic.py によって生成されるマッピング ファイルは「.types」ファイルです) このファイルは、各医療コードの寄与を使いやすい形式で印刷するために必要です。
--time_file
や--use_log_time
などの追加オプションについては、モデルをトレーニングしたときとまったく同じ構成を使用する必要があります。さらに詳しい情報については、「--help」オプションを使用してください。
テスト スクリプトを実行するための最小限の入力は、「モデル ファイル」、「訪問ファイル」、「ラベル ファイル」、「マッピング ファイル」、および「出力ファイル」です。 「出力ファイル」は、投稿が保存される場所です。 python test_retain.py <model file> <visit file> <label file> <mapping file> <output file>