econml.dml.DML — econml 0.14.1 documentation
在这个示例中,我们使用
LinearDML
模型,使用随机森林回归模型来估计因果效应。我们首先模拟数据,然后模型,并使用方法来
effect
创建不同干预值下的效应(Conditional Average Treatment Effect,CATE)。
请注意,实际情况中的数据可能更加复杂,您可能需要根据您的数据和问题来适当选择的模型和参数。此示例仅供参考,您可以根据需要进行修改和扩展。
import numpy as np
from econml.dml import LinearDML
# 生成示例数据
np.random.seed(123)
n_samples = 1000
n_features = 5
X = np.random.normal(size=(n_samples, n_features))
T = np.random.uniform(low=0, high=1, size=n_samples) # 连续干预变量
y = 2 * X[:, 0] + 0.5 * X[:, 1] + 3 * T + np.random.normal(size=n_samples)
# 初始化 LinearDML 模型
est = LinearDML(model_y='auto', model_t='auto', random_state=123)
# 拟合模型
est.fit(y, T, X=X)
# 给定特征和连续干预值,计算干预效应
X_pred = np.random.normal(size=(10, n_features)) # 假设有新的数据点 X_pred
T_pred0 = np.array([0]*10) # 指定的连续干预值
T_pred11 = np.array([0.2, 0.4, 0.6, 0.8, 1.0, 0.3, 0.5, 0.7, 0.9, 0.1]) # 指定的连续干预值
T_pred1 = np.array([0.2]*10) # 指定的连续干预值
T_pred2 = np.array([0.4]*10) # 指定的连续干预值
T_pred3 = np.array([0.6]*10) # 指定的连续干预值
T_pred4 = np.array([0.8]*10) # 指定的连续干预值
# 计算连续干预效应
effect_pred = est.effect(X=X_pred, T0=T_pred0, T1=T_pred11)
print("预测的连续干预效应:", effect_pred)
# 计算连续干预效应
effect_pred = est.effect(X=X_pred, T0=T_pred0, T1=T_pred1)
print("预测的连续干预效应:", effect_pred)
在经济学因果推断(EconML)中,
marginal_effect
和
effect
是两个不同的概念:
-
Effect
(因果效应):
effect
通常是指一个因果估计的结果,表示一个变量(例如处理、干预、政策等)对另一个变量(例如结果、响应)的影响程度。这通常是一个定量的值,可以是正数、负数或零,用于表示处理对结果的影响,例如处理导致结果增加或减少了多少。
-
Marginal Effect
(边际效应):
marginal effect
是指一个因果估计模型中,对一个变量进行微小变化时,对结果的影响。它表示了在其他变量保持不变的情况下,对某个特定变量进行微小变化时,对结果的影响。
Marginal effect
可以用来理解在不同情况下,对一个特定变量的微小变化对结果的影响。
例如,在回归模型中,
effect
可能表示了某个因素对目标变量的总体影响,而
marginal effect
可能表示了在某个特定数值点上,对一个自变量进行微小变化时,目标变量的变化程度。
总之,
effect
表示总体影响,而
marginal effect
表示在特定情境下,自变量微小变化对因果结果的影响。这两个概念在因果推断中经常使用,用于深入理解因果关系和模型的行为。
# 使用 final_model_ 预测因果效应
effect_pred = est.model_final_.predict(np.column_stack((T_pred1, X)))
print(effect_pred)
def effect(self, X, T0=0, T1=1):
Parameters
----------
X : features
if not hasattr(T0, "__len__"):
T0 = np.ones(X.shape[0])*T0
if not hasattr(T1, "__len__"):
T1 = np.ones(X.shape[0])*T1
X0 = hstack([T0.reshape(-1, 1), X])
X1 = hstack([T1.reshape(-1, 1), X])
return self.model_final.predict(X1) - self.model_final.predict(X0)
def effect(self, X=None, *, T0, T1):
Calculate the heterogeneous treatment effect :math:`\\tau(X, T0, T1)`.
The effect is calculated between the two treatment points
conditional on a vector of features on a set of m test samples :math:`\\{T0_i, T1_i, X_i\\}`.
Since this class assumes a linear effect, only the difference between T0ᵢ and T1ᵢ
matters for this computation.
Parameters
----------
T0: (m, d_t) matrix
Base treatments for each sample
T1: (m, d_t) matrix
Target treatments for each sample
X: (m, d_x) matrix, optional
Features for each sample
Returns
-------
effect: (m, d_y) matrix (or length m vector if Y was a vector)
Heterogeneous treatment effects on each outcome for each sample.
Note that when Y is a vector rather than a 2-dimensional array, the corresponding
singleton dimension will be collapsed (so this method will return a vector)
X, T0, T1 = self._expand_treatments(X, T0, T1)
# TODO: what if input is sparse? - there's no equivalent to einsum,
# but tensordot can't be applied to this problem because we don't sum over m
eff = self.const_marginal_effect(X)
# if X is None then the shape of const_marginal_effect will be wrong because the number
# of rows of T was not taken into account
if X is None:
eff = np.repeat(eff, shape(T0)[0], axis=0)
m = shape(eff)[0]
dT = T1 - T0
einsum_str = 'myt,mt->my'
if ndim(dT) == 1:
einsum_str = einsum_str.replace('t', '')
if ndim(eff) == ndim(dT): # y is a vector, rather than a 2D array
einsum_str = einsum_str.replace('y', '')
return np.einsum(einsum_str, eff, dT)
The R Learner is an approach for estimating flexible non-parametric models of conditional average treatment effects in the setting with no unobserved confounders. The method is based on the idea of Neyman orthogonality and estimates a CATE whose mean squared error is robust to the estimation errors of auxiliary submodels that also need to be estimated from data:
-
the outcome or regression model
-
the treatment or propensity or policy or logging policy model
est = DML(
model_y=RandomForestClassifier(),
model_t=RandomForestRegressor(),
model_final=StatsModelsLinearRegression(fit_intercept=False),
linear_first_stages=False,
discrete_treatment=False
使用随机实验数据进行双重机器学习(DML)训练可能会在某些情况下获得更好的效果,但并不是绝对的规律。DML方法的性能取决于多个因素,包括数据质量、特征选择、模型选择和调参等。
使用随机实验数据进行训练的优势在于,实验数据通常可以更好地控制混淆因素,从而更准确地估计因果效应。如果实验设计得当,并且随机化合理,那么通过DML训练的模型可以更好地捕捉因果关系,从而获得更准确的效应估计。
然而,即使使用随机实验数据,DML方法仍然需要考虑一些因素,例如样本大小、特征的选择和处理、模型的选择和调参等。在实际应用中,没有一种方法可以适用于所有情况。有时,随机实验数据可能会受到实验设计的限制,或者数据质量可能不足以获得准确的效应估计。
因此,使用随机实验数据进行DML训练可能会在某些情况下获得更好的效果,但并不是绝对的规律。在应用DML方法时,仍然需要根据实际情况进行数据分析、模型选择和验证,以确保获得准确和可靠的因果效应估计。
连续干预/label01
import numpy as np
from econml.dml import LinearDML
import scipy
# 生成示例数据
np.random.seed(123)
n_samples = 1000
n_features = 5
X = np.random.normal(size=(n_samples, n_features))
T = np.random.uniform(low=0, high=1, size=n_samples) # 连续干预变量
#y = 2 * X[:, 0] + 0.5 * X[:, 1] + 3 * T + np.random.normal(size=n_samples)
y = np.random.binomial(1, scipy.special.expit(X[:, 0]))
# 初始化 LinearDML 模型
est = LinearDML(model_y='auto', model_t='auto', random_state=123)
# 拟合模型
est.fit(y, T, X=X)
# 给定特征和连续干预值,计算干预效应
X_pred = np.random.normal(size=(10, n_features)) # 假设有新的数据点 X_pred
T_pred0 = np.array([0]*10) # 指定的连续干预值
T_pred11 = np.array([0.2, 0.4, 0.6, 0.8, 1.0, 0.3, 0.5, 0.7, 0.9, 0.1]) # 指定的连续干预值
T_pred1 = np.array([0.2]*10) # 指定的连续干预值
T_pred2 = np.array([0.4]*10) # 指定的连续干预值
T_pred3 = np.array([0.6]*10) # 指定的连续干预值
T_pred4 = np.array([0.8]*10) # 指定的连续干预值
# 计算连续干预效应
effect_pred = est.effect(X=X_pred, T0=T_pred0, T1=T_pred11)
print("预测的连续干预效应:", effect_pred)
预测的连续干预效应: [-0.00793674 0.00612109 0.03141778 0.00310806 -0.01635394 -0.01905434
0.06801354 -0.0126543 -0.04603434 0.00821044]
ate是一个值
dml原理
Double Machine Learning, DML。
方法:首先通过X预测T,与真实的T作差,得到一个T的残差,然后通过X预测Y,与真实的Y作差,得到一个Y的残差,预测模型可以是任何ML模型,最后基于T的残差和Y的残差进行因果建模。
原理:DML采用了一种残差回归的思想。
优点:原理简单,容易理解。预测阶段可以使用任意ML模型。
缺点: 需要因果效应为线性的假设。
应用场景:适用于连续Treatment且因果效应为线性场景
单调性约束
因果推断的开源包中,有一些可以进行单调性约束的案例。这些案例通常涉及到因果效应的估计,同时加入了单调性约束以确保结果更加合理和可解释。以下是一些开源包以及它们支持单调性约束的案例示例:
-
CausalML(https://causalml.readthedocs.io/):
CausalML 是一个开源的因果推断工具包,支持单调性约束。它提供了一些可以用于处理单调性约束的方法,例如 SingleTreatment
类。您可以使用该包来在处理因果效应时添加单调性约束。
-
econml(https://econml.azurewebsites.net/):
- econml 也是一个用于因果推断的工具包,支持单调性约束。它提供了一些工具,如
SingleTreePolicyInterpreter
和 SingleTreeCateInterpreter
,用于解释单一决策树的因果效应,并且可以根据用户指定的特征添加单调性约束。
SingleTreeCateInterpreter(_SingleTreeInterpreter):
An interpreter for the effect estimated by a CATE estimator
Parameters
----------
include_model_uncertainty : bool, default False
Whether to include confidence interval information when building a
simplified model of the cate model. If set to True, then
cate estimator needs to support the `const_marginal_ate_inference` method.
uncertainty_level : double, default 0.05
The uncertainty level for the confidence intervals to be constructed
and used in the simplified model creation. If value=alpha
then a multitask decision tree will be built such that all samples
in a leaf have similar target prediction but also similar alpha
confidence intervals.
uncertainty_only_on_leaves : bool, default True
Whether uncertainty information should be displayed only on leaf nodes.
If False, then interpretation can be slightly slower, especially for cate
models that have a computationally expensive inference method.
即使使用随机实验数据,DML方法仍然需要考虑一些因素,例如样本大小、特征的选择和处理、模型的选择和调参等。如果实验设计得当,并且随机化合理,那么通过DML训练的模型可以更好地捕捉因果关系,从而获得更准确的效应估计。因此,使用随机实验数据进行DML训练可能会在某些情况下获得更好的效果,但并不是绝对的规律。在应用DML方法时,仍然需要根据实际情况进行数据分析、模型选择和验证,以确保获得准确和可靠的因果效应估计。请注意,实际情况中的数据可能更加复杂,您可能需要根据您的数据和问题来适当选择的模型和参数。
DoubleML-R中的双重机器学习
R包DoubleML提供了的双重/无偏机器学习框架的 。 它建立在和(Lang等人,2019)。
请注意,R包是与基于的python twin一起开发的。 python包也可以在和 。
文档和维护
R中的功能文档: :
用户指南: :
DoubleML当前由和维护。
双重/无偏机器学习框架
部分线性回归模型(PLR)
部分线性IV回归模型(PLIV)
互动回归模型(IRM)
交互式IV回归模型(IIVM)
基于的DoubleML的面向对象的实现非常灵活。 模型类DoubleMLPLR , DoubleMLPLIV , DoubleMLIRM和DoubleIIVM通过机器学习方法和Neyman正交得分函数的计算来实现对有害功能的估计。 所有其他功能都在抽象基类DoubleML 。 特别是用于估计双重机器学习模型并通过
声明:工作以来主要从事TTS工作,平时看些文章做些笔记。文章中难免存在错误的地方,还望大家海涵。平时搜集一些资料,方便查阅学习:TTS 论文列表 http://yqli.tech/page/tts_paper.html TTS 开源数据 http://yqli.tech/page/data.html
写在文前:该方向不是我研究的方向,只是凭着兴趣阅读相关文章,对应的实验没有时间和资源做(不能占用公司的资源)。
世界存在6000多种语言,按照工业标准来制作高质量的TTS和ASR,每种语言获取训
DoubleML-Python中的双机学习
Python软件包DoubleML提供了的双重/无偏机器学习框架的 。 它建立在(Pedregosa等,2011)。
请注意,Python软件包是与基于的R twin一起开发的。 R包也可以在和 。
文档和维护
文档和网站: :
DoubleML当前由和维护。
可以将错误报告给问题跟踪器,为 。
双重/无偏机器学习
部分线性回归模型(PLR)
部分线性IV回归模型(PLIV)
互动回归模型(IRM)
交互式IV回归模型(IIVM)
DoubleML的面向对象的实现非常灵活。 模型类DoubleMLPLR , Doub
线性模型可以是用曲线拟合样本,但是分类的决策边界一定是直线的,例如logistics模型
区分是否为线性模型,主要是看一个乘法式子中自变量x前的系数w,如果w只影响一个x,那么此模型为线性模型。或者判断决策边界是否是线性的
神经网络是非线性的
虽然神经网络的每个节点是一个logistics模型,但是组合起来就是一个非线性模型。
此处我们仅仅考虑三层神经网络
2. 计算特征相关性的方法,特征...
EconML:用于基于ML的异构处理效果估计的Python包
EconML是一个Python软件包,用于通过机器学习从观察数据中估计异构处理效果。 此软件包是作为Microsoft Research的一部分设计和构建的,目的是将最新的机器学习技术与计量经济学相结合,以使自动化解决复杂的因果推理问题。 EconML的承诺:
在计量经济学和机器学习的交集中实现文献中的最新技术
保持建模效果异质性的灵活性(通过诸如随机森林,增强,套索和神经网络之类的技术),同时保留对所学模型的因果解释,并经常提供有效的置信区间
使用统一的API
建立在用于机器学习和数据分析的标准Python软件包的基础上
机器学习的最大希望之一就是在众多领域中自动化决策。 许多数据驱动的个性化决策方案的核心是对异构处理效果的估计:对于具有特定特征集的样本,干预对感兴趣结果的因果关系是什么? 简而言之,该工具包旨在测量某些治疗变量T对结果变量Y的因果效应,控制一组特征X, W以及该效应如何随X 。 所实施的方法甚至适用于观测(非实验或历史)数据集。 为了使估计结果具有因果关系,有些方法假定没有观察到的混杂因素(即, X,
第一章、简介
本文基于吴恩达人工智能课程做学习笔记、并融入自己的见解(若打不开请复制到浏览器中打开)https://study.163.com/courses-search?keyword=吴恩达。
本文第二章介绍ML策略的正.