Press "Enter" to skip to content

临床试验结果预测

第二部分:使用XGBoost预测临床试验结果

本系列的第一部分中,我着重介绍了来自ClinicalTrials.gov的多模态真实世界数据的嵌入。在本文中,我将实现一个基本的XGBoost模型,用在第一部分中创建的嵌入数据上进行训练,并将其性能与HINT模型(一种层次图神经网络)进行比较,该项目受其启发。

工作流程示意图(由作者提供的图片)

本文将按照以下步骤进行:

  • 加载训练、验证和测试数据集
  • 嵌入药物分子、纳入/排除标准、疾病指示、试验赞助商和参与者人数
  • 定义评估指标
  • 训练XGBoost模型并简要比较其与HINT模型的性能
本系列第二部分的重点:基于第一部分创建的特征嵌入来预测临床试验结果(由作者提供的图片)

您可以在此Jupyter笔记本中跟随所有步骤:临床试验嵌入教程

加载训练、验证和测试数据集

import osimport pandas as pdimport numpy as npimport pickle# 导入玩具数据集toy_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)### 输出结果:# (1028, 14) (146, 14) (295, 14)# (1028,) (146,) (295,)

嵌入药物分子、方案、指示和试验赞助商

在本部分,我们加载在本系列的第一部分中创建的字典,并使用它们将训练、验证和测试集中的值映射到它们各自的嵌入中。

def embed_all(df):    print('输入形状:', df.shape)    ### 嵌入药物分子 ###    print('正在嵌入药物分子..')    nctid2molecule_embedding_dict = load_nctid2molecule_embedding_dict()    h_m = np.stack(df['nctid'].map(nctid2molecule_embedding_dict))     print(f"药物分子成功嵌入到{h_m.shape}维")    ### 嵌入方案 ###    print('正在嵌入方案..')    nctid2protocol_embedding_dict = load_nctid2protocol_embedding_dict()    h_p = np.stack(df['nctid'].map(nctid2protocol_embedding_dict))    print(f"方案成功嵌入到{h_p.shape}维")    ### 嵌入疾病指示 ###    print('正在嵌入疾病指示..')    nctid2disease_embedding_dict = load_nctid2disease_embedding_dict()    h_d = np.stack(df['nctid'].map(nctid2disease_embedding_dict))    print(f"疾病指示成功嵌入到{h_d.shape}维")    ### 嵌入试验赞助商 ###    print('正在嵌入赞助商..')    sponsor2embedding_dict = load_sponsor2embedding_dict()    h_s = np.stack(df['lead_sponsor'].map(sponsor2embedding_dict))    print(f"赞助商成功嵌入到{h_s.shape}维")    ### 嵌入入组人数 ###    print('正在规范化入组人数..')    enrollment = pd.to_numeric(df['enrollment'] , errors='coerce')    if enrollment.isna().sum() != 0:        print(f"正在用中位数填补{enrollment.isna().sum()}个NaN值")        enrollment.fillna(int(enrollment.median()), inplace=True)        print(f"成功用中位数填补NaN值:剩余{enrollment.isna().sum()}个NaN值")    enrollment = enrollment.astype(int)    h_e = np.array((enrollment - enrollment.mean())/enrollment.std()).reshape(len(df),-1)    print(f"入组人数成功嵌入到{h_e.shape}维")    ### 合并所有嵌入 ###    embedded_df = pd.DataFrame(data=np.column_stack((h_m, h_p, h_d, h_s, h_e)))    print('输出形状:', embedded_df.shape)    return embedded_df# 嵌入数据X_train = embed_all(train_df)X_val = embed_all(val_df)X_test = embed_all(test_df)

定义评估指标

我们将使用与HINT文章中提出的相同的评估指标:ROC AUC、F1、PR-AUC、精确率、召回率和准确率。

训练XGBoost模型并预测训练、验证和测试标签

import xgboost as xgb# 创建一个带有指定超参数的XGBoost分类器xgb_classifier = xgb.XGBClassifier(    learning_rate=0.1,    max_depth=3,    n_estimators=200,    objective='binary:logistic',  # 用于二分类    random_state=42)# 训练XGBoost模型xgb_classifier.fit(X_train, y_train)# 进行预测y_train_pred = xgb_classifier.predict(X_train)y_val_pred = xgb_classifier.predict(X_val)y_test_pred = xgb_classifier.predict(X_test)print('-----------训练数据结果:-----------')print_results(y_train_pred, y_train)print('-----------验证数据结果:-----------')print_results(y_val_pred, y_val)print('-----------测试数据结果:-----------')print_results(y_test_pred, y_test)### 输出:#-----------训练数据结果:-----------# ROC AUC: 1.0# F1: 1.0# PR-AUC: 1.0# 精确率: 1.0# 召回率: 1.0# 准确率: 1.0# 预测为1的比例: 0.661# 标签为1的比例: 0.661# -----------验证数据结果:-----------# ROC AUC: 0.765# F1: 0.817# PR-AUC: 0.799# 精确率: 0.840# 召回率: 0.795# 准确率: 0.773# 预测为1的比例: 0.602# 标签为1的比例: 0.636# -----------测试数据结果:-----------# ROC AUC: 0.742# F1: 0.805# PR-AUC: 0.757# 精确率: 0.790# 召回率: 0.821# 准确率: 0.759# 预测为1的比例: 0.630# 标签为1的比例: 0.606

与HINT模型进行比较

这个简单的XGBoost模型是使用药物分子特征嵌入、纳入/排除标准、疾病指示、试验赞助商和参与者人数训练的,而HINT作者没有使用最后两个特征:试验赞助商和参与者人数。我们使用了几种大型语言模型嵌入工具,如BioBERT和SBERT,并使用Morgan编码来表示药物,而HINT作者则使用了各种神经网络进行所有嵌入。

从下图可以看出,与更复杂的HINT模型相比,我们使用简单的XGBoost模型训练的特征嵌入在这个数据集上表现得非常好。我们的项目在精确率和准确率方面优于HINT模型,但召回率较差。

与HINT项目的性能比较(作者提供的图片)

结论

下一步可以进行分析,以确定试验赞助商和参与者人数等特征的增加对改善性能(在某些指标上)的贡献程度,与模型选择和嵌入技术等因素相比。直观上看,这些特征似乎能够提高预测性能,因为某些赞助商的表现历史上比其他赞助商更好,而且试验规模与结果之间可能存在关联。

现在你可能会问:“这样的预测模型有什么用处?我们不可能完全依赖这样的模型而放弃进行试验吧?”你说的没错(尽管有些公司正在创建患者的数字孪生,目标是虚拟运行试验)。这个系列中介绍的模型可以用于改进临床试验的统计分析中与试验效果分析(power analysis)有关的实践。试验效果分析用于确定在特定试验中应该招募的参与者的最佳数量,并且必须对治疗效果做出强有力的假设才能进行该分析。像我们在这里实现的模型这样利用了药物分子结构、疾病指示和试验资格标准等试验信息的预测模型,有可能有助于创建更准确的试验效果分析。

参考文献

  • Fu, Tianfan, 等. “Hint: 临床试验结果预测的层次交互网络.” Patterns 3.4 (2022).
Leave a Reply

Your email address will not be published. Required fields are marked *