今天来探讨一下机器的“是非观”
00
Preface
我开始写这篇公众号的时候已经是凌晨,希望我的头脑还能在写作过程中保持足够的清醒。在前两篇清谈型的文章后(没看过的还是要看一下),今天我终于要进入到机器学习的正题。机器学习的目的是为了判断,而我们见过的判断题,大多都是是非题。如果你读过一些机器学习的书或文章,你会发现,有近一半的算法是在教机器回答是与否。许多数据挖掘的任务,最终也都会转化为判断是非的问题。更何况,莎士比亚说过,to be or not to be,this is a question。在接下来的数篇文章中,我将详细叙述有关这个问题的结题思路。
1
说到是非题,我又回忆起2010年的那个夏秋,我第一次做数据分析项目的时候。如果你读过之前的文章 ,你会知道我去了一家小型咨询公司,协助他们帮助国内一家大型的商业银行做信用评分卡的业务。信用评分卡是一个给前来办理贷款的客户进行打分的模型,该分数在一定程度上决定了银行是否会给该客户发放贷款。暂时不去想分数,银行最终给申请者的回复无非是批复或者不批复,这取决于银行认为该客户是不是会违约,这是一道典型的是非题。
这道是非题对于常年从事贷款审批的银行工作人员,并不是一件难事,但是有可能会花费很长时间进行审查。但换一道是非题,比如,我把我早上用的刮胡刀拿给你看,问你这是不是吹风机,你一定能迅速给出答案,那就是我有病。这里其实说明了两件事情。
首先,如果我们这一生只见过一样东西,那就是吹风机,那么,我们很有可能会把刮胡刀当做吹风机,因为那种情况下,在我们的世界观里,所有的物品都是吹风机。我们不会把刮胡刀当成吹风机,是我们不止见过各种各样的吹风机,也见过许多不是吹风机的物品,比如刮胡刀。而审批银行贷款的工作人员之所以能够判定客户是否会违约,是因为他们不仅遇到过违约客户,也遇到过不曾违约的客户。所以,为了做信用评分呢,需要先收集数据,数据里不仅要有足够的好客户(不曾违约,标记为0),也要有足够的坏客户(违约客户,标记为1)。
其次,区分刮胡刀和吹风机不是难事,因为这两个物品的特征有着肉眼可见的区别。但是对于银行客户来说,好客户和坏客户之间的区别几乎无法用肉眼找到其特征的差别。换句话说,客户特征和客户违约或者不违约之间的关系并不是明摆着的事情,需要进行深入的挖掘。
2
现在,假设我们手上已经有了N个客户,每个客户都有一个属性向量x(可能涵盖了他的职业、收入、教育背景、信用卡记录等),也有标签y(0或者1)。而且在数据里,标签y=0的客户和标签y=1的客户数量相差不大。这一点比较重要,想象一个极端的情况,在这个数据里只有一个坏客户,其他全部是好客户,那么对于这个是非题,我们只需回答,全都是好客户,错误率也就是1/N罢了。
我们需要利用这组数据,找到一个模型f,使得x经过f,就变成了客户的标签y。如果我们找到了这个模型,我们只需要把这个模型输入到机器中,机器就可以自行判断每个客户的违约情况。注意到,标签y是一个二元变量,只取0和1两个值,直接做线性回归显然是不合适的。
我说过,在目前弱人工智能的环境下,机器并不具备很强的自我学习能力,所以,通常是我们想到了一个结题的思路,然后把这个思路传递给机器。对于2010年刚从数学系毕业没多久的我而言,我还习惯于使用概率统计的方法来建模。也因此,我第一反应就是,我不要直接判断客户是否违约,我应该先去判断客户的违约概率p。可是p作为概率,是一个大于0且小于1的数字,直接对客户属性x做线性回归,总是会担心超出其定义域范围。假设属性x仅有一个维度,就是客户月收入,那么让p=b*x,你很难说,有一个b使得b*x就在0到1的范围内,因为x可能会很大。
这个时候,可以去思考一下,如何消除这种定义域的限制。假设有w这个变量,w在负无穷到正无穷之间,而且w和p之间有明确的关系式,那我们可以用x来对w建模,然后再把w转换成p。有这样的w么?有,还不少。你可以这样想,p在0到1之间,那么p/(1-p)就恰好落在0到正无穷之间,在取自然对数呢log(p/(1-p)),正好就在负无穷到正无穷之间了。所以可以令w=log(p/(1-p))。如果你看过一点神经网络的章节,你自然就知道sigmoid这个函数,这里,p=sigmoid(w)。
剩下的问题时,如果w和客户特征x之间是线性关系,那么系数应该是多少?
3
先设想你在赌坊里,在赌骰子大小。如果骰子正常,出现大和小的概率应该都是1/2。可是如果你连押20次大,可是荷官却掷出了19个小,一个大,那么请问,你还会觉得这个骰子出现大小的概率是1/2么?显然概率是1/2恐怕是不太可能了,这个骰子出现小的概率肯定大于1/2,说是0.99,或许你都觉得有可能,至少比1/2要更有可能(记住,仅仅是更有可能)。好了,回到信用评分里来。
我把问题简单化,假定在数据里,我们仅有两个个客户,其记录分别为(3, 0),(1, 1)。这两个向量的第一个元素都是客户的特征,假设代表了客户的月收入(以千为单位)。第二个元素是客户的标签,0代表这个客户没有违约。根据之前的分析,令w=b*x,p=sigmoid(x)。那么b应该是多少?有时当你不知该如何去选择参数值时,你可以先看一看当这个参数变化时,会导致你对数据的理解发生什么变化。
这里,我们可以对比一下b=0.5与b=0。当b=0.5时,对于x=3的客户,w=1.5,p=sigmoid(0.3)约等于0.8。对于x=1的客户,w=0.5,p=sigmoid(0.5)约等于0.6。这里,p是客户违约的概率。x=3的客户没有违约(因为他的标签是0)且x=1的客户违约的概率是多大?就好像掷硬币一样,出现正反的概率都是0.5,扔两次,一次正面,一次反面的概率,自然就是1/2*1/2=1/4。类似的,x=3的客户没有违约且x=1的客户违约的概率是(1-0.8)*0.6=0.12。
当b=0时,我们同样可以计算出x=3的客户没有违约且x=1的客户违约的概率,它是0.25。那么,你觉得,如果b只能取0.5和0,哪个值更有可能(编辑,加粗)呢?显然,我会觉得b=0更有可能,因为b=0时这组数据出现的概率大于b=0.5时。
这里,就有了一个思路,那就是寻找b,这个b使得我们看到这组数据的概率最大。反过来说,就是,我们看到这组数据的概率其实是b的一个函数,随着b的变化,函数值也会发生变化,最大化函数值的b,就是最有可能的那个参数。在这里,这个本质上是数据发生的概率的关于b的函数,被命名为似然函数(likelihood function),它反映了b为任一值的可能性(likelihood)。最大化函数,就是统计建模里常常用到的极大似然估计。
4
刚才我们提到了两个客户的情况,我相信你有能力把它拓展到多个客户,乃至其他数据挖掘的任务中去,只要问题还是是非题。今天讲的这个是非判断的方法,多年以来,都被称为逻辑回归,因为log(p/(1-p)),等同于logistic(p)。在周教授的西瓜书里,周教授表示logistic regression这个词语翻译成逻辑回归过于直白,他将其称为对数几率回归。
到这里为止,就是我今天要讲的极大似然估计,我曾经想过能不用一个公式就去把它说明白,但还是不能做到,希望今天的内容不会让你觉得枯燥。逻辑回归,或者对数几率回归,以及它所用到的极大似然估计,在数据挖掘中占有非常重要的地位,是经常被用到的技术。
附言
附言1:
极大似然估计在似然函数写好后,就变成了一个优化问题。因为似然函数是数据里各个观测发生的概率的乘积,一是在求导的时候不方便,二是梯度太小,所以一般来说,我们去极大化似然函数的自然对数(你可以写个函数出来,感受一下其中的变化)。如果你看过机器学习实战这本书,它在讲逻辑回归的时候,压根都没提似然函数,却直接给了一个算法。你可以结合随机梯度法,思考一下这个算法是怎么来的。
附言2:
逻辑回归,是对p使用了logistic函数后,把其转化成了在负无穷到正无穷区间内变动的变量。当然,还有其他具有类似功能的函数,你可以私下想一想。
附言3:
你可以随便找一个数据,使用一下logistic regression法。然后你可以计算一下,那个最大的似然值是多少。你会发现它小得可怜,可能比0.000000000001还要接近于0。这也是极大似然估计被人诟病的地方,最大的似然值也近是“在瘸子里挑将军”的结果,因此,有学者更加青睐于贝叶斯估计。
连载文章推荐
机器学习|刘博士谈机器学习--开篇
机器学习|刘博士谈机器学习--起手式