PyMC入門|AI創薬の予測不確実性をベイズ回帰で定量化する確率的プログラミング

1. はじめに:AI創薬で「予測の確からしさ」を扱う

AI創薬で扱う予測モデルは、活性値・ADMET特性・結合親和性などを数値で返してくれます。しかし、研究現場で本当に必要なのは「予測値そのもの」だけではなく、「その予測値がどれくらい確からしいのか」という不確実性の情報です。点推定値だけでは、合成すべき候補を絞り込むときの判断材料が不足し、誤った意思決定につながる可能性があります。

本記事では、ベイズ統計モデリングを直感的なPythonコードで記述できるオープンソース確率的プログラミングフレームワーク「PyMC(パイエムシー)」を取り上げます。PyMCはベイズ回帰やガウス過程、ベイジアン・ニューラル・ネットワーク(BNN)を統一されたAPIで扱え、AI創薬の文脈では予測不確実性を定量化する基盤として位置づけられます。BoTorchやAxといったベイズ最適化ライブラリの記事と合わせて、確率的モデリングの引き出しの一つとして整理してみてください。

2. PyMCとは:PyTensorバックエンドで動く確率的プログラミング基盤

PyMCは、Pythonベースの確率的プログラミングフレームワークで、Apache 2.0ライセンスのもとでオープンソース公開されています。PyMCプロジェクト自体は2003年に開発が始まり、Hamiltonian Monte Carloに対応したPyMC 3.0が2017年1月にリリースされて以降、ベイズモデリングの主要OSSの一つとして広く使われてきました。「PyMC3」として親しまれていた時期を経て、現在は名称と実装が「PyMC」に整理されています。2022年12月のPyMC 5.0でバックエンドがAesaraからそれをフォークしたPyTensorへ刷新され、2026年5月にはPyMC 6.0 / PyTensor 3.0もリリースされました。PyMC 6.0ではNumbaがデフォルトの計算バックエンドとなり、Nutpieがインストールされていればデフォルトのサンプラとして使用されるようになっています。本記事のコードは v5系・v6系のいずれでも基本的に動作しますが、実行時には利用中のPyMCバージョンに対応した公式ドキュメント(pymc.io)を確認してください。GitHubリポジトリはpymc-devs/pymcです。

主な特徴は、ドメイン固有言語ではなく標準的なPythonコードでモデルを記述できる点、No-U-Turn Sampler(NUTS)などの効率的なMCMC(Markov Chain Monte Carlo、マルコフ連鎖モンテカルロ)サンプラーを内蔵している点、PyTensorによる自動微分でハミルトニアン・モンテカルロを高速に走らせられる点が挙げられます。さらに、可視化と統計診断は別パッケージのArviZ(az)と連携する設計になっており、サンプリング結果のトレースプロットや事後分布の要約はArviZ側のAPIで行います。

近年は、Rust製で高速化されたサンプラー「Nutpie」や、JAX経由でGPUを使う構成も選択肢に加わり、モデルによっては高速化の恩恵を受けられるようになりつつあります。とはいえ、計算効率はモデル構造・データ規模・パラメータ数・ハードウェアに依存するため、大規模BNNや巨大な化合物ライブラリ全体へのフルMCMCには別途、変分推論や近似ベイズ、アンサンブル、GPyTorch / BoTorch などとの使い分けが重要になります。創薬応用では、小規模データでも事前分布やモデル仮定を明示しながら扱いやすい点が、ベイズアプローチの実務的なメリットといえます。ベイズモデルの強みは、事前知識・パラメータ不確実性・観測ノイズを確率分布として明示的に扱える点にあり、ブートストラップやアンサンブル、コンフォーマル予測、分位点回帰といった頻度論的な不確実性推定とは別軸の選択肢として位置づけられます。

3. ベイズ回帰の考え方:点推定から確率分布へ

従来の頻度論的な回帰では、パラメータを単一の点推定値として求めます。一方、ベイズ回帰ではパラメータを「確率分布」として扱い、事前分布と尤度から事後分布を導く形でモデルを学習します。予測も単一の値ではなく「予測分布」として返ってくるため、「平均的にどれくらいか」だけでなく「どれくらいばらつくか」を一つの仕組みで扱えるのが特徴です。

