『臨床試験結果予測』

『美容とファッションの世界で輝く方法』

第2部:XGBoostを使用した臨床試験結果の予測

このシリーズの最初のパートでは、ClinicalTrials.govから派生したマルチモーダルの実世界データの埋め込みに焦点を当てました。この記事では、基本的なXGBoostモデルを実装し、Part 1で作成した埋め込みデータを使用して、HINTモデル(階層的グラフニューラルネット)とのパフォーマンスを比較します。

ワークフロー図(作成者による画像)

この記事では、以下の手順に従います:

  • トレーニングデータ、検証データ、テストデータのロード
  • 薬剤分子、適用基準、疾患指標、試験スポンサー、参加者数の埋め込み
  • 評価指標の定義
  • XGBoostモデルをトレーニングし、HINTモデルのパフォーマンスと比較する
このシリーズの第2部に焦点:パート1で作成した特徴の埋め込みを使用して臨床試験の結果を予測する(作成者による画像)

このJupyterノートブックの手順に従ってください:臨床試験の埋め込みチュートリアル

トレーニングデータ、検証データ、テストデータのロード

import osimport pandas as pdimport numpy as npimport pickle# Import toy datasettoy_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,)

薬剤分子、プロトコル、指標、試験スポンサーの埋め込み

このセクションでは、このシリーズのPart 1で作成した辞書をロードし、トレーニングデータ、検証データ、テストデータの値をそれぞれの埋め込みにマッピングします。

def embed_all(df):    print('input shape: ', 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('output shape: ', 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、Precision、Recall、およびAccuracyです。

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# Precision: 1.0# Recall: 1.0# Accuracy: 1.0# 予測1の割合: 0.661# ラベル1の割合: 0.661# -----------バリデーションデータの結果-----------# ROC AUC: 0.765# F1: 0.817# PR-AUC: 0.799# Precision: 0.840# Recall: 0.795# Accuracy: 0.773# 予測1の割合: 0.602# ラベル1の割合: 0.636# -----------テストデータの結果-----------# ROC AUC: 0.742# F1: 0.805# PR-AUC: 0.757# Precision: 0.790# Recall: 0.821# Accuracy: 0.759# 予測1の割合: 0.630# ラベル1の割合: 0.606

HINTモデルとのパフォーマンス比較

このシンプルなXGBoostモデルは、薬剤分子、選択/除外基準、疾患指示、試験スポンサー、および参加者数の特徴の埋め込みに基づいてトレーニングされましたが、HINTの著者は試験スポンサーと参加者数の最後の2つの特徴を使用していませんでした。私たちはBioBERTやSBERTなどのさまざまな大規模言語モデルの埋め込みツールを使用し、薬剤の表現にはモルガン符号化を使用しましたが、HINTの著者はすべての埋め込みにさまざまなニューラルネットワークを使用しました。

以下の図からわかるように、このプロジェクトのシンプルなXGBoostモデルによる特徴の埋め込みは、より洗練されたHINTモデルと比較して非常にうまく機能しています。このデータセットにおいて、私たちのプロジェクトは精度と正確性が向上していますが、再現率は低下しています。

このプロジェクトのパフォーマンスとHINTプロジェクトの比較(著者による画像)

結論

次のステップは、試験スポンサーや参加者数の特徴の追加がモデルの選択と埋め込み技術といった他の要素と比べてどれだけパフォーマンスの向上に貢献しているかを分析することです。直感的には、特定のスポンサーが他よりも優れたパフォーマンスを示していることや、試験規模と結果の間に関連性があることが予想されるため、これらの特徴は予測性能を向上させる可能性があります。

さて、あなたはおそらく疑問に思うかもしれません。「このような予測モデルの有用性は何ですか?試験を実施せずにこのようなモデルに頼ることはできませんよね?」正しいです(ただし、一部の企業はバーチャルな試験を実施することを目指して患者のデジタルツインを作成しています)。このシリーズで提示されたモデルのようなものは、例えば臨床トライアルのパワーアナリシスを改善するために使用することができます。パワーアナリシスは、特定の試験に登録する最適な参加者数を決定するために使用され、そのような分析を行うためには治療効果についての強い仮定が必要です。私たちがここで実装したような、薬剤分子の構造、疾患指示、および試験の適格基準などの試験情報を利用する予測モデルは、より正確なパワーアナリシス作成に役立つ可能性があります。

参考文献

  • Fu, Tianfanら。「Hint: 臨床試験結果予測のための階層的相互作用ネットワーク」。Patterns 3.4 (2022)。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more