econml.policy.DRPolicyForest
- class econml.policy.DRPolicyForest(*, model_regression='auto', model_propensity='auto', featurizer=None, min_propensity=1e-06, categories='auto', cv=2, mc_iters=None, mc_agg='mean', n_estimators=100, 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, max_samples=0.5, min_balancedness_tol=0.45, honest=True, n_jobs=- 1, verbose=0, 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})\]约束条件是对于每个 \(X_i\),只有其中一个 \(\pi_t(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 (float, 默认为
1e-6
) – 用于截断倾向性估计的最小倾向性,以避免除以零。categories (‘auto’ 或 list, 默认为 ‘auto’) – 对离散处理进行编码时使用的类别(或 ‘auto’ 表示使用唯一的排序值)。第一个类别将被视为控制处理。
cv (int, 交叉验证生成器或可迭代对象, 默认为 2) – 确定交叉验证分割策略。cv 的可能输入为
None,使用默认的 3 折交叉验证,
整数,指定折数。
一个生成 (训练集, 测试集) 分割作为索引数组的可迭代对象。
对于整数/None 输入,如果处理是离散的,则使用
StratifiedKFold
;否则,使用KFold
(在任一情况下都会随机打乱)。除非使用可迭代对象,否则我们调用 split(concat[W, X], T) 来生成分割。如果 W 和 X 都为 None,则调用 split(ones((T.shape[0], 1)), T)。
mc_iters (int, 可选) – 重新运行第一阶段模型的次数,以减少干扰项的方差。
mc_agg ({‘mean’, ‘median’}, 默认为 ‘mean’) – 如何在 mc_iters 次交叉拟合的蒙特卡洛迭代中,对每个样本的干扰值进行聚合。
n_estimators (int, 默认为 100) – 森林中的总树数。森林由 sqrt(n_estimators) 个子森林组成,每个子森林包含 sqrt(n_estimators) 棵树。
max_depth (int 或 None, 可选) – 树的最大深度。如果为 None,则节点会一直扩展,直到所有叶子都是纯净的,或者所有叶子包含的样本少于 min_samples_split。
min_samples_split (int, float, 默认为 10) – 分割内部节点所需的最小分割样本数。
如果是 int,则将 min_samples_split 视为最小数量。
如果是 float,则 min_samples_split 是一个比例,并且 ceil(min_samples_split * n_samples) 是每个分割的最小样本数。
min_samples_leaf (int, float, 默认为 5) – 叶节点所需的最小样本数。只有当分割点在左右分支中都留下至少
min_samples_leaf
个分割样本时,才会考虑任何深度的分割点。这可能会平滑模型,尤其是在回归中。构建树后,还会对树进行剪枝,使得每个叶子节点上至少有 min_samples_leaf 个估计样本。如果是 int,则将 min_samples_leaf 视为最小数量。
如果是 float,则 min_samples_leaf 是一个比例,并且 ceil(min_samples_leaf * n_samples) 是每个节点的最小样本数。
min_weight_fraction_leaf (float, 默认为 0.) – 叶节点所需的总权重(所有分割样本的权重总和)的最小加权比例。当未提供 sample_weight 时,样本具有相同的权重。构建树后,对树进行剪枝,使得每个叶节点中包含的估计样本总权重比例至少为 min_weight_fraction_leaf。
max_features (int, float, str 或 None, 默认为 “auto”) – 在寻找最佳分割时要考虑的特征数量。
如果是 int,则在每次分割时考虑 max_features 个特征。
如果是 float,则 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 (float, 默认为 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
都指的是加权和。max_samples (int 或 float,取值范围 (0, 1],默认为 .5) – 用于训练每棵树的每个子样本的样本数量。
如果是 int,则在从所有样本中无放回地抽样 max_samples 个样本上训练每棵树。
如果是 float,则在从所有样本中无放回地抽样 ceil(max_samples * n_samples) 个样本上训练每棵树。
min_balancedness_tol (float,取值范围 [0, .5],默认为 .45) – 可容忍的分割不平衡程度。这强制每个分割在分割的两侧至少留下 (.5 - min_balancedness_tol) 比例的样本;或样本总权重的比例(当 sample_weight 不为 None 时)。默认值确保父节点权重的至少 5% 落入分割的每一侧。设置为 0.0 表示没有平衡性要求,设置为 .5 表示完全平衡的分割。为了使形式化推断理论有效,此值必须是任何远离零的正常数。
honest (bool, 默认为 True) – 是否使用诚实树,即一半样本用于创建树结构,另一半用于叶节点的估计。如果为 False,则所有样本都用于这两个部分。
n_jobs (int 或 None, 默认为 -1) – fit 和 predict 并行运行的作业数。
None
表示 1,除非在joblib.parallel_backend()
上下文中。-1
表示使用所有处理器。详情请参阅 词汇表。verbose (int, 默认为 0) – 控制拟合和预测时的详细程度。
random_state (int, RandomState 实例 或 None, 默认为 None) – 如果是 int,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', n_estimators=100, 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, max_samples=0.5, min_balancedness_tol=0.45, honest=True, n_jobs=- 1, verbose=0, random_state=None)[source]
方法
__init__
(*[, model_regression, ...])export_graphviz
(tree_id, *[, out_file, ...])导出表示学习到的树模型的 graphviz dot 文件
feature_importances
([max_depth, ...])- 参数
max_depth (int, 默认为 4) -- 深度大于 max_depth 的分割不用于此计算。
fit
(Y, T, *[, X, W, sample_weight, groups])从数据中估计策略模型。
plot
(tree_id, *[, feature_names, ...])将策略树导出到 matplotlib
policy_feature_names
(*[, feature_names])获取输出特征名称。
policy_treatment_names
(*[, treatment_names])获取处理的名称。
predict
(X)获取每个样本的推荐处理。
预测推荐每个处理的概率
获取每个非基线处理和每个样本的效果值。
render
(tree_id, out_file, *[, format, view, ...])将树渲染到文件
属性
feature_importances_
训练好的最终阶段策略模型
- export_graphviz(tree_id, *, 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 文件
- 参数
tree_id (int) – 要绘制的森林树的 ID
out_file (文件对象 或 str, 可选) – 输出文件的句柄或名称。如果为
None
,结果将作为字符串返回。feature_names (list of str, 可选) – 各个特征的名称。
treatment_names (list of str, 可选) – 各个处理的名称,以基线/控制/None 处理的名称开头(对于离散处理,按字母数字顺序最小)。
max_depth (int 或 None, 可选) – 要绘制的最大树深度。
filled (bool, 默认为 False) – 当设置为
True
时,对节点进行着色以表示分类中的多数类、回归中的极值或多输出中的节点纯度。leaves_parallel (bool, 默认为 True) – 当设置为
True
时,将所有叶节点绘制在树的底部。rotate (bool, 默认为 False) – 当设置为
True
时,将树的方向设置为从左到右,而不是从上到下。rounded (bool, 默认为 True) – 当设置为
True
时,绘制圆角矩形节点框,并使用 Helvetica 字体代替 Times-Roman 字体。special_characters (bool, 默认为 False) – 当设置为
False
时,忽略特殊字符以确保与 PostScript 兼容。precision (int, 默认为 3) – 每个节点的杂质、阈值和值属性中浮点数的精度位数。
- feature_importances(max_depth=4, depth_decay_exponent=2.0)
- 参数
max_depth (int, 默认为 4) – 深度大于 max_depth 的分割不用于此计算。
depth_decay_exponent (double, 默认为 2.0) – 每个分割对总得分的贡献按
1 / (1 + `depth`)**2.0
进行重新加权。
- 返回
feature_importances_ – 每个特征归一化后的总参数异质性诱导重要性。
- 返回类型
shape 为 (n_features,) 的 ndarray
- fit(Y, T, *, X=None, W=None, sample_weight=None, groups=None)
从数据中估计策略模型。
- 参数
Y (shape 为 (n,) 长度为 n 的向量) – 每个样本的结果
T (shape 为 (n,) 长度为 n 的向量) – 每个样本的处理
X (shape 为 (n, d_x) 的矩阵, 可选) – 每个样本的特征
W (shape 为 (n, d_w) 的矩阵, 可选) – 每个样本的控制变量
sample_weight (shape 为 (n,) 的向量, 可选) – 每个样本的权重
groups (shape 为 (n,) 的向量, 可选) – 对应于同一组的所有行在分割过程中将保持在一起。如果 groups 不为 None,则传递给此类初始器的 cv 参数必须支持其 split 方法的 ‘groups’ 参数。
- 返回
self
- 返回类型
对象实例
- plot(tree_id, *, feature_names=None, treatment_names=None, ax=None, title=None, max_depth=None, filled=True, rounded=True, precision=3, fontsize=None)[source]
将策略树导出到 matplotlib
- 参数
tree_id (int) – 要绘制的森林树的 ID
ax (
matplotlib.axes.Axes
, 可选) – 要绘制的坐标轴。title (str, 可选) – 最终图的标题,将打印在页面顶部。
feature_names (list of str, 可选) – 各个特征的名称。
treatment_names (list of str, 可选) – 各个处理的名称,以基线/控制处理的名称开头(按字母数字顺序最小)。
max_depth (int 或 None, 可选) – 要绘制的最大树深度。
filled (bool, 默认为 False) – 当设置为
True
时,对节点进行着色以表示分类中的多数类、回归中的极值或多输出中的节点纯度。rounded (bool, 默认为 True) – 当设置为
True
时,绘制圆角矩形节点框,并使用 Helvetica 字体代替 Times-Roman 字体。precision (int, 默认为 3) – 每个节点的杂质、阈值和值属性中浮点数的精度位数。
fontsize (int, 可选) – 文本字体大小。
- policy_feature_names(*, feature_names=None)
获取输出特征名称。
- 参数
feature_names (list of str, 长度为 X.shape[1], 或 None) – 输入特征的名称。如果为 None 且 X 是一个 dataframe,则默认为 dataframe 的列名。
- 返回
out_feature_names – 策略模型拟合所基于的输出特征的名称。
- 返回类型
list of str 或 None
- policy_treatment_names(*, treatment_names=None)
获取处理的名称。
- 参数
treatment_names (list of str, 长度为 n_categories) – 处理的名称(包括基线处理)。如果为 None,则根据输入元数据自动生成值。
- 返回
out_treatment_names – 处理的名称,包括基线/控制处理。
- 返回类型
list of str
- predict(X)
获取每个样本的推荐处理。
- 参数
X (shape 为 (n_samples, n_features) 的 array_like) – 训练输入样本。
- 返回
treatment – 推荐的处理的索引,与 categories 中的顺序相同,或在 categories=’auto’ 时按字典顺序排列。0 对应于基线/控制处理。对于集成策略模型,推荐的处理是从集成中的每个模型聚合得到的,返回获得最多投票的处理。使用 predict_proba 获取集成模型中推荐每个处理的样本比例。
- 返回类型
shape 为 (n_samples,) 的 array_like
- predict_proba(X)
预测推荐每个处理的概率
- 参数
X (shape 为 (n_samples, n_features) 的 array_like) – 输入样本。
- 返回
treatment_proba – 每个处理推荐的概率
- 返回类型
shape 为 (n_samples, n_treatments) 的 array_like
- predict_value(X)
获取每个非基线处理和每个样本的效果值。
- 参数
X (shape 为 (n_samples, n_features) 的 array_like) – 训练输入样本。
- 返回
values – 每个样本和每个非基线处理的预测平均值,与基线处理值进行比较,并基于树定义的特征邻域。
- 返回类型
shape 为 (n_samples, n_treatments - 1) 的 array_like
- render(tree_id, 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]
将树渲染到文件
- 参数
tree_id (int) – 要绘制的森林树的 ID
out_file (要保存到的文件名)
format (str, 默认为 ‘pdf’) – 要渲染到的文件格式;必须受 graphviz 支持。
view (bool, 默认为 True) – 是否使用默认应用程序打开渲染结果。
feature_names (list of str, 可选) – 各个特征的名称。
treatment_names (list of str, 可选) – 各个处理的名称,以基线/控制处理的名称开头(对于离散处理,按字母数字顺序最小)。
max_depth (int 或 None, 可选) – 要绘制的最大树深度。
filled (bool, 默认为 False) – 当设置为
True
时,对节点进行着色以表示分类中的多数类、回归中的极值或多输出中的节点纯度。leaves_parallel (bool, 默认为 True) – 当设置为
True
时,将所有叶节点绘制在树的底部。rotate (bool, 默认为 False) – 当设置为
True
时,将树的方向设置为从左到右,而不是从上到下。rounded (bool, 默认为 True) – 当设置为
True
时,绘制圆角矩形节点框,并使用 Helvetica 字体代替 Times-Roman 字体。special_characters (bool, 默认为 False) – 当设置为
False
时,忽略特殊字符以确保与 PostScript 兼容。precision (int, 默认为 3) – 每个节点的杂质、阈值和值属性中浮点数的精度位数。
- property policy_model_
训练好的最终阶段策略模型