PyMCで線形回帰を書くと、次のような形になります。with pm.Model() as model: ブロックの中で確率変数を定義し、観測データとの関係を尤度として記述し、最後にpm.sample()でNUTSによる事後サンプリングを行う、というシンプルな流れです。

import pymc as pm
import arviz as az

with pm.Model() as model:
    # パラメータの事前分布
    a = pm.Normal("a", mu=0, sigma=10)      # 傾き
    b = pm.Normal("b", mu=0, sigma=10)      # 切片
    sigma = pm.HalfNormal("sigma", sigma=1) # 観測ノイズ

    # 線形予測子
    mu = a * x + b

    # 尤度(観測データとの関係)
    Y = pm.Normal("Y", mu=mu, sigma=sigma, observed=y)

    # 事後分布からサンプリング(NUTSがデフォルト)
    idata = pm.sample()

# 可視化・診断はArviZ経由
az.plot_trace(idata, var_names=["a", "b", "sigma"])
az.summary(idata)

このコードでは、戻り値のidataがArviZのInferenceDataオブジェクトで、サンプリング結果・事前分布・事後予測などをまとめて保持します。診断指標としては、各パラメータの平均(mean)・標準偏差(sd)・最高密度区間(HDI、デフォルト設定では94% HDI として hdi_3%hdi_97% が表示されることが多い)・収束指標r_hat(1.0に近いほど収束が良好)などをArviZのサマリで確認します。HDIの幅はhdi_prob引数で変更できます。なお、コード中のxyはNumPy配列で、線形回帰の例ではx.shape == y.shape == (n_samples,)を想定しています。

4. 予測の不確実性を二つに分けて考える

AI創薬で予測の不確実性を扱うときは、その「種類」を区別して考えることが実務上の指針になります。一般に、不確実性は次の二つに分解されます。

  • アレアトリック不確実性(Aleatoric Uncertainty):データそのものに内在するノイズや測定誤差に由来する不確実性です。同じ条件で再測定してもばらつく分なので、データを増やしても原理的には減りません。減らすには、測定系の改善、データクリーニング、再アノテーションといった「データの質」の改善が必要です
  • エピステミック不確実性(Epistemic Uncertainty):モデルが学習データのカバーしていない領域に対して持つ「知識上の不確実性」です。学習データを増やしたり、モデル構造を改善したりすることで減らせる成分で、ベイズアプローチが特に得意とする部分です

創薬応用では、「この予測値が外れる可能性が高いのは、データのノイズが大きいからか、それともモデルが未知領域に外挿しているからか」を切り分けられると、次に何をすべきかの判断が変わります。アレアトリック成分が大きいなら測定系を見直す、エピステミック成分が大きいならその領域から優先的に追加サンプルを取る、というように対応が分岐します。

5. AI創薬への応用シナリオ

PyMC(あるいは同等の確率的プログラミング)が、創薬研究のどの場面で機能しうるかを整理します。

5.1 分子物性予測の信頼度評価

溶解度、pKa、親油性(logP)、代謝安定性などの物性予測では、サロゲートモデルが返す予測値とともに予測分布の標準偏差を提示することで、「どの予測を信用してよいか」を研究者が判断できます。データが密に集まっている既知化合物クラスでは不確実性が小さく、構造的に離れた未知クラスでは不確実性が大きくなる、という直感とも整合します。

5.2 能動学習(Active Learning)の駆動エンジン

能動学習は、「次にどのデータを取得するか」を不確実性に基づいて選ぶ枠組みです。エピステミック不確実性が高い領域から優先的に評価・合成すれば、限られた実験予算の中で予測モデルの汎化性能を効率よく引き上げられる可能性があります。PyMCで得た事後予測や不確実性を、実験候補の優先順位付けに利用することは可能ですが、BoTorchやAxの標準的な獲得関数(qLogNEHVIなど)はPyTorch / GPyTorch系モデルを前提とした実装が中心で、PyMCの事後予測をそのまま接続できるとは限りません。実務では、PyMCによる不確実性解析と、BoTorch / Axによるベイズ最適化を目的に応じて使い分けたり、PyMCの推論結果をスコア化して別途獲得関数を自作する構成を取るのが現実的です。

