因果推断——简介_茵茵的聪聪的博客-程序员宝宝

技术标签: 倾向得分匹配  随机实验  自然实验  因果推断  

1. 因果推断是什么?

1.1 因果性与相关性

事件/变量之间的关系,最主要的有相关性因果性

  • 相关性是指在观测到的数据分布中,X与Y相关,如果我们观测到X的分布,就可以推断出Y的分布
  • 因果性是指在操作/改变X后,Y随着这种操作/改变也变化,则说明X是Y的因cause

在常用的机器学习算法中,关注的是特征之间的相关性,而无法去识别特征之间的因果性,而很多时候在做决策与判断的时候,我们需要的是因果性

举个例子,我们会发现在学校中,近视的同学成绩更好。近视和成绩好之间有强相关性,但显然近视不是成绩好的原因。而我们想要提升学生成绩,自然需要找到因,否则就会通过给学生戴眼镜的方式来提高成绩。

上面的例子是很明显地可以区分出相关与因果的,但是也有很多难以区分的,如经常喝葡萄酒的人寿命更长,是因为葡萄酒确实能延长寿命,还是因为能经常喝的人通常更富有,享有更好的医疗条件。

1.2 识别因果的必要性

很多时候,我们通过统计学方法或者机器学习算法得到的特征之间的相关性,就足以为我们的验证、决策提供指导,比如,我们通过数据发现,用户曝光的图片越多,留存越高,我们不需要知道这之间是否有复杂的因果关系,只需要通过简单的ABtest来检验更多的曝光是否有效果即可。

是否还有必要去识别因果性呢?答案是有的。

很多时候,我们需要确切地知道因果性,且无法通过ABtest简单地判断,比如:

  • 药物是否有效、政策是否有效,这种问题无法做ABtest
  • 新的推荐算法是否有效,ABtest成本高(不好的用户体验等)
  • ……

因此,面对这种特殊的问题,我们需要从已有的数据中推断出变量间的因果性。

1.3 本质是对因果效应的估计

前面说了因果性和相关性的区别、以及识别因果性的必要性,那么因果推断究竟是什么?

因果推断的核心思想在于反事实推理counterfactual reasoning,即在我们观测XY的情况下,推理如果当时没有做XY'是什么。

因果推断的目的是要判断因果性,即计算因果效应(有无X的情况下Y值的变化量)。在进行反事实推理后,可得出因果效应e = |Y - Y'|,进而判断因果性。

实际上,对于一个对象,我们永远只能观察到YY'的其中一个,因果推断所做的就是从已有数据中估计因果效应,所以我认为因果推断的本质是,对因果效应的估计

2. 一些因果推断的方法

上一部分对因果推断做了简单的介绍,本部分主要介绍一些因果推断的方法,如下图所示——

2.1 随机实验Randomization

2.1.1 A/B Test

以推荐算法为例,判断推荐算法是否有效,ABTest通过将用户随机分为两组,分别应用不同的算法,通过判断两组用户点击率的差异来估计因果效应。通过随机分组,排除了混淆变量的影响

A/B Test实际上是判断因果性的很有效的方法,但有时候成本过高无法采用,如这里的推荐算法——

  • 可能新的推荐算法太差导致用户流失
  • 如果有很多新的算法要测试,A/B Test效率较低
2.2.1 多臂老虎机 Multi-armed bandits

针对上述问题,另一种随机实验方法是强化学习中的多臂老虎机,实际上是对exploreexploit的平衡。

  • explore,随机选择一个动作,在上面的问题中是随机选择一个算法
  • exploit,选择收益最高的动作,在上面的问题中是选择当前效果最好的算法

通过某种规则(e-greedy等)重复上述过程,优点是可以同时测试多种算法,并且每个用户都能使用到最好的算法,减少流失可能性。缺点是效果难以评估,也很难让用户按照我们的想法行动。

2.2 自然实验Natural Experiments

理想的实验需要:随机分配(分组)、人为干预(施加不同的treatment)、结果比较

自然实验实际上是一种观察性研究,满足上述三个条件中的两个,是指不加干预地、实验对象**“自然”**地分为若干组,对实验对象的结果进行观察比较。

