在策略评估的任务中,除了因果效应估计,我们还会考虑是否应该为每一个样例分配一个治疗方案,以及哪一个治疗方案对于该样例是最好的。如:Athey2020。YLearn为实现这样的目标提供了PolicyTree
。当给定一个训练好的估计器模型或者估计的因果效应,PolicyTree
通过构建一个使每一个样例因果效应最大化的决策树模型,找到每一个样例的最优策略。
训练树的准则是
$$S = \sum_i\sum_k g_{ik}e_{ki}$$
其中 $g_{ik} = \phi(v_i)_k$ ,并且有 $\phi: \mathbb{R}^D \to \mathbb{R}^K$ 是一个映射,从$v_i\in \mathbb{R}^D$ 到一个仅有一个非零元素的在 $\mathbb{R}^K$ 中的基向量,并且 $e_{ki}$ 表明 对样本 $i$ 采取治疗 $k$-th 值的因果效应。
可参考 sklearn中 BaseDecisionTree
。
注意:可以使用 PolicyInterpreter
来解释策略模型的结果。
import numpy as np
from ylearn.policy.policy_model import PolicyTree
from ylearn.utils._common import to_df
# build dataset
v = np.random.normal(size=(1000, 10))
y = np.hstack([v[:, [0]] < 0, v[:, [0]] > 0])
data = to_df(v=v)
covariate = data.columns
est = PolicyTree(criterion='policy_reg')
est.fit(data=data, covariate=covariate, effect_array=y.astype(float))
>>> 06-23 14:53:14 I ylearn.p.policy_model.py 452 - Start building the policy tree with criterion PRegCriteria
>>> 06-23 14:53:14 I ylearn.p.policy_model.py 468 - Building the policy tree with splitter BestSplitter
>>> 06-23 14:53:14 I ylearn.p.policy_model.py 511 - Building the policy tree with builder DepthFirstTreeBuilder
>>> <ylearn.policy.policy_model.PolicyTree at 0x7ff1ee5f2eb0>