econml.policy.DRPolicyTree
- 类 econml.policy.DRPolicyTree(*, model_regression='auto', model_propensity='auto', featurizer=None, min_propensity=1e-06, categories='auto', cv=2, mc_iters=None, mc_agg='mean', max_depth=None, min_samples_split=10, min_samples_leaf=5, min_weight_fraction_leaf=0.0, max_features='auto', min_impurity_decrease=0.0, min_balancedness_tol=0.45, honest=True, random_state=None)[source]
基类:
econml.policy._drlearner._BaseDRPolicyLearner
策略学习器,使用双重稳健校正技术来解释处理组之间的协变量漂移(选择偏差)。
在此估计器中,首先通过构建反事实结果的双重稳健估计来估计策略
\[Y_{i, t}^{DR} = E[Y | X_i, W_i, T_i=t] + \frac{Y_i - E[Y | X_i, W_i, T_i=t]}{Pr[T_i=t | X_i, W_i]} \cdot 1\{T_i=t\}\]然后优化目标函数
\[V(\pi) = \sum_i \sum_t \pi_t(X_i) * (Y_{i, t} - Y_{i, 0})\]约束条件是对于每个 \(\pi_t(X_i)\),只有一个 \(X_i\) 为 1,其余为 0。
因此,如果我们首先估计扰动函数 \(h(X, W, T) = E[Y | X, W, T]\) 和 \(p_t(X, W)=Pr[T=t | X, W]\),然后通过构建一个最大化目标函数 \(V(\pi)\) 的决策树,就可以估计每个处理 t 的最终阶段 CATE。
估计扰动函数 \(p\) 的问题是一个简单的多类分类问题,即从 \(X, W\) 预测标签 \(T\)。
DRLearner
类接受参数model_propensity
作为输入,它是一个任意的 scikit-learn 分类器,内部用于解决这个分类问题。第二个扰动函数 \(h\) 是一个简单的回归问题,
DRLearner
类接受参数model_regressor
作为输入,它是一个任意的 scikit-learn 回归器,内部用于解决这个回归问题。- 参数
model_propensity (估计器, 默认为
'auto'
) – Pr[T=t | X, W] 的分类器。通过将处理变量对(特征,控制变量)的拼接进行回归来训练。如果为
'auto'
,模型将是线性模型和森林模型集合中最拟合的一个。否则,请参阅模型选择以了解支持的选项范围。
model_regression (估计器, 默认为
'auto'
) – E[Y | X, W, T] 的估计器。通过将 Y 对(特征,控制变量,独热编码处理变量)的拼接进行回归来训练。独热编码不包括基线处理。如果为
'auto'
,模型将是线性模型和森林模型集合中最拟合的一个。否则,请参阅模型选择以了解支持的选项范围;如果指定了单个模型,则如果 discrete_outcome 为 True,它应该是分类器,否则是回归器。
featurizer (转换器, 可选) – 必须支持 fit_transform 和 transform。用于在最终 CATE 回归中创建复合特征。如果 X 为 None 则忽略。最终的 CATE 将在 featurizer.fit_transform(X) 的结果上训练。如果 featurizer=None,则 CATE 在 X 上训练。
min_propensity (浮点数, 默认为
1e-6
) – 倾向性估计值的最小裁剪值,以避免除以零。categories (‘auto’ 或 列表, 默认为 ‘auto’) – 用于编码离散处理变量的类别(或 ‘auto’ 使用唯一排序的值)。第一个类别将被视为对照处理。
cv (整数, 交叉验证生成器 或 可迭代对象, 默认为 2) – 确定交叉验证的分割策略。cv 的可能输入为
None,使用默认的 3 折交叉验证,
整数,指定折叠的数量。
一个可迭代对象,以索引数组的形式产生 (训练集, 测试集) 分割。
对于整数/None 输入,如果处理变量是离散的,则使用
StratifiedKFold
;否则使用KFold
(两种情况都会随机打乱)。除非使用了可迭代对象,否则我们调用 split(concat[W, X], T) 生成分割。如果所有 W, X 都为 None,则我们调用 split(ones((T.shape[0], 1)), T)。
mc_iters (整数, 可选) – 重跑第一阶段模型的次数,以减少扰动项的方差。
mc_agg ({‘mean’, ‘median’}, 默认为 ‘mean’) – 如何在交叉拟合的 mc_iters 次蒙特卡洛迭代中,对每个样本的扰动值进行聚合。
max_depth (整数 或 None, 可选) – 树的最大深度。如果为 None,则节点会一直扩展,直到所有叶节点都是纯净的,或者直到所有叶节点包含的样本少于 min_samples_split。
min_samples_split (整数, 浮点数, 默认为 10) – 分割内部节点所需的最小分割样本数。
如果是整数,则将 min_samples_split 视为最小样本数。
如果是浮点数,则 min_samples_split 是一个比例,ceil(min_samples_split * n_samples) 是每个分割所需的最小样本数。
min_samples_leaf (整数, 浮点数, 默认为 5) – 叶节点所需的最小样本数。只有当分割点在左右分支中至少留下
min_samples_leaf
个分割样本时,才会考虑任何深度的分割点。这可能会使模型更平滑,尤其是在回归中。树构建完成后,也会进行修剪,以确保每个叶节点至少有 min_samples_leaf 个估计样本。如果是整数,则将 min_samples_leaf 视为最小样本数。
如果是浮点数,则 min_samples_leaf 是一个比例,ceil(min_samples_leaf * n_samples) 是每个节点所需的最小样本数。
min_weight_fraction_leaf (浮点数, 默认为 0.) – 叶节点所需的总权重(所有分割样本的权重总和)的最小加权比例。如果未提供 sample_weight,则样本具有相同的权重。树构建完成后,会进行修剪,以确保每个叶节点中包含的估计样本的总权重比例至少为 min_weight_fraction_leaf。
max_features (整数, 浮点数, 字符串 或 None, 默认为 “auto”) – 在寻找最佳分割时考虑的特征数量。
如果是整数,则在每个分割点考虑 max_features 个特征。
如果是浮点数,则 max_features 是一个比例,在每个分割点考虑 int(max_features * n_features) 个特征。
如果为 “auto”,则 max_features=n_features。
如果为 “sqrt”,则 max_features=sqrt(n_features)。
如果为 “log2”,则 max_features=log2(n_features)。
如果为 None,则 max_features=n_features。
注意:寻找分割不会停止,直到找到节点样本的至少一个有效分区,即使这需要有效检查超过
max_features
个特征。min_impurity_decrease (浮点数, 默认为 0.) – 如果此分割导致的杂质减少大于或等于此值,则节点将被分割。
加权杂质减少公式如下
N_t / N * (impurity - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity)
其中
N
是分割样本总数,N_t
是当前节点的分割样本数,N_t_L
是左子节点的分割样本数,N_t_R
是右子节点的分割样本数。如果传入了
sample_weight
,N
,N_t
,N_t_R
和N_t_L
都指代加权总和。min_balancedness_tol ([0, .5] 范围内的浮点数, 默认为 .45) – 我们可以容忍的分割不平衡程度。这强制要求每次分割在分割的每一侧至少留下 (.5 - min_balancedness_tol) 的样本比例;或者在 sample_weight 不为 None 时,留下样本总权重的相应比例。默认值确保父节点权重的至少 5% 落入分割的每一侧。设置为 0.0 表示没有平衡性限制,设置为 .5 表示完全平衡的分割。为了使正式的推断理论有效,这必须是任何远离零的有界正数。
honest (布尔值, 默认为 True) – 是否使用诚实树,即一半样本用于构建树结构,另一半用于叶节点估计。如果为 False,则所有样本都用于这两个部分。
random_state (整数, RandomState 实例 或 None, 默认为 None) – 如果是整数,则 random_state 是随机数生成器使用的种子;如果是
RandomState
实例,则 random_state 是随机数生成器;如果为 None,则随机数生成器是RandomState
实例,由np.random
使用。
- __init__(*, model_regression='auto', model_propensity='auto', featurizer=None, min_propensity=1e-06, categories='auto', cv=2, mc_iters=None, mc_agg='mean', max_depth=None, min_samples_split=10, min_samples_leaf=5, min_weight_fraction_leaf=0.0, max_features='auto', min_impurity_decrease=0.0, min_balancedness_tol=0.45, honest=True, random_state=None)[source]
方法
__init__
(*[, model_regression, ...])export_graphviz
(*[, out_file, ...])导出表示学习到的树模型的 graphviz dot 文件
feature_importances
([max_depth, ...])- 参数
max_depth (整数, 默认为 4) -- 深度大于 max_depth 的分割不用于此计算。
fit
(Y, T, *[, X, W, sample_weight, groups])从数据中估计策略模型。
plot
(*[, feature_names, treatment_names, ...])将策略树导出到 matplotlib
policy_feature_names
(*[, feature_names])获取输出特征名称。
policy_treatment_names
(*[, treatment_names])获取处理变量的名称。
predict
(X)获取每个样本的推荐处理变量。
预测推荐每个处理变量的概率
获取每个非基线处理变量以及每个样本的效果值。
render
(out_file, *[, format, view, ...])将树渲染到文件
属性
feature_importances_
训练好的最终阶段策略模型
- export_graphviz(*, out_file=None, feature_names=None, treatment_names=None, max_depth=None, filled=True, leaves_parallel=True, rotate=False, rounded=True, special_characters=False, precision=3)[source]
导出表示学习到的树模型的 graphviz dot 文件
- 参数
out_file (文件对象 或 字符串, 可选) – 输出文件的句柄或名称。如果为
None
,结果将以字符串形式返回。feature_names (字符串列表, 可选) – 各个特征的名称。
treatment_names (字符串列表, 可选) – 各个处理变量的名称,包括基线处理。
max_depth (整数 或 None, 可选) – 要绘制的最大树深度。
filled (布尔值, 默认为 False) – 设置为
True
时,绘制节点以指示分类中的多数类别、回归中的值极端性或多输出中的节点纯度。leaves_parallel (布尔值, 默认为 True) – 设置为
True
时,将所有叶节点绘制在树的底部。rotate (布尔值, 默认为 False) – 设置为
True
时,树的方向从上到下变为从左到右。rounded (布尔值, 默认为 True) – 设置为
True
时,绘制圆角节点框,并使用 Helvetica 字体代替 Times-Roman。special_characters (布尔值, 默认为 False) – 设置为
False
时,忽略特殊字符以保持 PostScript 兼容性。precision (整数, 默认为 3) – 每个节点的杂质、阈值和值属性中浮点数的精度位数。
- feature_importances(max_depth=4, depth_decay_exponent=2.0)
- 参数
max_depth (整数, 默认为 4) – 深度大于 max_depth 的分割不用于此计算。
depth_decay_exponent (双精度浮点数, 默认为 2.0) – 每个分割对总分数的贡献通过
1 / (1 + `depth`)**2.0
进行重新加权。
- 返回值
feature_importances_ – 每个特征引起参数异质性的归一化总重要性。
- 返回类型
形状为 (n_features,) 的 ndarray
- fit(Y, T, *, X=None, W=None, sample_weight=None, groups=None)
从数据中估计策略模型。
- 参数
Y (长度为 n 的 (n,) 向量) – 每个样本的结果变量。
T (长度为 n 的 (n,) 向量) – 每个样本的处理变量。
X ((n, d_x) 矩阵, 可选) – 每个样本的特征。
W ((n, d_w) 矩阵, 可选) – 每个样本的控制变量。
sample_weight ((n,) 向量, 可选) – 每个样本的权重。
groups ((n,) 向量, 可选) – 属于同一组的所有行在分割时将保持在一起。如果 groups 不为 None,则传递给此类初始化方法的 cv 参数必须支持其 split 方法的 ‘groups’ 参数。
- 返回值
self
- 返回类型
对象实例
- plot(*, feature_names=None, treatment_names=None, ax=None, title=None, max_depth=None, filled=True, rounded=True, precision=3, fontsize=None)[source]
将策略树导出到 matplotlib
- 参数
ax (
matplotlib.axes.Axes
, 可选) – 绘制图形的坐标轴。title (字符串, 可选) – 要打印在页面顶部的最终图表标题。
feature_names (字符串列表, 可选) – 各个特征的名称。
treatment_names (字符串列表, 可选) – 各个处理变量的名称,包括基线/对照处理。
max_depth (整数 或 None, 可选) – 要绘制的最大树深度。
filled (布尔值, 默认为 False) – 设置为
True
时,绘制节点以指示分类中的多数类别、回归中的值极端性或多输出中的节点纯度。rounded (布尔值, 默认为 True) – 设置为
True
时,绘制圆角节点框,并使用 Helvetica 字体代替 Times-Roman。precision (整数, 默认为 3) – 每个节点的杂质、阈值和值属性中浮点数的精度位数。
fontsize (整数, 可选) – 文本的字体大小。
- policy_feature_names(*, feature_names=None)
获取输出特征名称。
- 参数
feature_names (长度为 X.shape[1] 的字符串列表 或 None) – 输入特征的名称。如果为 None 且 X 是一个数据框,则默认为数据框的列名。
- 返回值
out_feature_names – 用于拟合策略模型的输出特征名称。
- 返回类型
字符串列表 或 None
- policy_treatment_names(*, treatment_names=None)
获取处理变量的名称。
- 参数
treatment_names (长度为 n_categories 的字符串列表) – 处理变量的名称(包括基线)。如果为 None,则根据输入元数据自动生成值。
- 返回值
out_treatment_names – 处理变量的名称,包括基线/对照处理。
- 返回类型
字符串列表
- predict(X)
获取每个样本的推荐处理变量。
- 参数
X (形状为 (n_samples, n_features) 的 array_like) – 训练输入样本。
- 返回值
treatment – 推荐处理变量的索引,与 categories 中的顺序相同,或者如果 categories=’auto’ 则按字典顺序排列。0 对应于基线/对照处理变量。对于集成策略模型,推荐的处理变量从集成中的每个模型聚合,并返回获得最多票数 Treatment。使用 predict_proba 获取集成中推荐每个处理变量的模型的比例。
- 返回类型
形状为 (n_samples,) 的 array_like
- predict_proba(X)
预测推荐每个处理变量的概率
- 参数
X (形状为 (n_samples, n_features) 的 array_like) – 输入样本。
- 返回值
treatment_proba – 每个处理变量推荐的概率。
- 返回类型
形状为 (n_samples, n_treatments) 的 array_like
- predict_value(X)
获取每个非基线处理变量以及每个样本的效果值。
- 参数
X (形状为 (n_samples, n_features) 的 array_like) – 训练输入样本。
- 返回值
values – 每个样本和每个非基线处理变量的预测平均值,与基线处理变量的值相比,并基于树定义的特征邻域。
- 返回类型
形状为 (n_samples, n_treatments - 1) 的 array_like
- render(out_file, *, format='pdf', view=True, feature_names=None, treatment_names=None, max_depth=None, filled=True, leaves_parallel=True, rotate=False, rounded=True, special_characters=False, precision=3)[source]
将树渲染到文件
- 参数
out_file (要保存的文件名)
format (字符串, 默认为 ‘pdf’) – 要渲染到的文件格式;必须由 graphviz 支持。
view (布尔值, 默认为 True) – 是否使用默认应用程序打开渲染结果。
feature_names (字符串列表, 可选) – 各个特征的名称。
treatment_names (字符串列表, 可选) – 各个处理变量的名称,包括基线/对照处理。
max_depth (整数 或 None, 可选) – 要绘制的最大树深度。
filled (布尔值, 默认为 False) – 设置为
True
时,绘制节点以指示分类中的多数类别、回归中的值极端性或多输出中的节点纯度。leaves_parallel (布尔值, 默认为 True) – 设置为
True
时,将所有叶节点绘制在树的底部。rotate (布尔值, 默认为 False) – 设置为
True
时,树的方向从上到下变为从左到右。rounded (布尔值, 默认为 True) – 设置为
True
时,绘制圆角节点框,并使用 Helvetica 字体代替 Times-Roman。special_characters (布尔值, 默认为 False) – 设置为
False
时,忽略特殊字符以保持 PostScript 兼容性。precision (整数, 默认为 3) – 每个节点的杂质、阈值和值属性中浮点数的精度位数。
- 属性 policy_model_
训练好的最终阶段策略模型