显然自然实验法的关键在于,实验对象是否能“自然”/随机地分组。比如,将是否民主将国家分为两组,探究制度与国家对外战争的关系。但是在这里,是否民主不是随机的分给各个国家,所以无法满足自然实验所需的随机分配原则。

2.2.1 断点回归Regression discontinuity

断点回归是自然实验中的一种观察方法,简单理解就是在回归过程中,观察在临界点处是否出现断层/断点。

举一个简单的例子,假设现在有一个产品,收集500个金币后就可以得到一个勋章,现在要判断有无勋章对用户在线时长的影响。

断点回归法观察金币在500附近的用户,如497到502,观察【接近500但小于500(无勋章)】与【接近500但大于500(有勋章)】的用户在线时长是否有显著区别,若有,说明有勋章很可能会增加用户的在线时长。

2.2.2 工具变量Instrumental Variables

对于要判断因果关系的两个变量间,如果存在其他混淆变量,在计量经济学中采用工具变量的方法解决。

以下述关系为例,要判断对APP1的访问,是否会导致对APP2的点击。实际上由于APP1和APP2之间的需求关系,误差项与解释变量相关,即计量经济学中的内生性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDZyHihk-1572246222711)(/../因果推断/img/)]

引入工具变量的目的是为了让误差项与解释变量不相关。具体地,通过找到一个变量,满足与解释变量相关且与误差项无关,那在引入这一变量之后,解释变量变化的部分就与误差项无关。

同样是上面的例子,假设某一天有个活动,下载APP1的人有奖励,这个活动与解释变量相关,但不会影响到APP2的需求,那根据多出来的APP1访问量与多出来的APP2点击率就不再受到需求关系的影响,就可以判断对APP1的访问,是否会导致对APP2的点击。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzXlydQm-1572246222712)(/../因果推断/img/)]

2.3 Conditioning

2.3.1 分层Stratification

分层的核心思想是控制条件变量,一般步骤如下:

  • 尽可能完整的绘制出变量之间的因果图
  • 选择影响要判断因果性的变量的条件变量
  • 对用户进行分层/分组,满足组内的用户条件变量取值一致(上层的变量将全部不需要再考虑,类似贝叶斯网络中的d分隔)
  • 比较两组用户的输出,计算因果效应

这种方式有点类似要找到相似的用户,当条件变量很多的时候,这种方法很难实现,很难找到很多条件变量都相同的用户,即使找到也会使得分组偏小。

2.3.2 倾向得分匹配Propensity score matching

当条件变量很多的时候,可以考虑使用倾向得分匹配

以推荐算法为例,当条件变量很多的时候,通过逻辑回归等方法对这些变量进行训练,并计算出一个倾向得分,在这里是用户被施加新算法的概率。因此倾向得分匹配的一般步骤如下:

  • 尽可能完整的绘制出变量之间的因果图
  • 选择影响要判断因果性的变量的条件变量
  • 对用户进行分层/分组,满足组内的用户计算得出的倾向得分接近(上层的变量将全部不需要再考虑,类似贝叶斯网络中的d分隔)
  • 比较两组用户的输出,计算因果效应

3. 小结

关于因果推断,上面介绍了三类方法——

  • 如果可以的话,尽可能使用随机实验(ABtest……)
  • 如果无法进行随机实验,则探索自然实验(断点回归……)
  • 如果自然实验也无法找到,考虑使用基于条件的方法(倾向得分匹配……)

以上是关于因果推断的入门知识,内容来自网上的博客与PPT,如有错误,请大佬指正~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36153312/article/details/102781633

智能推荐

TreeList 初始化示例_kone666的博客-程序员宝宝

/// /// 初始化树列表 /// private void InitTreeList() { Dictionary dictNode = new Dictionary(); treeIMGList.Nodes.Clear(); TreeListNode

eclipse连接mysql数据库_eclipse数据库mysql连接_乐以忘忧ls的博客-程序员宝宝

eclipse连接数据库挺简单的,由于我需要做综合实验,需要连接数据库,居然发现忘记了,所以就想写下来,给更多忘记如何连接数据库的朋友,上干货。1. 导入jar包新建项目后右击项目(怎么建项目自己琢磨)->build path->configure build path选择Libraries,点击Add External JARs…,选择jia包所在的文件夹,引入就可以了,点击...

