首页 > Python机器学习 阅读数:39

Logistic回归分类算法详解

本节教程我们来讨论另外一种被广泛应用的分类算法— Logistic 回归。在讲解这个概念之前,我们先来聊一个题外话—“Logistic regression”的中文译法。“regression”译作“回归”,并没有什么异议,而“Logistic”的翻译可谓五花八门。有译作“逻辑斯谛”的,这种音译中规中矩,自然不能算错,但不够形象。

更多文献直接将其译作“逻辑”,这种译法可能就有点误导大家了。“逻辑”(logic)本来是一个哲学概念,它注重的是推论和证明,而“Logistic”主要用于机器学习领域的分类。二者几乎无关联,如此翻译,至少违反了“信达雅”中的“信”—不够确切。

可能你要问了,我们是在讨论“机器学习”,为何要纠结“Logistic”一词的译法呢?并不是因为我们“好为人师”,而是这关系到对“Logistic 回归”内涵的理解。下面我们就从为什么需要 Logistic 回归开始说起。

为什么需要Logistic回归

首先,需要强调的是,Logistic 回归也属于监督学习之列,虽然带有“回归”二字,但它却是名副其实的“分类”算法。通过前面的学习,我们知道,分类与传统意义上的回归最大的不同在于,分类算法输出的是离散的标签值(比如花的品类),而回归输出的是连续的实数(比如花瓣长度)。

前面我们已经提到,线性回归模型的优点在于,数据拟合简单直观,输出结果解释力强,但在部分场景下,它也会捉“捉襟见肘”,难以胜任。

下面我们来看这样一个场景。比如说,在一家服装店里,商家想根据顾客的各类特征(自变量 x),包括但不限于性别、年龄、穿着习惯、谈吐、颜值等,来预测自己的销售额(因变量 y)。显然,销售额是连续的实数值,因此这个模型构建起来,就是一个地地道道的线性回归模型。

y=w0+w1x1+w2x2+...+wmxm


其中,w0 表示截距,wi 表示与各个特征 xi 相匹配的权值。相比于预测店铺销售额这类高层次问题,销售员可能更关注一个问题:光临店铺的顾客“买”还是“不买”商品。注意,此时目标输出变量只有两类值:0(代表不买)和 1(代表买),这显然是一个二分类问题。

其实,这也是一个很重要的问题。拓展一下,在整个互联网电商世界,聪明的商家无不是通过收集大量的用户标签(如性别、年龄、购买力、页面停留时间等),来形成用户画像(User Profile)的。最终,商家面临的也都是一个二分类问题:用户要不要观看某个视频,用户要不要点击某条新闻,用户要不要购买某个商品等。究其本质,都是一样的。因此,对二分类问题实施建模,具有一定的普适意义。

但问题在于,我们观察到的样本特征,往往是连续的实数值,而我们输出的目标却是“非 0 即 1”这样的离散整数值,如果用简单的线性回归模型,那么无论 {wi} 怎么“上蹦下跳”,也难以有效达成“连续值→离散值”的映射。也就是说,简单的线性回归模型难以实现数据和目标数据之间的拟合。

如果直接拟合很难,那我们能不能转换一下思维方式呢?在输出值方面,我们暂时先做一点点妥协,不再考虑“非黑即白”的二分类(买或不买),而是考虑买或不买的概率。由于概率是一个连续值,这样一来,我们就重新回到了“连续值→连续值”的映射上,这似乎保持了“回归”的特性。

然后,我们给出一个阈值(θ),一旦概率大于 θ,就表示购买的可能性大。反之,低于 θ 表示购买的可能性小。可是,你可能会问,这个阈值该如何设定呢?

事实上,这个阈值可以不直接设定。我们假设购买的概率为 P,显然,对于一个二分类,不购买的概率就是 1-P。我们只要保证购买的概率 P 大于不够买的概率(1-P)就可以了,用数学的语言描述就是:

p/(1-p)>1

上面公式刻画的概念就是“odds”(几率)。如此一来,我们就把一个观察的连续值和一个输出的连续值关联起来了。但这似乎还不够,我们需要把二者用数学模型连接起来,即用到非常重要的 logit 变换。

Logistic源头初探