5.3 バーチャルスクリーニングのフィルタリング

大規模な化合物ライブラリに対する活性予測では、点推定の上位だけを見ると「自信過剰な誤予測」を拾ってしまう危険があります。予測不確実性のしきい値で候補を二段階に絞り込むと、「予測値が高く、かつ不確実性が一定以下」という条件を満たす候補を抽出しやすくなります。ただし、これは不確実性推定が十分に校正されている前提での話で、推定された区間が実測値の分布をどの程度カバーしているかを外部テストで確認しておくことが、候補選別の判断材料として機能させる前提になります。

5.4 実例:BANDITによるベイズ的ターゲット予測

Madhukarらが2019年にNature Communicationsで発表したBANDIT(Bayesian ANalysis to determine Drug Interaction Targets)は、ベイズアプローチで創薬ターゲットを推定するプラットフォームです。論文中の記述では、薬効・治療後の転写応答・化合物構造・有害事象・バイオアッセイ・既知ターゲットという6種類のデータタイプから合計2,000万以上のデータポイントを統合し、それぞれに対する尤度比を計算してベイズ的に統合する仕組みになっています。公開データセット(約2,000化合物・1,670ターゲット)を用いたベンチマーク設定において**約90%の精度**を示したと報告されており、ターゲット未知の「孤児(orphan)化合物」14,000以上に適用して新規予測を生成し、抗がん剤候補ONC201のターゲットがDRD2であることを示唆した点が知られています。なお、この精度値はベンチマーク評価上の数字であり、未知化合物や新規ターゲットに対する一般的な成功率や臨床的妥当性を直接示すものではない点には注意が必要です。

PyMCそのもので構築されたシステムではありませんが、確率的プログラミング的な発想で大規模ヘテロデータを統合し、不確実性込みで意思決定する事例として参照価値があります。

5.5 PyMCが向く場面・向きにくい場面

PyMCの強みは「Pythonで書きやすく、ベイズの言語で仮説を明示できる」点に集約されます。具体的には、用量反応曲線(dose-response)のフィッティング、測定誤差を組み込んだ回帰、施設・バッチ・実験ロット差を扱う階層ベイズモデル、症例数が小さい物性データセットの予測区間推定などで力を発揮します。一方、何百万化合物規模のバーチャルスクリーニング全件にフルMCMCを掛けたい、大規模なグラフニューラルネットワーク(GNN)や大規模Transformerの全パラメータをベイズ化したい、リアルタイムでスクリーニングを回したいといった用途では、計算コストが現実的でなくなりがちで、近似ベイズ・ディープアンサンブル・コンフォーマル予測などとの組み合わせや分担を検討するのが現実的です。

6. ガウス過程回帰とベイジアン・ニューラル・ネットワークの実装例

PyMCはベイズ線形回帰だけでなく、非線形なベイズモデルも統一されたAPIで扱えます。創薬で頻出する2パターンを最小コードで示します。なお、特にベイジアン・ニューラル・ネットワーク(BNN)はパラメータ数が増えるほど計算負荷が大きく、フルMCMCでは現実的な時間に収まらないことも多いため、変分推論などの近似アルゴリズムを併用する場合があります。近似は事後分布の真の形状を完全には再現しないため、不確実性の校正は実測値との照合で必ず確認するのが安全です。

6.1 ガウス過程回帰

ガウス過程回帰は、予測値とともに予測分布の不確実性を返す代表的なベイズ手法で、PyMCにはpm.gpモジュールが用意されています。小規模データセットに対するQSAR的な物性予測でも親和性があります。

import pymc as pm

