RETAIN es un modelo predictivo interpretable para aplicaciones sanitarias. Dados los registros de los pacientes, puede hacer predicciones mientras explica cómo cada código médico (códigos de diagnóstico, códigos de medicación o códigos de procedimiento) en cada visita contribuye a la predicción. La interpretación es posible gracias al uso del mecanismo de atención neuronal.
Con RETAIN, puede calcular qué tan positiva o negativamente cada código médico (diagnóstico, medicamento o código de procedimiento) en diferentes visitas contribuye a la puntuación final. En este caso, estamos prediciendo si al paciente en cuestión se le diagnosticará insuficiencia cardíaca (IC). Se puede ver que los códigos que están altamente relacionados con la HF hacen contribuciones positivas. RETAIN también aprende a prestar más atención a la información nueva que a la antigua. Puede ver que la disritmia cardíaca (CD) hace una contribución mayor que la de la visita más reciente.
RETAIN implementa un algoritmo presentado en el siguiente artículo:
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
El artículo RETAIN formula el modelo para que sea capaz de hacer predicciones en cada paso de tiempo (por ejemplo, tratar de predecir qué diagnósticos recibirá el paciente en cada visita) y trata la clasificación de secuencia (por ejemplo, dado el registro del paciente, ¿se le diagnosticará insuficiencia cardíaca en ¿el futuro?) como un caso especial, ya que la clasificación de secuencias realiza la predicción solo en el último paso de tiempo.
Este código, sin embargo, se implementa para realizar la tarea de clasificación de secuencia. Por ejemplo, puede utilizar este código para predecir si el paciente determinado tiene insuficiencia cardíaca o no. O puede predecir si este paciente será readmitido en el futuro. La versión más general de RETAIN se lanzará en el futuro.
PASO 1: Instalación
Instale Python, Theano. Usamos Python 2.7, Theano 0.8. Theano se puede instalar fácilmente en Ubuntu como se sugiere aquí
Si planea utilizar el cálculo de GPU, instale CUDA
Descargar/clonar el código RETAIN
PASO 2: Manera rápida de probar RETAIN con MIMIC-III
Este paso describe cómo entrenar RETAIN, con un número mínimo de pasos utilizando MIMIC-III, para predecir la mortalidad de los pacientes utilizando sus registros de visitas.
Primero deberá solicitar acceso a MIMIC-III, un registro médico electrónico disponible públicamente recopilado de pacientes de la UCI durante 11 años.
Puede utilizar "process_mimic.py" para procesar el conjunto de datos MIMIC-III y generar un conjunto de datos de entrenamiento adecuado para RETAIN. Coloque el script en la misma ubicación donde se encuentran los archivos CSV MIMIC-III y ejecute el script. El comando de ejecución es python process_mimic.py ADMISSIONS.csv DIAGNOSES_ICD.csv PATIENTS.csv <output file>
.
Ejecute RETAIN utilizando los archivos ".seqs" y ".morts" generados por Process_mimic.py. El archivo ".seqs" contiene la secuencia de visitas de cada paciente. Cada visita consta de múltiples códigos de diagnóstico. Sin embargo, recomendamos utilizar el archivo ".3digitICD9.seqs", ya que los resultados serán mucho más interpretables. (O puede usar el software de clasificación clásica de un solo nivel para ICD9 para disminuir la cantidad de códigos a un par de cientos, lo que mejorará aún más el rendimiento). El archivo ".morts" contiene la secuencia de etiquetas de mortalidad para cada paciente. El comando es 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
es el número de códigos ICD9 completos de 3 dígitos utilizados en el conjunto de datos.
Para probar el modelo para su interpretación, consulte el Paso 6. Personalmente encontré que la ictericia perinatal (ICD9 774) tiene una alta correlación con la mortalidad.
El modelo alcanza un AUC superior a 0,8 con el comando anterior, pero las interpretaciones no son muy claras. Podrías ajustar los hiperparámetros, pero dudo que las cosas mejoren dramáticamente. Después de todo, sólo 7.500 pacientes hicieron más de una visita al hospital, y la mayoría de ellos sólo tienen dos visitas.
PASO 3: Cómo preparar tu propio conjunto de datos
El conjunto de datos de entrenamiento de RETAIN debe ser una lista de listas de Python cPickled. La lista más externa corresponde a los pacientes, la intermedia a la secuencia de visitas que realizó cada paciente y la más interna a los códigos médicos (por ejemplo, códigos de diagnóstico, códigos de medicación, códigos de procedimiento, etc.) que ocurrieron dentro de cada visita. Primero, los códigos médicos deben convertirse a un número entero. Entonces, una sola visita puede verse como una lista de números enteros. Entonces un paciente puede verse como una lista de visitas. Por ejemplo, [5,8,15] significa que al paciente se le asignaron los códigos 5, 8 y 15 en una visita determinada. Si un paciente realizó dos visitas [1,2,3] y [4,5,6,7], se puede convertir en una lista de lista [[1,2,3], [4,5,6,7 ]]. Varios pacientes se pueden representar como [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]], lo que significa hay dos pacientes donde el primer paciente realizó dos visitas y el segundo paciente realizó tres visitas. Esta lista de listas debe conservarse utilizando cPickle. Nos referiremos a este archivo como el "archivo de visita".
Se requiere el número total de códigos médicos únicos para ejecutar RETAIN. Por ejemplo, si el conjunto de datos utiliza 14 000 códigos de diagnóstico y 11 000 códigos de procedimiento, el número total es 25 000.
El conjunto de datos de etiquetas (llamémoslo "archivo de etiquetas") debe ser una lista cPickled de Python. Cada elemento corresponde a la verdadera etiqueta de cada paciente. Por ejemplo, 1 puede ser el paciente caso y 0 puede ser el paciente control. Si hay dos pacientes donde solo el primero es un caso, entonces deberíamos tener [1,0].
El "archivo de visita" y el "archivo de etiqueta" deben tener 3 conjuntos respectivamente: conjunto de entrenamiento, conjunto de validación y conjunto de prueba. La extensión del archivo debe ser ".train", ".valid" y ".test" respectivamente.
Por ejemplo, si desea utilizar un archivo llamado "my_visit_sequences" como "archivo de visita", RETAIN intentará cargar "my_visit_sequences.train", "my_visit_sequences.valid" y "my_visit_sequences.test".
Esto también es válido para el "archivo de etiquetas".
Puede utilizar la información horaria de las visitas como fuente adicional de información. Llamemos a esto "archivo de tiempo". Tenga en cuenta que la información de tiempo puede ser cualquier cosa: duración entre visitas consecutivas, número acumulado de días desde la primera visita, etc. El "archivo de tiempo" debe prepararse como una lista de listas cPickled de Python. El listado más externo corresponde a los pacientes, y el más interno a la información horaria de cada visita. Por ejemplo, dado un "archivo de visita" [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]] , su correspondiente "archivo de tiempo" podría verse como [[0, 15], [0, 45, 23]], si usamos la duración entre las visitas consecutivas. (Por supuesto, los números son falsos y he establecido la duración de la primera visita en cero). Use la opción --time_file <path to time file>
para usar "archivo de tiempo". Recuerde que ".train", ". válido", la regla ".test" también se aplica al "archivo de tiempo".
Adicional: Usando sus propias representaciones de código médico
RETAIN aprende internamente la representación vectorial de códigos médicos durante el entrenamiento. Por supuesto, estos vectores se inicializan con valores aleatorios.
Sin embargo, también puede utilizar sus propias representaciones de código médico, si tiene una. (Se pueden entrenar utilizando algoritmos similares a Skip-gram. Consulte Med2Vec o este para obtener más detalles). Si desea proporcionar las representaciones del código médico, debe ser una lista de listas (básicamente una matriz) de N filas y M columnas donde N es el número de códigos únicos en su "archivo de visita" y M es el tamaño de las representaciones de códigos. Especifique la ruta a su archivo de representación de código usando --embed_file <path to embedding file>
. Además, incluso si utiliza sus propias representaciones de código médico, puede volver a entrenarlas (también conocidas como ajustarlas) a medida que entrena RETAIN. Utilice la opción --embed_finetune
para hacer esto. Si no proporciona sus propias representaciones de código médico, RETAIN utilizará una inicializada aleatoriamente, lo que obviamente requiere este proceso de ajuste. Dado que el valor predeterminado es utilizar el ajuste fino, no necesita preocuparse por esto.
PASO 4: Ejecutar RETENIR
La entrada mínima que necesita para ejecutar RETAIN es el "archivo de visita", la cantidad de códigos médicos únicos en el "archivo de visita", el "archivo de etiqueta" y la ruta de salida. La ruta de salida es donde se guardarán los pesos aprendidos y el registro.
python retain.py <visit file> <# codes in the visit file> <label file> <output path>
Al especificar la opción --verbose
se imprimirá el proceso de capacitación después de cada 10 minilotes.
Puede especificar el tamaño de la incrustación W_emb, el tamaño de la capa oculta del GRU que genera alfa y el tamaño de la capa oculta del GRU que genera beta. Los comandos respectivos son --embed_size <integer>
, --alpha_hidden_dim_size <integer>
y --beta_hidden_dim_size <integer>
. Por ejemplo, --alpha_hidden_dim_size 128
le indicará a RETAIN que use un GRU con una capa oculta de 128 dimensiones para generar alfa.
Los abandonos se aplican en dos lugares: 1) a la incrustación de entrada, 2) al vector de contexto c_i. Las respectivas tasas de abandono se pueden ajustar usando --keep_prob_embed {0.0, 1.0}
y --keep_prob_context {0.0, 1.0}
. Los valores de abandono afectan el rendimiento, por lo que se recomienda ajustarlos para sus datos.
Las regularizaciones L2 se pueden aplicar a W_emb, w_alpha, W_beta y w_output.
Se pueden especificar opciones adicionales, como el tamaño del lote, el número de épocas, etc. Se puede acceder a información detallada mediante python retain.py --help
Mi recomendación personal: utilice una regularización leve (0,0001 ~ 0,001) en los cuatro pesos y utilice una abandono moderada únicamente en el vector de contexto. Pero esto depende completamente de sus datos, por lo que siempre debe ajustar los hiperparámetros usted mismo.
PASO 5: Obteniendo tus resultados
RETAIN verifica el AUC del conjunto de validación después de cada época y, si es mayor que todos los valores anteriores, guardará el modelo actual. El archivo de modelo es generado por numpy.savez_compressed.
Paso 6: prueba tu modelo
Utilizando el archivo "test_retain.py", se pueden calcular las aportaciones de cada código médico en cada visita. Primero necesita tener un modelo entrenado que fue guardado por numpy.savez_compressed. Tenga en cuenta que necesita conocer la configuración con la que entrenó RETAIN (por ejemplo, uso de --time_file
, uso de --use_log_time
).
Nuevamente, necesita preparar el "archivo de visita" y el "archivo de etiqueta" de la misma manera. Esta vez, sin embargo, no es necesario seguir la regla ".train", ".valid", ".test". El script de prueba intentará cargar el nombre del archivo tal como se indica.
También necesita la información de mapeo entre los códigos médicos de cadena reales y sus códigos enteros. (por ejemplo, "Hipertensión" está asignado a 24) Este archivo (llamémoslo "archivo de mapeo") debe ser un diccionario cPickled de Python donde las claves son las cadenas de códigos médicos y los valores son los números enteros correspondientes. (Por ejemplo, el archivo de mapeo generado por Process_mimic.py es el archivo ".types"). Este archivo es necesario para imprimir las contribuciones de cada código médico en un formato fácil de usar.
Para las opciones adicionales como --time_file
o --use_log_time
, debes usar exactamente la misma configuración con la que entrenó el modelo. Para obtener información más detallada, utilice la opción "--help".
La entrada mínima para ejecutar el script de prueba es el "archivo de modelo", el "archivo de visita", el "archivo de etiqueta", el "archivo de mapeo" y el "archivo de salida". El "archivo de salida" es donde se almacenarán las contribuciones. python test_retain.py <model file> <visit file> <label file> <mapping file> <output file>