事件/变量之间的关系,最主要的有相关性和因果性。
cause
在常用的机器学习算法中,关注的是特征之间的相关性,而无法去识别特征之间的因果性,而很多时候在做决策与判断的时候,我们需要的是因果性。
举个例子,我们会发现在学校中,近视的同学成绩更好。近视和成绩好之间有强相关性,但显然近视不是成绩好的原因。而我们想要提升学生成绩,自然需要找到因,否则就会通过给学生戴眼镜的方式来提高成绩。
上面的例子是很明显地可以区分出相关与因果的,但是也有很多难以区分的,如经常喝葡萄酒的人寿命更长,是因为葡萄酒确实能延长寿命,还是因为能经常喝的人通常更富有,享有更好的医疗条件。
很多时候,我们通过统计学方法或者机器学习算法得到的特征之间的相关性,就足以为我们的验证、决策提供指导,比如,我们通过数据发现,用户曝光的图片越多,留存越高,我们不需要知道这之间是否有复杂的因果关系,只需要通过简单的ABtest来检验更多的曝光是否有效果即可。
是否还有必要去识别因果性呢?答案是有的。
很多时候,我们需要确切地知道因果性,且无法通过ABtest简单地判断,比如:
因此,面对这种特殊的问题,我们需要从已有的数据中推断出变量间的因果性。
前面说了因果性和相关性的区别、以及识别因果性的必要性,那么因果推断究竟是什么?
因果推断的核心思想在于反事实推理counterfactual reasoning
,即在我们观测到X
和Y
的情况下,推理如果当时没有做X
,Y'
是什么。
因果推断的目的是要判断因果性,即计算因果效应(有无X
的情况下Y
值的变化量)。在进行反事实推理后,可得出因果效应e = |Y - Y'|
,进而判断因果性。
实际上,对于一个对象,我们永远只能观察到Y
和Y'
的其中一个,因果推断所做的就是从已有数据中估计因果效应,所以我认为因果推断的本质是,对因果效应的估计。
上一部分对因果推断做了简单的介绍,本部分主要介绍一些因果推断的方法,如下图所示——
以推荐算法为例,判断推荐算法是否有效,ABTest通过将用户随机分为两组,分别应用不同的算法,通过判断两组用户点击率的差异来估计因果效应。通过随机分组,排除了混淆变量的影响。
A/B Test实际上是判断因果性的很有效的方法,但有时候成本过高无法采用,如这里的推荐算法——
针对上述问题,另一种随机实验方法是强化学习中的多臂老虎机,实际上是对explore
和exploit
的平衡。
explore
,随机选择一个动作,在上面的问题中是随机选择一个算法exploit
,选择收益最高的动作,在上面的问题中是选择当前效果最好的算法通过某种规则(e-greedy
等)重复上述过程,优点是可以同时测试多种算法,并且每个用户都能使用到最好的算法,减少流失可能性。缺点是效果难以评估,也很难让用户按照我们的想法行动。
理想的实验需要:随机分配(分组)、人为干预(施加不同的treatment)、结果比较,
自然实验实际上是一种观察性研究,满足上述三个条件中的两个,是指不加干预地、实验对象**“自然”**地分为若干组,对实验对象的结果进行观察比较。
显然自然实验法的关键在于,实验对象是否能“自然”/随机地分组。比如,将是否民主将国家分为两组,探究制度与国家对外战争的关系。但是在这里,是否民主不是随机的分给各个国家,所以无法满足自然实验所需的随机分配原则。
断点回归是自然实验中的一种观察方法,简单理解就是在回归过程中,观察在临界点处是否出现断层/断点。
举一个简单的例子,假设现在有一个产品,收集500个金币后就可以得到一个勋章,现在要判断有无勋章对用户在线时长的影响。
断点回归法观察金币在500附近的用户,如497到502,观察【接近500但小于500(无勋章)】与【接近500但大于500(有勋章)】的用户在线时长是否有显著区别,若有,说明有勋章很可能会增加用户的在线时长。
对于要判断因果关系的两个变量间,如果存在其他混淆变量,在计量经济学中采用工具变量的方法解决。
以下述关系为例,要判断对APP1的访问,是否会导致对APP2的点击。实际上由于APP1和APP2之间的需求关系,误差项与解释变量相关,即计量经济学中的内生性。
引入工具变量的目的是为了让误差项与解释变量不相关。具体地,通过找到一个变量,满足与解释变量相关且与误差项无关,那在引入这一变量之后,解释变量变化的部分就与误差项无关。
同样是上面的例子,假设某一天有个活动,下载APP1的人有奖励,这个活动与解释变量相关,但不会影响到APP2的需求,那根据多出来的APP1访问量与多出来的APP2点击率就不再受到需求关系的影响,就可以判断对APP1的访问,是否会导致对APP2的点击。
分层的核心思想是控制条件变量,一般步骤如下:
这种方式有点类似要找到相似的用户,当条件变量很多的时候,这种方法很难实现,很难找到很多条件变量都相同的用户,即使找到也会使得分组偏小。
当条件变量很多的时候,可以考虑使用倾向得分匹配。
以推荐算法为例,当条件变量很多的时候,通过逻辑回归等方法对这些变量进行训练,并计算出一个倾向得分,在这里是用户被施加新算法的概率。因此倾向得分匹配的一般步骤如下:
关于因果推断,上面介绍了三类方法——
以上是关于因果推断的入门知识,内容来自网上的博客与PPT,如有错误,请大佬指正~
/// /// 初始化树列表 /// private void InitTreeList() { Dictionary dictNode = new Dictionary(); treeIMGList.Nodes.Clear(); TreeListNode
eclipse连接数据库挺简单的,由于我需要做综合实验,需要连接数据库,居然发现忘记了,所以就想写下来,给更多忘记如何连接数据库的朋友,上干货。1. 导入jar包新建项目后右击项目(怎么建项目自己琢磨)->build path->configure build path选择Libraries,点击Add External JARs…,选择jia包所在的文件夹,引入就可以了,点击...
beego是什么?beego是一个快速开发go应用的http框架,go 语言技术大牛ASTA谢的开源项目。beego可以用来快速开发API、Web以及后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado、sinatra、flask这三个框架,结合了Go本身的一些特性(interface、struct继承等)而设计的。beego结合swagger就能实现自动化的文档。Sw...
前言关于开发模式的文章,这应该算是第二篇,第一篇中讲解了Android MVP模式的使用:https://blog.csdn.net/huangliniqng/article/details/80570920mvp模式的优点就不说了,缺点其实在使用的过程中很显然,比如现在有个需求对数据库的学生表增删改查,那么view的接口,我们可能有如下定义interface view{ ...
CSS3 box-shadow 属性用来描述一个元素的一个或多个阴影效果,该属性几乎可以让你完成你想要的任何阴影效果。然而 box-shadow 属性语法和取值非常灵活,...
《奔跑吧Linux内核(第二版)》第一章
最近项目中遇到一个令人头疼的问题,查阅各种资料,尝试各种方法,最终得以解决;哎···下面就说说这心酸的历程吧。大家都知道autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为"on",也可以省略属性名,直接写入关键字on或off。网站项目中,有登录和注册的弹框,在除chrome的浏览器中一切都ok,
在默认情况下,页面加载完后默认滚动在最顶端,有些时候我们需要在页面打开后,定位滚动条的位置,比如,横向和纵向滚动条居中,实现页面滚动的方法有三种:scroll、scrollBy和 scrollTo,三个方法都带两个参数:x(X轴上的偏移量)和y(Y轴上的偏移量)。因此我们只需修改x,y的偏移量来设置滚动条的位置。另外,页面的滚动高度必须在网页加载完成后才能获取到,所以触发事件用onload。方...
(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一并发送给
在基于windows平台通过jdk编译java代码时,如果输出中文时会出现乱码情况:原因:由于java编译时是通过unicode编码,而windows是通过GBK字符的编码,故在读取文件时编码方式不一致导致在编译输出时会出现乱码。解决办法:在终端编译java代码的时候,可以通过javac -encoding utf8 Test.java方法来编译
查看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(exp) over([partition by column_name,...])SQL> create table TEST 2 ( 3 姓名 VARCHAR2(20), 4 科目 VARCHAR2(20), 5 成绩 NUMBER 6 ) 7 /Table createdSQL