with pm.Model() as model:
    # カーネル(共分散関数)
    length_scale = pm.Gamma("length_scale", alpha=2, beta=1)
    amplitude = pm.HalfNormal("amplitude", sigma=1)
    cov = amplitude ** 2 * pm.gp.cov.ExpQuad(input_dim=1, ls=length_scale)

    # ガウス過程の周辺尤度
    gp = pm.gp.Marginal(cov_func=cov)
    sigma = pm.HalfNormal("sigma", sigma=1)
    y_ = gp.marginal_likelihood("y", X=X, y=y, sigma=sigma)

    idata = pm.sample()

    # 新規入力点での予測分布
    f_pred = gp.conditional("f_pred", Xnew=X_test)
    pred = pm.sample_posterior_predictive(idata, var_names=["f_pred"])
6.2 ベイジアン・ニューラル・ネットワーク(BNN)と変分推論

ベイジアン・ニューラル・ネットワークは、重みパラメータに事前分布を置くことで、予測の不確実性を返せるニューラルネットワークです。PyMCには変分推論アルゴリズムADVI(Automatic Differentiation Variational Inference)が組み込まれており、MCMCより高速にBNNを学習できます。

import pymc as pm

with pm.Model() as model:
    w_in_1  = pm.Normal("w_in_1",  0, sigma=1, shape=(n_input, n_hidden))
    w_1_2   = pm.Normal("w_1_2",   0, sigma=1, shape=(n_hidden, n_hidden))
    w_2_out = pm.Normal("w_2_out", 0, sigma=1, shape=(n_hidden, n_output))

    act_1   = pm.math.tanh(pm.math.dot(X, w_in_1))
    act_2   = pm.math.tanh(pm.math.dot(act_1, w_1_2))
    act_out = pm.math.sigmoid(pm.math.dot(act_2, w_2_out))

    out = pm.Bernoulli("out", p=act_out, observed=Y)

    # ADVIによる変分推論
    approx = pm.fit(n=50000, method=pm.ADVI())
    idata  = approx.sample(1000)

    ppc = pm.sample_posterior_predictive(idata)

ただし、ADVIは事後分布を分解された正規分布で近似するため、真の事後分布が多峰的だったり強い相関を持っていたりすると、不確実性を過小評価することがあります。創薬応用で重要な意思決定に使う場合は、NUTSによるフルMCMCとの比較や、複数の独立な初期化で結果が安定するかの確認を組み合わせるのが安全です。

7. PyMCと他の確率的プログラミングライブラリの位置づけ

  • PyMC(v5):PyTensorバックエンド、ArviZ連携、Pythonicな記述。ベイズ統計モデリングの導入と研究用途で幅広く使える
  • Stan / CmdStanPy:独自のStan言語で書く確率的プログラミング言語。研究文献での実績が厚く、再現性を重視する場面に強い
  • NumPyro:JAXベースで実装された確率的プログラミングライブラリ。GPU/TPUで大規模ベイズモデルを動かしたい場面に向く
  • TensorFlow Probability:TensorFlow統合のフレームワーク。深層学習モデルとの統合を重視する構成
  • BoTorch / GPyTorch:ベイズ最適化とガウス過程に特化した低レベルライブラリ。実験計画と組み合わせる用途で別軸の選択肢

「Python標準の書き味で、不確実性込みの予測モデルを試行錯誤したい」という場面では、PyMCはまず触ってみる価値のある選択肢です。一方、巨大なデータセットや深層学習との密結合が必要であれば、NumPyroやTensorFlow Probabilityのほうが向くケースがあります。

8. 利用にあたっての注意点

