Predicción de resultados de ensayos clínicos
Predicción de los resultados en los ensayos clínicos
Parte 2: Predicción de resultados de ensayos clínicos utilizando XGBoost
En la primera parte de esta serie me enfoqué en incrustar datos del mundo real multimodales derivados de ClinicalTrials.gov. En este artículo implementaré un modelo básico de XGBoost, lo entrenaré con las incrustaciones que creamos en Parte 1 y compararé su rendimiento con el del modelo HINT (una red neuronal de gráfico jerárquica) por el cual este proyecto se inspiró.
![Esquema del flujo de trabajo (imagen del autor)](https://ai.miximages.com/miro.medium.com/v2/resize:fit:640/format:webp/1*s5stGW5Dz8x64TfRZ3CdyA.png)
Estos son los pasos que seguiré en este artículo:
- Cargar conjuntos de datos de entrenamiento, validación y prueba
- Incrustar molécula(s) de medicamento, criterios de inclusión/exclusión, indicación(es) de enfermedad, patrocinador del ensayo y número de participantes
- Definir métricas de evaluación
- Entrenar el modelo XGBoost y comparar brevemente con el rendimiento del modelo HINT
Puedes seguir todos los pasos en este cuaderno de Jupyter: Tutorial de incrustación de ensayos clínicos.
Cargar conjuntos de datos de entrenamiento, validación y prueba
import osimport pandas as pdimport numpy as npimport pickle# Importar conjunto de datos de ejemplotoy_df = pd.read_pickle('data/toy_df_full.pkl')train_df = toy_df[toy_df['split'] == 'train']val_df = toy_df[toy_df['split'] == 'valid']test_df = toy_df[toy_df['split'] == 'test']y_train = train_df['label']y_val = val_df['label']y_test = test_df['label']print(train_df.shape, val_df.shape, test_df.shape)print(y_train.shape, y_val.shape, y_test.shape)### Salida:# (1028, 14) (146, 14) (295, 14)# (1028,) (146,) (295,)
Incrustar molécula de medicamento, protocolo, indicación y patrocinador del ensayo
En esta sección cargamos los diccionarios que creamos en Parte 1 de esta serie y los usamos para asignar los valores en los conjuntos de entrenamiento, validación y prueba a sus respectivas incrustaciones.
- El Mapa del Mundo con Muchas Caras – Proyecciones de Mapas
- Redacte automáticamente PII para el aprendizaje automático utilizando Amazon SageMaker Data Wrangler
- ¿Podemos generar imágenes humanas hiperrealistas? Este artículo de IA presenta HyperHuman un avance en modelos de texto a imagen
def incrustar_todo(df): print('forma de entrada: ', df.shape) ### Incrustar moléculas ### print('incrustando moléculas de medicamento...') nctid2molecule_embedding_dict = cargar_dict_incrustacion_nctid2molecule() h_m = np.stack(df['nctid'].map(nctid2molecule_embedding_dict)) print(f"moléculas de medicamento incrustadas correctamente en {h_m.shape} dimensiones") ### Incrustar protocolos ### print('incrustando protocolos...') nctid2protocol_embedding_dict = cargar_dict_incrustacion_nctid2protocol() h_p = np.stack(df['nctid'].map(nctid2protocol_embedding_dict)) print(f"protocolos incrustados correctamente en {h_p.shape} dimensiones") ### Incrustar indicaciones de enfermedad ### print('incrustando indicaciones de enfermedad...') nctid2disease_embedding_dict = cargar_dict_incrustacion_nctid2disease() h_d = np.stack(df['nctid'].map(nctid2disease_embedding_dict)) print(f"indicaciones de enfermedad incrustadas correctamente en {h_d.shape} dimensiones") ### Incrustar patrocinadores del ensayo ### print('incrustando patrocinadores...') sponsor2embedding_dict = cargar_dict_incrustacion_sponsor() h_s = np.stack(df['lead_sponsor'].map(sponsor2embedding_dict)) print(f"patrocinadores incrustados correctamente en {h_s.shape} dimensiones") ### Incrustar inscripción ### print('normalizando números de inscripción...') inscripcion = pd.to_numeric(df['inscripcion'] , errors='coerce') if inscripcion.isna().sum() != 0: print(f"llenando {inscripcion.isna().sum()} NaNs con el valor medio") inscripcion.fillna(int(inscripcion.median()), inplace=True) print(f"NaNs llenados correctamente con el valor medio: quedan {inscripcion.isna().sum()} NaNs") inscripcion = inscripcion.astype(int) h_e = np.array((inscripcion - inscripcion.mean())/inscripcion.std()).reshape(len(df),-1) print(f"inscripción incrustada correctamente en {h_e.shape} dimensiones") ### COMBINAR TODAS LAS INCRUSTACIONES ### df_incrustado = pd.DataFrame(data=np.column_stack((h_m, h_p, h_d, h_s, h_e))) print('forma de salida: ', df_incrustado.shape) return df_incrustado# Incrustar datosX_train = incrustar_todo(train_df)X_val = incrustar_todo(val_df)X_test = incrustar_todo(test_df)
Definir métricas de evaluación
Utilizaremos las mismas métricas de evaluación propuestas en el artículo HINT: ROC AUC, F1, PR-AUC, Precisión, Recall y Exactitud.
Entrenar modelo XGBoost y predecir etiquetas de entrenamiento, validación y prueba
import xgboost as xgb# Crear un clasificador XGBoost con hiperparámetros especificadosxgb_classifier = xgb.XGBClassifier( learning_rate=0.1, max_depth=3, n_estimators=200, objective='binary:logistic', # para clasificación binaria random_state=42)# Entrenar el modelo XGBoostxgb_classifier.fit(X_train, y_train)# Realizar prediccionesy_train_pred = xgb_classifier.predict(X_train)y_val_pred = xgb_classifier.predict(X_val)y_test_pred = xgb_classifier.predict(X_test)print('-----------Resultados en datos de entrenamiento:-----------')print_results(y_train_pred, y_train)print('-----------Resultados en datos de validación:-----------')print_results(y_val_pred, y_val)print('-----------Resultados en datos de prueba:-----------')print_results(y_test_pred, y_test)### Resultado:#-----------Resultados en datos de entrenamiento:-----------# ROC AUC: 1.0# F1: 1.0# PR-AUC: 1.0# Precisión: 1.0# Recall: 1.0# Exactitud: 1.0# Ratio de predicciones 1: 0.661# Ratio de etiquetas 1: 0.661# -----------Resultados en datos de validación:-----------# ROC AUC: 0.765# F1: 0.817# PR-AUC: 0.799# Precisión: 0.840# Recall: 0.795# Exactitud: 0.773# Ratio de predicciones 1: 0.602# Ratio de etiquetas 1: 0.636# -----------Resultados en datos de prueba:-----------# ROC AUC: 0.742# F1: 0.805# PR-AUC: 0.757# Precisión: 0.790# Recall: 0.821# Exactitud: 0.759# Ratio de predicciones 1: 0.630# Ratio de etiquetas 1: 0.606
Comparar rendimiento con el modelo HINT
Este modelo simple de XGBoost fue entrenado con incrustaciones de características para moléculas de fármacos, criterios de inclusión/exclusión, indicaciones de enfermedad, patrocinador del ensayo y número de participantes, mientras que los autores de HINT no utilizaron las dos últimas características: patrocinador del ensayo y número de participantes. Utilizamos varias herramientas grandes de incrustaciones de modelos de lenguaje como BioBERT y SBERT, y utilizamos codificación Morgan para las representaciones de fármacos, mientras que los autores de HINT utilizaron una variedad de redes neuronales para todas sus incrustaciones.
Podemos ver en la figura a continuación que nuestras incrustaciones de características, entrenadas por un modelo simple de XGBoost, funcionan bastante bien en comparación con el modelo HINT más sofisticado. Nuestro proyecto tiene una mejor precisión y exactitud en este conjunto de datos, pero un menor recall.
![Comparación del rendimiento de este proyecto con el proyecto HINT (imagen del autor)](https://ai.miximages.com/miro.medium.com/v2/resize:fit:640/format:webp/1*Va8TtC8OmWVX72ohQ-H10A.png)
Conclusión
Los siguientes pasos podrían incluir realizar un análisis para determinar en qué medida la adición de las características del patrocinador del ensayo y el número de participantes contribuyen al mejor rendimiento (en algunas métricas) en comparación con otros factores, como la elección del modelo y las técnicas de incrustación. Intuitivamente, parece que estas características podrían mejorar el rendimiento predictivo, ya que algunos patrocinadores históricamente han tenido un mejor desempeño que otros, y también se podría esperar una relación entre el tamaño del ensayo y el resultado.
Ahora te preguntarás: “¿Cuál es la utilidad de un modelo predictivo como este? ¿No podemos confiar en dicho modelo y renunciar a realizar el ensayo?” Y tienes razón (aunque algunas empresas están creando gemelos digitales de pacientes con el objetivo de realizar ensayos de manera virtual). Un modelo como el presentado en esta serie podría utilizarse, por ejemplo, para mejorar el análisis de potencia de ensayos clínicos, una práctica estadística relacionada. Un análisis de potencia se utiliza para determinar el número óptimo de participantes a inscribir en un ensayo específico, y se debe realizar una suposición sólida sobre el efecto del tratamiento para llevar a cabo dicho análisis. Un modelo predictivo que utiliza información del ensayo, como la estructura de la molécula del fármaco, la indicación de enfermedad y los criterios de elegibilidad del ensayo, como el modelo que implementamos aquí, puede ayudar potencialmente a crear un análisis de potencia más preciso.
Referencias
- Fu, Tianfan, et al. “Hint: Red de interacción jerárquica para predicciones de resultados de ensayos clínicos”. Patterns 3.4 (2022).
We will continue to update Zepes; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Gradio-Lite Gradio sin servidor funcionando completamente en tu navegador
- Llegando a lo grande juega ‘Counter-Strike 2’ desde la nube para obtener los mejores índices de frames
- Computación de siguiente nivel NVIDIA y AMD ofrecen potentes estaciones de trabajo para acelerar la IA, el renderizado y la simulación.
- NVIDIA AI ahora disponible en el Oracle Cloud Marketplace
- China tiene un nuevo plan para juzgar la seguridad de la IA generativa, ¡y está repleto de detalles!
- Enfoque de IA produce un perro robótico ‘inteligente atléticamente
- AlphaFold, Herramientas similares podrían ayudar en la preparación para la próxima pandemia