beego 文件服务器,beego自动化文档_罗明灯他妈的博客-程序员宝宝

beego是什么?beego是一个快速开发go应用的http框架,go 语言技术大牛ASTA谢的开源项目。beego可以用来快速开发API、Web以及后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado、sinatra、flask这三个框架,结合了Go本身的一些特性(interface、struct继承等)而设计的。beego结合swagger就能实现自动化的文档。Sw...

Android MVVM模式入门 - DataBinding的使用_android mvvm教程_黄林晴的博客-程序员宝宝

前言关于开发模式的文章,这应该算是第二篇,第一篇中讲解了Android MVP模式的使用:https://blog.csdn.net/huangliniqng/article/details/80570920mvp模式的优点就不说了,缺点其实在使用的过程中很显然,比如现在有个需求对数据库的学生表增删改查,那么view的接口,我们可能有如下定义interface view{ ...

CSS3 box-shadow 效果大全(内阴影,外阴影,三边阴影,双边阴影,单边阴影,细线描边…)..._普通网友的博客-程序员宝宝

CSS3 box-shadow 属性用来描述一个元素的一个或多个阴影效果,该属性几乎可以让你完成你想要的任何阴影效果。然而 box-shadow 属性语法和取值非常灵活,...

随便推点

'autocomplete="off"'在Chrome中不起作用解决方案_autocomplete chorme_HeavyShell的博客-程序员宝宝

最近项目中遇到一个令人头疼的问题,查阅各种资料,尝试各种方法,最终得以解决;哎···下面就说说这心酸的历程吧。大家都知道autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为"on",也可以省略属性名,直接写入关键字on或off。网站项目中,有登录和注册的弹框,在除chrome的浏览器中一切都ok,

scroll、scrollBy和 scrollTo三种方法定位滚动条位置_weixin_30713953的博客-程序员宝宝

在默认情况下,页面加载完后默认滚动在最顶端,有些时候我们需要在页面打开后,定位滚动条的位置,比如,横向和纵向滚动条居中,实现页面滚动的方法有三种:scroll、scrollBy和 scrollTo,三个方法都带两个参数:x(X轴上的偏移量)和y(Y轴上的偏移量)。因此我们只需修改x,y的偏移量来设置滚动条的位置。另外,页面的滚动高度必须在网页加载完成后才能获取到,所以触发事件用onload。方...

02_get和post的区别_fantongl的博客-程序员宝宝

(1)get和post的区别1 首先,GET和POST都是HTTP协议中的两种发送请求的方法,由于HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP。GET和POST能做的事情是一样一样的。如果给GET加上request body,或者给POST带上url参数,技术上是完全行的通的。也就是说,GET和POST在本质上没什么区别。2 主要区别:get产生一个tcp数据包,而post产生两个tcp数据包。对于get请求的方式来说,浏览器会把http header和data一并发送给

基于jdk在windows 终端编译java 程序时输出中文时出现乱码情况_起帆的岛的博客-程序员宝宝

在基于windows平台通过jdk编译java代码时,如果输出中文时会出现乱码情况:原因:由于java编译时是通过unicode编码,而windows是通过GBK字符的编码,故在读取文件时编码方式不一致导致在编译输出时会出现乱码。解决办法:在终端编译java代码的时候,可以通过javac -encoding utf8 Test.java方法来编译

Nginx 作为代理服务器,加载JS文件报错,net::ERR_CONTENT_LENGTH_MISMATCH_kane_canpower的博客-程序员宝宝

查看nginx 日志发现报错[[email protected] logs]# tail error.log 2016/11/11 15:04:20 [crit] 8655#0: *21 open() "/usr/local/nginx/proxy_temp/1/00/0000000001" failed (13: Permission denied) while reading upstream

ratio_to_report_csdn1284934570的博客-程序员宝宝

语法:ratio_to_report(exp) over([partition by column_name,...])SQL> create table TEST  2  (  3    姓名 VARCHAR2(20),  4    科目 VARCHAR2(20),  5    成绩 NUMBER  6  )  7  /Table createdSQL

推荐文章

热门文章

相关标签