PyMCを用いたベイズ回帰をAI創薬の意思決定に組み込む際は、次のような点を意識しておくと安全です。

  • 事前分布の選び方が結果を左右する:事前分布が強すぎるとデータの情報を上書きし、弱すぎると不安定になります。物性の単位やレンジに合った妥当な事前分布を選ぶ必要があります
  • 不確実性の校正(キャリブレーション)を確認する:モデルが返す予測区間が、実測値の分布と一致しているか(例:90%予測区間に実測値の約90%が入るか)を必ず検証してください。検証手段としては、外部テストセット、scaffold split(化学骨格に基づく分割)、時間分割(time split)による評価、予測区間カバレッジ、キャリブレーションカーブの確認が標準的です
  • 分布外データへの外挿は信頼性が落ちる:学習データから構造的に離れたサンプルでは、推定された不確実性そのものが過小評価になりがちです。Tanimoto類似度などに基づく適用範囲(Applicability Domain)評価や、分布外検出(Out-of-Distribution Detection)を別途組み込む運用が安全です
  • PyMCはAI創薬専用ツールではない:PyMCは創薬専用のAIではなく、ベイズ統計モデリングをPythonで記述するための確率的プログラミングフレームワークです。AI創薬の文脈では、活性予測・物性予測・ADMET予測などのモデルに対して、予測値だけでなく予測不確実性を評価するための計算・解析支援基盤として位置づけられます
  • AI予測は最終確証ではない:PyMCで得た予測と不確実性は候補化合物の優先順位付けや追加実験の設計を支援する情報であり、医薬品の有効性・安全性を証明するものではありません。最終的な判断には、生化学アッセイ、細胞アッセイ、動物実験、臨床試験、規制対応を含む検証プロセスが必要です

9. まとめ:ベイズ回帰が創薬研究に持ち込む「分布で考える」発想

PyMCは、PyTensorバックエンドとArviZ連携を備えたPython製の確率的プログラミングフレームワークで、ベイズ線形回帰・ガウス過程・ベイジアン・ニューラル・ネットワークまでを統一されたAPIで扱えます。AI創薬の現場では、分子物性予測の信頼度評価、能動学習の駆動、バーチャルスクリーニングのフィルタリングなど、「予測の不確実性を意思決定に取り込む」場面で力を発揮します。

大切なのは、PyMCを「ブラックボックスにすべてを委ねる魔法の道具」ではなく、「研究者が立てた仮説とドメイン知識を、確率分布の言語で組み立て直すための場」として扱うことです。事前分布の設計、尤度モデルの選択、不確実性の校正、適用範囲の評価といった研究者の判断が結果の質を決め、そこにPyMCの実装力が組み合わさることで、限られた実験リソースから引き出せる情報量を引き上げられる可能性があります。

参考文献

  • PyMC公式ドキュメント:https://www.pymc.io/
  • PyMC GitHubリポジトリ:https://github.com/pymc-devs/pymc
  • ArviZ公式ドキュメント:https://python.arviz.org/
  • Madhukar N.S. et al.「A Bayesian machine learning approach for drug target identification using diverse data types」Nature Communications, 2019, 10, 5221(DOI: 10.1038/s41467-019-12928-6)— BANDIT原論文
  • Hoffman M.D., Gelman A.「The No-U-Turn Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo」JMLR, 2014, 15, 1593–1623 — NUTSの原論文
  • Kucukelbir A. et al.「Automatic Differentiation Variational Inference」JMLR, 2017, 18, 1–45 — ADVIの原論文
  • Soleimany A.P. et al.「Evidential Deep Learning for Guided Molecular Property Prediction and Discovery」ACS Cent. Sci., 2021, 7(8), 1356–1367(DOI: 10.1021/acscentsci.1c00546)— 創薬での不確実性定量化の応用研究。Evidential Deep Learningによる分子物性予測の校正済み不確実性推定と能動学習・バーチャルスクリーニングへの活用を提案

※本記事の制作プロセスでは、ファーマAIラボ内のAI創薬関連記事(BoTorch入門、Ax 1.0入門、ADMET-AI完全ガイドなど)も内部リンク候補として参照しました。

免責事項

本記事は、PyMCに関する情報提供を目的として作成されたものです。記事の内容は、公開時点で入手可能な文献・公式ドキュメントに基づいていますが、技術の進歩や仕様変更により、情報が変更される場合があります。記事に記載されたソフトウェアの使用結果や、それに基づく研究成果について、筆者および本ブログは一切の責任を負わないものとします。実際の創薬研究や臨床応用にあたっては、必ず最新の文献・公式ドキュメントを確認し、専門家の助言を得てください。

本記事は生成AIを活用して作成しています。内容については十分に精査しておりますが、誤りが含まれる可能性があります。お気づきの点がございましたら、コメントにてご指摘いただけますと幸いです。 

Amazonでこの関連書籍「Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド」を見る

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


上部へスクロール