因果推論にテキストを扱う時代になっていたのはプチ衝撃でした。
BERTの拡張なので、Transformer, PyTorchの一般的な環境ですぐに使えます。
発表された文献と読んだ図書では利用方法が異なりましたが、どちらも使えそうです。以下は後者の復習です。AIが提案するコードは私の環境ではやや古く、動作未確認です。
1. 目的と構造
目的:テキストと構造化データから、ある処置の因果効果(ATE/ITE)を推定する。
同時に2つのモデルを学習する二重ロバスト型:
処置モデル(gモデル):g(T | X_text, X_cov)
アウトカムモデル(Qモデル):Q(Y | T, X_text, X_cov)
ここで
X_text: テキスト特徴
X_cov: 交絡因子
T: 処置変数(0/1 など)
Y: アウトカム(結果)
2. 損失の重み g_weight と Q_weight
g_weight
処置モデルの損失重み。処置の割り当てメカニズムをどれだけ重視するかを調整。
Q_weight
アウトカムモデルの損失重み。因果効果推定の中心となるアウトカム予測をどれだけ重視するかを調整。
概念的な損失式:
Loss_total = g_weight * Loss_g + Q_weight * Loss_Q + ...
3. ATE / ITE の計算
推論結果 preds を
preds[:, 0] ≈ Ê[Y(0) | X]
preds[:, 1] ≈ Ê[Y(1) | X]
という反事実アウトカムの推定値と解釈できる場合:
個別因果効果(ITE):
ITE_i = preds[i, 1] - preds[i, 0]
平均処置効果(ATE):
ATE = mean(preds[:, 1] - preds[:, 0])
無交絡などの識別仮定が成立しているとき、これを
E[Y | do(T=1)] − E[Y | do(T=0)]
として解釈できる。
4. 典型的なデータ構造
text_main: 主テキスト
text_aux: 補助テキスト(例:カテゴリ名など)
treatment: 処置変数(例:A/B条件)
covariate: 交絡因子(例:属性フラグ)
outcome: アウトカム(例:クリック有無)
CausalBERT に渡すテキストは 1 本なので、複数テキストを結合して使う:
5. 学習〜推論コード(AIの提案)
import pandas as pd from causalnlp.core.causalbert import CausalBertModel df=pd.read_csv("data.csv")#複数の文字列項目を 1 つのテキスト入力として利用。 df["text"] = df["text_main"].fillna("")+ " [SEP] "+ df["text_aux"].fillna("")cb = CausalBertModel( batch_size=32, g_weight=0.01, Q_weight=1.0, mlm_weight=0.1, max_length=128 ) #学習 cb.train( texts=df["text"], confounds=df["covariate"], treatments=df["treatment"], outcomes=df["outcome"], epochs=6, ) #ATE の算出 print(cb.estimate_ate(texts=df["text"]), confounds=df["covariate"])
0 件のコメント:
コメントを投稿