根据福布斯的统计数据,全球范围只有 13% 左右的机器学习项目能够真正上线运行,项目失败的一个重要原因是模型的泛化能力不足,在真实数据上的表现和完全达不到训练数据上的效果。随着机器学习建模越来越多的应用,企业对人工智能的要求也在进一步提高。近几年提及的「数智化」核心是智能决策,以数据驱动的方式实现自动化决策来提高整体运营效率。用户的需求的重心从预测性分析向指导性分析升级转移,预测性分析是告诉企业未来可能会发生什么,指导性分析也叫处方性分析,是告诉企业我们如果想要实现一个目标需要如何做,这是典型的智能决策问题。机器学习主要用在预测性分析上,基本上没有能力解决指导性分析这样的决策问题,因此,因果学习正被学界和业界逐渐重视起来,其可以补充机器学习的一些短板,也满足了智能决策这类问题的需求。因果推断的重要性逐渐显示,被认为是人工智能领域的一次范式革命。7 月 12 日,九章云极 DataCanvas 发布了 YLearn 因果学习开源项目,是全球首款一站式处理因果学习完整流程的开源算法工具包。第一,数据中的因果结构应当首先被学习和发现,用作这一任务的手段通常被称为因果发现(causal discovery)。这些被发现的因果关系会被表示为因果结构公式(structural causal models, SCM)或因果图(一种有向无环图,directed acyclic graphs, DAG)。
第二,我们需要将我们感兴趣的因果问题中的量用因果变量(causal estimand)表示,其中一个例子是平均治疗效应(average treatment effect, ATE)。这些因果变量接下来会通过因果效应识别转化为统计变量(statistical estimand),这是因为因果变量无法从数据中直接估计,只有识别后的因果变量才可以从数据中被估计出来。
最后,我们需要选择合适的因果估计模型从数据中去学些这些被识别后的因果变量。完成这些事情之后,诸如策略估计问题和反事实问题等因果问题也可以被解决了。
YLearn 因果学习开源项目实现了最近文献中多个因果推断相关算法,并且致力于在机器学习的帮助下支持因果推断流程中从因果发现到因果效应估计等各方各面的相关内容,尤其是当有很多观测得到的数据时,这一目的会更有前景。YLearn 因果学习开源项目(以下简称 YLearn),是业界首款一站式处理因果学习完整流程的开源算法工具包,率先同时解决了因果学习中「因果发现、因果量识别、因果效应估计、反事实推断和策略学习」五大关键问题,具有一站式、新而全、用途广等特点,将「决策者」使用门槛降到最低,助力政府和企业自动化「决策」能力的有效提升。GitHub 开源地址:https://github.com/DataCanvasIO/YLearn用于弥补机器学习理论上的缺陷。在机器学习模型中加入因果机制,利用因果关系的稳定性和可解释性,优化模型、提升效率;帮助实现用户需求从预测到决策的迁移,例如使用基于因果推断的推荐算法帮助企业进行客户增长和智能营销等。一站式:通常的因果学习流程包括从数据中发现因果结构,对因果结构建立因果模型,使用因果模型进行因果效应识别和对从数据中对因果效应进行估计。YLearn 一站式地支持这些功能,使用户以最低的学习成本使用与部署因果学习。
新而全:YLearn 实现了多个近年来在因果学习领域中发展出的各类算法,例如 Meta-Learner、Double Machine Learning 等。也将一直致力于紧跟前沿进展,保持因果识别与估计模型的先进和全面。
用途广:YLearn 支持对估计得到的因果效应进行解释、根据因果效应在各种方案中选取收益最大的方案并可视化决策过程等功能。除此之外,YLearn 也支持将因果结构中识别出的因果效应的概率分布表达式以 LaTex 的形式输出等小功能,帮助用户将因果学习与其他方向交叉。
YLearn 有 5 个主要的因果推断相关概念,包括:- CausalDiscovery. 发现数据集中线性和非线性的因果关系并用因果图表示。
- CausalModel. 确定感兴趣的因果量之后,识别因果图中的工具变量,操作因果图,识别因果效应(Causal Effect)的估计表达式,也可判断给定集合是否可以作为后门调整集合,前门调整集合等。
- EstimatorModel. 给定因过量的估计表达式与训练数据集,从训练数据集中训练多种估计模型,使用训练好的估计模型在新的测试数据集上估计因果效应。
- Policy. 给定感兴趣的因果效应和数据集,寻找一种最佳方案以提升因果效应,获取理想收益。
- Interpreter. 解释估计模型(EstimatorModel)所预测的因果效应,解释策略模型(Policy)所给出的最佳方案。
这些不同的部分通过组合,可以完成一个完整的因果学习相关流程,为了方便使用,YLearn 也将它们一起封装在 Why 这个统一的 API 接口中。- 使用 CausalDiscovery 去发现数据中的因果关系和因果结构,它们会以 CausalGraph 的形式表示和存在。
- 这些因果图接下来会被输入进 CausalModel, 在这里用户感兴趣的因果变量会通过因果效应识别转化为相应的可被估计的统计变量(也叫识别后的因果变量)。
- 一个特定的 EstimatorModel 此时会在训练集中训练,得到训练好的估计模型,用来从数据中估计识别后的因果变量。
- 这个(些)训练好的 EstimatorModel 就可以被用来在测试数据集上估计各类不同的因果效应,同时也可以被用来作因果效应解释或策略方案的制定。
在 YLearn 中,给定一个变量集合,与之相关的因果关系需要一个 python dict 去表示变量中的因果关系,在这个 dict 中,每一个 key 都是它相应 value (通常是一个 list)中的每一个元素的 children。我们举一个最简单的例子,给定因果结构 X <- W -> Y ,我们首先定一个一个 python dict 表示相关因果结构,这个 dict 会被当作参数传入 CausalGraph 中:causation = {'X': ['W'], 'W':[], 'Y':['W']}
cg = CausalGraph(causation=causation)
cg 就是我们的表示了因果关系 X <- W -> Y 的因果图。同时需要注意的是,如果存在 不可观测的混淆因子(unobserved confounder),那么除了前述的 dict 外,我们需要一个额外的 python list 去记录这些不可观测的因果结构,比如下面的因果图存在不可观测的混淆因子(绿色节点):它会首先被转化为一个有潜在混淆曲线(latent confounding arcs,下图中有两个箭头的黑色曲线)的因果图:(1) 定义一个 python dict 表示图中可观测的部分。(2) 定义一个 list 记录不可观测的潜在混淆曲线,其中 list 中的每一个元素包括一条不可观测潜在混淆曲线的两个端点:from ylearn.causal_model.graph import CausalGraph
causation_unob = {
'X': ['Z2'],
'Z1': ['X', 'Z2'],
'Y': ['Z1', 'Z3'],
'Z3': ['Z2'],
'Z2': [],
}
arcs = [('X', 'Z2'), ('X', 'Z3'), ('X', 'Y'), ('Z2', 'Y')]
cg_unob = CausalGraph(causation=causation_unob, latent_confounding_arcs=arcs)
因果效应识别对于因果效应(包括因果变量)估计是至关重要的,这一过程可以通过 YLearn 很轻松地实现。例如,假设我们希望识别上面的因果图 cg 中的因果变量 P(Y|do(X=x)),那么我们只需要定义一个 CausalModel 然后调用它的 identify() 方法即可: cm = CausalModel(causal_graph=cg)
cm.identify(treatment={'X'}, outcome={'Y'}, identify_method=('backdoor', 'simple'))
在上面的例子中我们使用了 后门调整,YLearn 也支持包括前门调整,工具变量识别,一般因果效应识别[1](如果任意因果量可以被识别,返回识别后的结果,如果不可识别,则返回不可识别)等各类识别算法。工具变量是一种因果推断中很重要的手段,利用 YLearn 去寻找工具变量十分方便直接,例如,我们有如下的因果图:那么我们可以按使用 CausalModel 的常用步骤来识别工具变脸:(1)定义 dict 和 list 去表示因果关系;(2)定义 CausalGraph 的 instance 建立 YLearn 中的因果图;(3)以上一步定义的 CausalGraph 作为参数,定义 CausalModel 的 instance;(4)调用 CausalModel 的 get_iv() 寻找工具变量: causation = {
'p': [],
't': ['p', 'l'],
'l': [],
'g': ['t', 'l']
}
arc = [('t', 'g')]
cg = CausalGraph(causation=causation, latent_confounding_arcs=arc)
cm = CausalModel(causal_graph=cg)
cm.get_iv('t', 'g')
使用 YLearn 进行因果效应估计十分方便直接(与通常的机器学习模型使用方式十分类似,因为 YLearn 主要着眼于机器学习与因果推断的交叉),它是一个包括 3 个步骤的流程:- 给定 pandas.DataFrame 形式的数据,确定 treatment, outcome, adjustment, covariate 的变量名。
- 调用 EstimatorModel 的 fit() 方法训练模型。
- 调用 EstimatorModel 的 estimate() 方法得到估计好的因果效应。
用户可以查看文档中的相关页面查阅各类估计模型的细节。为了能以一种统一且方便的方式使用 YLearn,YLearn 提供了一个接口 Why,它几乎封装了 YLearn 中的所有内容,包括因果效应识别和评估训练得到的估计模型等。在使用 Why 的过程中,用户可以先创建一个 Why 的实例,然后调用 Why 的 fit() 方法训练这个实例,之后其他的各类方法(如 causal_effect(), score(), whatif())就可以使用了。下面的代码是一个简单的使用样例: from sklearn.datasets import fetch_california_housing
from ylearn import Why
housing = fetch_california_housing(as_frame=True)
data = housing.frame
outcome = housing.target_names[0]
data[outcome] = housing.target
why = Why()
why.fit(data, outcome, treatment=['AveBedrms', 'AveRooms'])
print(why.causal_effect())
从普遍意义上讲,只要是需要决策支持的这类任务都可以使用 YLearn 来完成,弹性定价、客户挽留、产品推荐、广告等等,前提条件和机器学习一样就是要准备好符合要求的数据就可以。因果学习其中有一个重要的应用就是 Uplift 建模,直接字面理解就是提升建模,提升的是什么可以认为提升 ROI(投入产出比),非常适合用在精准营销上面。提升建模的核心是把目标用户分到 4 个象限里。在向一些用户推荐去购买一个产品,比如说一个理财或者是线上的订阅服务,那么现实中用户会有 4 类:- 确定会购买的用户,不管我是否推荐这类用户都会购买(铁粉)
- 我的推荐会提高用户购买转化的,如果不推荐他不会购买(路转粉)
- 是一些静默用户本来已经订阅了我们的服务,一旦收到我们的推荐提醒反而取消了订阅(粉转黑)。
对 1、2 类用户,铁粉、黑粉我们都不需要干预他,因为这个投入成本的收益几乎是 0,可以节省营销成本,第 4 类用户更是坚决不要去触达他,避免产生副作用。我们重点需要触达的就是第 3 类用户,促进购买行为。那么机器学习模型是没办法完成这个任务,我们需要通过因果学习里面的异质化因果效应评估也就是 CATE 来完成,而且还可以更进一步,路转粉的用户用哪种手段收益更高,优惠卷、打折、还是什么都不用给打个电话就可以了,这个也是可以学习出来,不同的用户可以有不同的策略,最后我们可以综合性的提高总体投入产出比了。这是一个很典型的 YLearn 的应用场景。下一步的计划主要是对 YLearn 进行不断迭代,从工具的成熟度、算法效率、以及最新算法的支持上不断完善。其将在这三个方向展开:1、Causal Machine Learning:通过因果学习的能力改善机器学习,解决机器学习遇到的一些问题,比如更高效的特征发现、特征工程。还有希望通过因果关系能够提高机器学习的鲁棒性、泛化能力和解释性。2、Automated Causal Learning:自动化的因果学习工具包,更 high-level 的 API 接口,解决自动化调参和优化的问题。让因果学习更简单高效。3、Decision Graph:决策图谱,能够把一个系统内的关键运营指标和可干预变量构建出一个基于因果关系的图谱,通过可视化的交互式的方式来推演各种决策动作对运营指标带来的影响。