RETAIN adalah model prediktif yang dapat ditafsirkan untuk aplikasi layanan kesehatan. Dengan adanya catatan pasien, ia dapat membuat prediksi sambil menjelaskan bagaimana setiap kode medis (kode diagnosis, kode pengobatan, atau kode prosedur) pada setiap kunjungan berkontribusi terhadap prediksi. Penafsirannya dimungkinkan karena penggunaan mekanisme perhatian saraf.
Dengan menggunakan RETAIN, Anda dapat menghitung seberapa positif/negatif setiap kode medis (diagnosis, pengobatan, atau kode prosedur) pada kunjungan yang berbeda berkontribusi terhadap skor akhir. Dalam kasus ini, kami memperkirakan apakah pasien tersebut akan didiagnosis menderita Gagal Jantung (HF). Anda dapat melihat bahwa kode-kode yang sangat terkait dengan HF memberikan kontribusi positif. RETAIN juga belajar untuk lebih memperhatikan informasi baru dibandingkan informasi lama. Anda dapat melihat bahwa Disritmia Jantung (CD) memberikan kontribusi yang lebih besar seperti yang terjadi pada kunjungan terakhir.
RETAIN mengimplementasikan algoritma yang diperkenalkan dalam makalah berikut:
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
Makalah RETAIN merumuskan model yang mampu membuat prediksi pada setiap langkah waktu (misalnya, mencoba memprediksi diagnosis apa yang akan diterima pasien pada setiap kunjungan), dan menerapkan klasifikasi urutan (misalnya, berdasarkan catatan pasien, apakah ia akan didiagnosis menderita gagal jantung pada tahun 2017). masa depan?) sebagai kasus khusus, karena klasifikasi urutan membuat prediksi pada langkah waktu terakhir saja.
Namun kode ini diimplementasikan untuk melakukan tugas klasifikasi urutan. Misalnya, Anda dapat menggunakan kode ini untuk memprediksi apakah pasien tertentu adalah pasien gagal jantung atau bukan. Atau Anda dapat memperkirakan apakah pasien ini akan diterima kembali di masa mendatang. Versi RETAIN yang lebih umum akan dirilis di masa mendatang.
LANGKAH 1: Instalasi
Instal python, Theano. Kami menggunakan Python 2.7, Theano 0.8. Theano dapat dengan mudah diinstal di Ubuntu seperti yang disarankan di sini
Jika Anda berencana menggunakan komputasi GPU, instal CUDA
Unduh/kloning kode RETAIN
LANGKAH 2: Cara cepat untuk menguji RETAIN dengan MIMIC-III
Langkah ini menjelaskan cara melatih RETAIN, dengan jumlah langkah minimum menggunakan MIMIC-III, untuk memprediksi kematian pasien menggunakan catatan kunjungan mereka.
Pertama-tama Anda harus meminta akses untuk MIMIC-III, catatan kesehatan elektronik yang tersedia untuk umum yang dikumpulkan dari pasien ICU selama 11 tahun.
Anda dapat menggunakan "process_mimic.py" untuk memproses kumpulan data MIMIC-III dan menghasilkan kumpulan data pelatihan yang sesuai untuk RETAIN. Tempatkan skrip di lokasi yang sama dengan tempat file CSV MIMIC-III berada, dan jalankan skrip. Perintah eksekusinya adalah python process_mimic.py ADMISSIONS.csv DIAGNOSES_ICD.csv PATIENTS.csv <output file>
.
Jalankan RETAIN menggunakan file ".seqs" dan ".morts" yang dihasilkan oleh process_mimic.py. File ".seqs" berisi urutan kunjungan untuk setiap pasien. Setiap kunjungan terdiri dari beberapa kode diagnosis. Namun kami merekomendasikan penggunaan file ".3digitICD9.seqs", karena hasilnya akan lebih mudah diinterpretasikan. (Atau Anda dapat menggunakan Perangkat Lunak Klasifikasi Klik Tingkat Tunggal untuk ICD9 untuk mengurangi jumlah kode menjadi beberapa ratus, yang akan lebih meningkatkan kinerjanya) File ".morts" berisi urutan label kematian untuk setiap pasien. Perintahnya adalah 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
adalah jumlah keseluruhan 3 digit kode ICD9 yang digunakan dalam dataset.
Untuk menguji model interpretasi, silakan lihat Langkah 6. Saya pribadi menemukan bahwa penyakit kuning perinatal (ICD9 774) memiliki korelasi yang tinggi dengan kematian.
Model mencapai AUC di atas 0,8 dengan perintah di atas, tetapi interpretasinya tidak terlalu jelas. Anda dapat menyesuaikan hyper-parameternya, tetapi saya ragu segalanya akan membaik secara dramatis. Bagaimanapun, hanya 7.500 pasien yang melakukan lebih dari satu kunjungan ke rumah sakit, dan sebagian besar dari mereka hanya melakukan dua kunjungan.
LANGKAH 3: Cara menyiapkan kumpulan data Anda sendiri
Kumpulan data pelatihan RETAIN harus berupa daftar daftar Python cPickled. Daftar terluar berhubungan dengan pasien, daftar tengah menunjukkan urutan kunjungan yang dilakukan setiap pasien, dan daftar paling dalam menunjukkan kode medis (misalnya kode diagnosis, kode pengobatan, kode prosedur, dll.) yang muncul dalam setiap kunjungan. Pertama, kode medis perlu diubah menjadi bilangan bulat. Kemudian satu kunjungan dapat dilihat sebagai daftar bilangan bulat. Kemudian seorang pasien dapat dilihat sebagai daftar kunjungan. Misalnya, [5,8,15] berarti pasien diberi kode 5, 8, dan 15 pada kunjungan tertentu. Jika pasien melakukan dua kunjungan [1,2,3] dan [4,5,6,7], maka dapat diubah menjadi daftar daftar [[1,2,3], [4,5,6,7 ]]. Beberapa pasien dapat direpresentasikan sebagai [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]], yang artinya pasien berjumlah dua orang dimana pasien pertama melakukan dua kali kunjungan dan pasien kedua melakukan tiga kali kunjungan. Daftar daftar ini perlu diasamkan menggunakan cPickle. Kami akan menyebut file ini sebagai "file kunjungan".
Jumlah total kode medis unik diperlukan untuk menjalankan RETAIN. Misalnya, jika kumpulan data menggunakan 14.000 kode diagnosis dan 11.000 kode prosedur, jumlah totalnya adalah 25.000.
Kumpulan data label (sebut saja "file label") harus berupa daftar Python cPickled. Setiap elemen sesuai dengan label sebenarnya dari setiap pasien. Misalnya, 1 dapat menjadi pasien kasus dan 0 dapat menjadi pasien kontrol. Jika terdapat dua pasien dimana hanya pasien pertama yang merupakan kasus, maka kita harus mempunyai [1,0].
"File kunjungan" dan "file label" masing-masing harus memiliki 3 set: set pelatihan, set validasi, dan set pengujian. Ekstensi file masing-masing harus ".train", ".valid", dan ".test".
Misalnya, jika Anda ingin menggunakan file bernama "my_visit_sequences" sebagai "visit file", maka RETAIN akan mencoba memuat "my_visit_sequences.train", "my_visit_sequences.valid", dan "my_visit_sequences.test".
Hal ini juga berlaku untuk "file label"
Anda dapat menggunakan informasi waktu mengenai kunjungan sebagai sumber informasi tambahan. Mari kita sebut ini "file waktu". Perhatikan bahwa informasi waktu bisa berupa apa saja: durasi antara kunjungan berturut-turut, jumlah hari kumulatif sejak kunjungan pertama, dll. "file waktu" perlu disiapkan sebagai daftar daftar Python cPickled. Daftar terluar berhubungan dengan pasien, dan daftar terdalam berisi informasi waktu setiap kunjungan. Misalnya diberi "file kunjungan" [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]] , "file waktu" yang terkait dapat terlihat seperti [[0, 15], [0, 45, 23]], jika kita menggunakan durasi antara kunjungan berturut-turut. (tentu saja angkanya palsu, dan saya telah menetapkan durasi kunjungan pertama ke nol.) Gunakan opsi --time_file <path to time file>
untuk menggunakan "time file" Ingatlah bahwa opsi ".train", ". valid", aturan ".test" juga berlaku untuk "file waktu".
Tambahan: Menggunakan representasi kode medis Anda sendiri
RETAIN secara internal mempelajari representasi vektor kode medis saat pelatihan. Vektor-vektor ini tentu saja diinisialisasi dengan nilai acak.
Namun, Anda juga dapat menggunakan representasi kode medis Anda sendiri, jika ada. (Mereka dapat dilatih dengan menggunakan algoritma seperti Skip-gram. Lihat Med2Vec atau ini untuk rincian lebih lanjut.) Jika Anda ingin memberikan representasi kode medis, itu harus berupa daftar daftar (pada dasarnya matriks) dari N baris dan M kolom dengan N adalah jumlah kode unik dalam "file kunjungan" Anda dan M adalah ukuran representasi kode. Tentukan jalur ke file representasi kode Anda menggunakan --embed_file <path to embedding file>
. Selain itu, meskipun Anda menggunakan representasi kode medis Anda sendiri, Anda dapat melatihnya kembali (alias menyempurnakannya) saat Anda melatih RETAIN. Gunakan opsi --embed_finetune
untuk melakukan ini. Jika Anda tidak memberikan representasi kode medis Anda sendiri, RETAIN akan menggunakan representasi yang diinisialisasi secara acak, yang jelas memerlukan proses penyesuaian ini. Karena defaultnya adalah menggunakan fine-tuning, Anda tidak perlu khawatir tentang hal ini.
LANGKAH 4: Menjalankan RETAIN
Input minimum yang Anda perlukan untuk menjalankan RETAIN adalah "file kunjungan", jumlah kode medis unik di "file kunjungan", "file label", dan jalur keluaran. Jalur keluaran adalah tempat bobot yang dipelajari dan log akan disimpan.
python retain.py <visit file> <# codes in the visit file> <label file> <output path>
Menentukan opsi --verbose
akan mencetak proses pelatihan setelah setiap 10 mini-batch.
Anda dapat menentukan ukuran W_emb yang disematkan, ukuran lapisan tersembunyi GRU yang menghasilkan alfa, dan ukuran lapisan tersembunyi GRU yang menghasilkan beta. Perintah masing-masing adalah --embed_size <integer>
, --alpha_hidden_dim_size <integer>
, dan --beta_hidden_dim_size <integer>
. Misalnya --alpha_hidden_dim_size 128
akan memberitahu RETAIN untuk menggunakan GRU dengan lapisan tersembunyi 128 dimensi untuk menghasilkan alpha.
Dropout diterapkan ke dua tempat: 1) ke penyematan masukan, 2) ke vektor konteks c_i. Tingkat putus sekolah masing-masing dapat disesuaikan menggunakan --keep_prob_embed {0.0, 1.0}
dan --keep_prob_context {0.0, 1.0}
. Nilai dropout memengaruhi performa sehingga disarankan untuk menyesuaikannya dengan data Anda.
Regularisasi L2 dapat diterapkan ke W_emb, w_alpha, W_beta, dan w_output.
Opsi tambahan dapat ditentukan seperti ukuran ukuran batch, jumlah epoch, dll. Informasi detail dapat diakses dengan python retain.py --help
Rekomendasi pribadi saya: gunakan regularisasi ringan (0,0001 ~ 0,001) pada keempat bobot, dan gunakan dropout sedang pada vektor konteks saja. Namun ini sepenuhnya bergantung pada data Anda, jadi Anda harus selalu menyesuaikan hyperparameternya sendiri.
LANGKAH 5: Dapatkan hasil Anda
RETAIN memeriksa AUC set validasi setelah setiap periode, dan jika lebih tinggi dari semua nilai sebelumnya, maka model saat ini akan disimpan. File model dihasilkan oleh numpy.savez_compressed.
Langkah 6: Menguji model Anda
Dengan menggunakan file "test_retain.py", Anda dapat menghitung kontribusi setiap kode medis pada setiap kunjungan. Pertama, Anda harus memiliki model terlatih yang disimpan oleh numpy.savez_compressed. Perhatikan bahwa Anda perlu mengetahui konfigurasi yang Anda latih RETAIN (misalnya penggunaan --time_file
, penggunaan --use_log_time
.)
Sekali lagi, Anda memerlukan "file kunjungan" dan "file label" yang disiapkan dengan cara yang sama. Namun kali ini, Anda tidak perlu mengikuti aturan ".train", ".valid", ".test". Skrip pengujian akan mencoba memuat nama file seperti yang diberikan.
Anda juga memerlukan informasi pemetaan antara kode medis string aktual dan kode bilangan bulatnya. (misalnya "Hipertensi" dipetakan ke 24) File ini (sebut saja "file pemetaan") harus berupa kamus Python cPickled yang kuncinya adalah string kode medis dan nilainya adalah interger yang sesuai. (mis. File pemetaan yang dihasilkan oleh process_mimic.py adalah file ".types") File ini diperlukan untuk mencetak kontribusi setiap kode medis dalam format yang mudah digunakan.
Untuk opsi tambahan seperti --time_file
atau --use_log_time
, Anda harus menggunakan konfigurasi yang sama persis dengan yang Anda gunakan untuk melatih model. Untuk informasi lebih detail, gunakan opsi "--help".
Input minimum untuk menjalankan skrip pengujian adalah "file model", "file kunjungan", "file label", "file pemetaan", dan "file output". "file keluaran" adalah tempat kontribusi akan disimpan. python test_retain.py <model file> <visit file> <label file> <mapping file> <output file>