在统计学领域,Logistic 的同义词是 logit。logit 常出现在很多机器学习框架的函数中。那么 logit 到底是什么意思呢?

在统计学里,概率(Probability,简称 P)描述的是某事件 A 出现的次数与所有事件出现的次数之比。很显然,概率 P 是一个介于 0~1 之间的实数;P=0,表示事件 A 一定不会发生,而 P=1 则表示事件 A 一定会发生。以掷骰子为例,由于骰子有 6 面,任意一面的点数出现的概率都是相同的。于是,事件 A“掷出点数 1”的概率 P(A)=1/6。

在英文中,odds 的本意是“几率”“可能性”,它和我们常说的概率又有什么区别呢?相比于概率 P,odds 指的是事件发生的概率与事件不发生的概率之比:

odds(A)=事件A发生的概率/事件A不发生的概率


还拿掷骰子的例子来说,掷出点数 1 的 odds 为:

odds(掷出点数1)=(1/6)/(5/6)=1/5


很明显,odds 和 P 之间的关系为:

odds(A)=P(A)/1-P(A)


进一步简化可知:

odds(A)=事件A发生的次数/发生其他事件的次数(即事件A不发生的次数)


很容易推导得知,P(A) 和 odds(A) 的值域是不同的。前者的值域是 [0,1],而后者则是 [0,+∞)。

那这和 logit 到底有什么关系呢?请注意“logit”一词的构成,它的含义是对它(it)取对数(log),这里“it”就是指 odds。下面我们就可以给出 logit 的定义了:

logit(odds)=log(p/1-p)


上面实际上就是所谓 logit 变换,其曲线如图 1 所示。
logit变换曲线
图 1:logit变换曲线

或许你要问,那为什么要实施 logit 变换呢?简单来说,在机器学习领域,很多变换都是为了方便模型更好地拟合数据,logit 变换亦是如此。从图 1 中可以看出,通过变换,logit 就具备了一个很重要的特性,即它的值域为 (-∞, +∞),摆脱了上下限制,这就给数据的拟合提供了方便。当然,其优点并不局限于此,后面会继续讨论。

通常,logit 变换的对数底是自然对数e,这里我们把 odds 用更简单的符号 z 表示,则有:

z=ln(p/1-p)


显然,通过公式上面,我们也容易反推出概率P的值:

p=e2/(1+e2)


如果我们再将公式上面做以简单变形,让分子和分母同时乘以 e-z,并按分布函数的格式写出来,可得到:

p=(Z≤z)=1/(1+e2)


这里,Z 表示随机变量,取值为实数。上面公式正是在 Logistic 回归和神经网络中广泛使用的 Sigmoid 函数,又称 Logistic 函数(以后不再区分这两种叫法)。该函数有很多优良的“品性”,如单调递增、处处可导等,如图 2 所示。
Logistic函数
图 2:Logistic 函数

行文至此,或许你对“logit”的内涵已经有了更为准确的理解。追根溯源,Logistic regression 比较“信达雅”的中文译法应该为“对数几率回归”。比如,在那本著名的“西瓜书”《机器学习》中,这个词就是这么翻译的。

Logistic 回归通过使用其固有的 Logistic 函数来估计概率,从而衡量因变量(即要预测的标签)与一个或多个自变量(特征)之间的关系。这些概率必须二值化,才能真正地实现分类预测。

从图 2 中可以看到,Logistic 函数是一个 S 形的曲线,它可以将任意实数值映射为 0~1 之间的值。这个特性,对于解决二分类问题十分重要。我们使用阈值(比如说 0.5)将 0~1 之间的概率转换为两个不同的类,通常用“0”表示一类(比如说概率小于 0.5),用“1”表示另外一类(概率大于 0.5)。

需要注意的是,选择概率值 0.5 作为阈值,仅是一种一般性的做法。在实际应用时,针对不同情况可选择不同的阈值。比如说,如果对正例的查准率要求高,可以选择更大一些的阈值(比如 0.6)。如果对正例的查全率(即召回率)要求高,则可以选择小一些的阈值(比如 0.4)。

此外,分类的标识“0”或“1”,和概率值的边界“0”或“1”,其实是没有任何关系的。我们完全可以用“-1”和“1”表示两个类,只要它们有区分度即可。