用人话讲明白逻辑回归Logistic regression

文章目录

  • 1.从线性回归说起
  • 2.sigmond函数
  • 3.推广至多元场景
  • 4.似然函数
  • 5.最大似然估计
  • 6.损失函数
  • 7.梯度下降法求解
  • 8.结尾


今天梳理一下逻辑回归,这个算法由于简单、实用、高效,在业界应用十分广泛。注意咯,这里的“逻辑”是音译“逻辑斯蒂(logistic)”的缩写,并不是说这个算法具有怎样的逻辑性。

前面说过,机器学习算法中的监督式学习可以分为2大类:

  • 分类模型:目标变量是分类变量(离散值);
  • 回归模型:目标变量是连续性数值变量。

逻辑回归通常用于解决分类问题,例如,业界经常用它来预测:客户是否会购买某个商品,借款人是否会违约等等。

实际上,“分类”是应用逻辑回归的目的和结果,但中间过程依旧是“回归”

为什么这么说?

因为通过逻辑回归模型,我们得到的计算结果是0-1之间的连续数字,可以把它称为“可能性”(概率)。对于上述问题,就是:客户购买某个商品的可能性,借款人违约的可能性。

然后,给这个可能性加一个阈值,就成了分类。例如,算出贷款违约的可能性>0.5,将借款人预判为坏客户。

1.从线性回归说起

考虑最简单的情况,即只有一个自变量的情况。比方说广告投入金额x和销售量y的关系,散点图如下,这种情况适用一元线性回归。
用人话讲明白逻辑回归Logistic regression_第1张图片
线性回归的介绍文章戳这里:用人话讲明白线性回归LinearRegression

但在许多实际问题中,因变量y是分类型,只取0、1两个值,和x的关系不是上面那样。假设我们有这样一组数据:给不同的用户投放不同金额的广告,记录他们购买广告商品的行为,1代表购买,0代表未购买。
用人话讲明白逻辑回归Logistic regression_第2张图片
假如此时依旧考虑线性回归模型,得到如下拟合曲线:
用人话讲明白逻辑回归Logistic regression_第3张图片

线性回归拟合的曲线,看起来和散点毫无关系,似乎没有意义。但我们可以在计算出 y ^ \hat{y} y^的结果后,加一个限制,即 y ^ > 0.5 \hat{y}>0.5 y^>0.5,就认为其属于1这一类,购买了商品,否则认为其不会购买,即:
y ^ = { 1 , f ( x ) > 0.5 0 , f ( x ) ≤ 0.5 \hat{y}=\left\{\begin{array}{l}1, f(x)>0.5 \\ 0, f(x) \leq 0.5\end{array}\right. y^={1,f(x)>0.50,f(x)0.5

由于拟合方程为 y ^ = 0.34 ∗ x \hat{y}=0.34*x y^=0.34x,那么上面的限制就等价于:
y ^ = { 1 , x > 1.47 0 , x ≤ 1.47 \hat{y}=\left\{\begin{array}{l}1, x>1.47 \\ 0, x \leq 1.47\end{array}\right. y^={1,x>1.470,x1.47

这种形式,非常像单位阶跃函数:
y = { 0 , z < 0 0.5 , z = 0 1 , z > 0 y=\left\{\begin{array}{l} 0, z<0 \\ 0.5, z=0 \\ 1, z>0 \end{array}\right. y=0,z<00.5,z=01,z>0

图像如下:
用人话讲明白逻辑回归Logistic regression_第4张图片
我们发现,把阶跃函数向右平移一下,就可以比较好地拟合上面的散点图呀!但是阶跃函数有个问题,它不是连续函数。

理想的情况,是像线性回归的函数一样,X和Y之间的关系,是用一个单调可导的函数来描述的

2.sigmond函数

实际上,逻辑回归算法的拟合函数,叫做sigmond函数:
f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1

函数图像如下(百度图片搜到的图):
用人话讲明白逻辑回归Logistic regression_第5张图片
sigmoid函数是一个s形曲线,就像是阶跃函数的温和版,阶跃函数在0和1之间是突然的起跳,而sigmoid有个平滑的过渡。

从图形上看,sigmoid曲线就像是被掰弯捋平后的线性回归直线,将取值范围(−∞,+∞)映射到(0,1) 之间,更适宜表示预测的概率,即事件发生的“可能性”


3.推广至多元场景

在用人话讲明白梯度下降Gradient Descent一文中,我们讲了多元线性回归方程的一般形式为:

y = β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β p x p y={\beta}_{0}+{\beta}_{1} {x}_{\mathbf{1} }+{\beta}_{2} {x}_{2 }+\cdots+{\beta}_{p}{x}_{p} y=β0+β1x1+β2x2++βpxp

可以简写为矩阵形式:
Y = X β \boldsymbol{Y}=\boldsymbol{X}\boldsymbol{\beta} Y=Xβ

其中, Y = [ y 1 y 2 ⋮ y n ] , X = [ 1 x 11 ⋯ x 1 p 1 x 21 ⋯ x 2 p ⋮ ⋮ ⋮ 1 x n 1 ⋯ x n p ] , β = [ β 0 β 1 ⋮ β p ] \boldsymbol{Y}=\left[\begin{array}{c}y_{1} \\ y_{2} \\ \vdots \\ y_{n}\end{array}\right], \boldsymbol{X}=\left[\begin{array}{cccc}1 & x_{11} & \cdots & x_{1 p} \\ 1 & x_{21} & \cdots & x_{2 p} \\ \vdots & \vdots & & \vdots \\ 1 & x_{n 1} & \cdots & x_{n p}\end{array}\right], \boldsymbol{\beta}=\left[\begin{array}{c}\beta_{0} \\ \beta_{1} \\ \vdots \\ \beta_{p}\end{array}\right] Y=y1y2yn,X=111x11x21xn1x1px2pxnp,β=β0β1βp

将特征加权求和Xβ(后面不对矩阵向量加粗了,大家应该都能理解)代入sigmond函数中的z,得到 1 1 + e − X β \frac{1}{1+e^{-X\beta}} 1+eXβ1,令其为预测为正例的概率P(Y=1),那么逻辑回归的形式就有了:
P ( Y = 1 ) = 1 1 + e − X β P(Y=1)=\frac{1}{1+e^{-X\beta}} P(Y=1)=1+eXβ1

到目前为止,逻辑函数的构造算是完成了。找到了合适的函数,下面就是求函数中的未知参数向量β了。求解之前,我们需要先理解一个概念——似然性


4.似然函数

我们常常用概率(Probability) 来描述一个事件发生的可能性。

似然性(Likelihood) 正好反过来,意思是一个事件实际已经发生了,反推在什么参数条件下,这个事件发生的概率最大。

用数学公式来表达上述意思,就是:

  • 已知参数 β 前提下,预测某事件 x 发生的条件概率为 P ( x ∣ β ) P(x | \beta) P(xβ);
  • 已知某个已发生的事件 x,未知参数 β 的似然函数为 L ( β ∣ x ) \mathcal{L}(\beta| x) L(βx)
  • 上面两个值相等,即: L ( β ∣ x ) = P ( x ∣ β ) \mathcal{L}(\beta| x)=P(x | \beta) L(βx)=P(xβ)

一个参数 β 对应一个似然函数的值,当 β 发生变化, L ( β ∣ x ) \mathcal{L}(\beta| x) L(βx)也会随之变化。当我们在取得某个参数的时候,似然函数的值到达了最大值,说明在这个参数下最有可能发生x事件,即这个参数最合理。

因此,最优β,就是使当前观察到的数据出现的可能性最大的β。


5.最大似然估计

在二分类问题中,y只取0或1,可以组合起来表示y的概率:
P ( y ) = P ( y = 1 ) y P ( y = 0 ) 1 − y P(y)=P(y=1)^{y}P(y=0)^{1-y} P(y)=P(y=1)yP(y=0)1y

我们可以把y=1代入上式验证下:

  • 左边是P(y=1);
  • 右边是 P ( y = 1 ) 1 P ( y = 0 ) 0 P(y=1)^1P(y=0)^0 P(y=1)1P(y=0)0,也为P(y=1)。

上面的式子,更严谨的写法需要加上特征x和参数β:
P ( y ∣ x , β ) = P ( y = 1 ∣ x , β ) y [ 1 − P ( y = 1 ∣ x , β ) ] 1 − y P(y|x,\beta)=P(y=1|x,\beta)^{y}[1-P(y=1|x,\beta)]^{1-y} P(yx,β)=P(y=1x,β)y[1P(y=1x,β)]1y
前面说了, 1 1 + e − x β \frac{1}{1+e^{-x{\beta}}} 1+exβ1表示的就是P(y=1),代入上式:

P ( y ∣ x , β ) = ( 1 1 + e − x β ) y ( 1 − 1 1 + e − x β ) 1 − y P(y|x,\beta)=\left(\frac{1}{1+e^{- x{\beta} }}\right)^{y}\left(1-\frac{1}{1+e^{-x{\beta}}}\right)^{1-y} P(yx,β)=(1+exβ1)y(11+exβ1)1y
根据上一小节说的最优β的定义,也就是最大化我们见到的样本数据的概率,即求下式的最大值:
L ( β ) = ∏ i = 1 n P ( y i ∣ x i , β ) = ∏ i = 1 n ( 1 1 + e − x i β ) y i ( 1 − 1 1 + e − x i β ) 1 − y i \mathcal{L}(\beta)=\prod_{i=1}^{n}P(y_{i}|x_{i},\beta)=\prod_{i=1}^{n}\left(\frac{1}{1+e^{ -{x}_{i}{\beta} }}\right)^{y_{i}}\left(1-\frac{1}{1+e^{-{x}_{i}{\beta}}}\right)^{1-y_i} L(β)=i=1nP(yixi,β)=i=1n(1+exiβ1)yi(11+exiβ1)1yi

这个式子怎么来的呢?

其实很简单。

前面我们说了, L ( β ∣ x ) = P ( x ∣ β ) \mathcal{L}(\beta| x)=P(x | \beta) L(βx)=P(xβ),对于某个观测值yi,似然函数的值 L ( β ∣ y i ) \mathcal{L}(\beta| y_{i}) L(βyi),就等于条件概率的值 P ( y i ∣ β ) P(y_{i} | \beta) P(yiβ)

另外我们知道,如果事件A与事件B相互独立,那么两者同时发生的概率为P(A)*P(B)。那么我们观测到的y1,y2……yn,他们同时发生的概率就是 ∏ i = 1 n P ( y i ∣ β ) \prod_{i=1}^{n}P(y_{i}|\beta) i=1nP(yiβ)

因为一系列的xi和yi都是我们实际观测到的数据,式子中未知的只有β。因此,现在问题就变成了求β在取什么值的时候,L(β)能达到最大值。

L(β)是所有观测到的y发生概率的乘积,这种情况求最大值比较麻烦,一般我们会先取对数,将乘积转化成加法。

取对数后,转化成下式:

l o g L ( β ) = ∑ i = 1 n ( [ y i ⋅ l o g ( 1 1 + e − x i β ) ] + [ ( 1 − y i ) ⋅ l o g ( 1 − 1 1 + e − x i β ) ] ) log\mathcal{L}(\beta)= \sum_{i=1}^{n}\left([y_{i}\cdot log(\frac{1}{1+e^{ -{x}_{i}{\beta}}})]+[(1-y_{i}) \cdot log(1-\frac{1}{1+e^{-{x}_{i}{\beta}}})]\right) logL(β)=i=1n([yilog(1+exiβ1)]+[(1yi)log(11+exiβ1)])

接下来想办法求上式的最大值就可以了,求解前,我们要提一下逻辑回归的损失函数。


6.损失函数

在机器学习领域,总是避免不了谈论损失函数这一概念。损失函数是用于衡量预测值与实际值的偏离程度,即模型预测的错误程度。也就是说,这个值越小,认为模型效果越好,举个极端例子,如果预测完全精确,则损失函数值为0。

在线性回归一文中,我们用到的损失函数是残差平方和SSE:
Q = ∑ 1 n ( y i − y ^ i ) 2 = ∑ 1 n ( y i − x i β ) 2 Q=\sum_{1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}=\sum_{1}^{n}\left(y_{i}-{x}_{i}{\beta}\right)^{2} Q=1n(yiy^i)2=1n(yixiβ)2

这是个凸函数,有全局最优解。

如果逻辑回归也用平方损失,那么就是:
Q = ∑ 1 n ( y i − 1 1 + e − x i β ) 2 Q=\sum_{1}^{n}\left(y_{i}-\frac{1}{1+e^{ -{x}_{i}{\beta}}}\right)^{2} Q=1n(yi1+exiβ1)2

很遗憾,这个不是凸函数,不易优化,容易陷入局部最小值,所以逻辑函数用的是别的形式的函数作为损失函数,叫对数损失函数(log loss function)。

这个对数损失,就是上一小节的似然函数取对数后,再取相反数哟:

J ( β ) = − l o g L ( β ) = − ∑ i = 1 n [ y i l o g P ( y i ) + ( 1 − y i ) l o g ( 1 − P ( y i ) ) ] J(\beta) =-log\mathcal{L}(\beta)=- \sum_{i=1}^{n}\left[y_ilogP(y_i)+(1-y_i)log(1-P(y_i))\right] J(β)=logL(β)=i=1n[yilogP(yi)+(1yi)log(1P(yi))]

这个对数损失函数好理解吗?我还是举个具体例子吧。

用文章开头那个例子,假设我们有一组样本,建立了一个逻辑回归模型P(y=1)=f(x),其中一个样本A是这样的:

公司花了x=1000元做广告定向投放,某个用户看到广告后购买了,此时实际的y=1,f(x=1000)算出来是0.6,这里有-0.4的偏差,是吗?在逻辑回归中不是用差值计算偏差哦,用的是对数损失,所以它的偏差定义为log0.6(其实也很好理解为什么取对数,因为我们算的是P(y=1),如果算出来的预测值正好等于1,那么log1=0,偏差为0)。

样本B:x=500,y=0,f(x=500)=0.3,偏差为log(1-0.3)=log0.7。

根据log函数的特性,自变量取值在[0,1]间,log出来是负值,而损失一般用正值表示,所以要取个相反数。因此计算A和B的总损失,就是:-log0.6-log0.7。

之前我们在用人话讲明白梯度下降中解释过梯度下降算法,下面我们就用梯度下降法求损失函数的最小值(也可以用梯度上升算法求似然函数的最大值,这两是等价的)。


7.梯度下降法求解

要开始头疼的公式推导部分了,不要害怕哦,我们还是从最简单的地方开始,非常容易看懂。

首先看,对于sigmoid函数 f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1 f ′ ( x ) f'(x) f(x)等于多少?

如果你还记得导数表中这2个公式,那就好办了(不记得也没关系,这就给你列出来):
( 1 x ) ′ = − 1 x 2 (\frac{1}{x})^{\prime}=-\frac{1}{x^{2}} (x1)=x21

( e x ) ′ = e x (e^{x})^{\prime}=e^{x} (ex)=ex

根据上两个公式,推导:
f ′ ( x ) = ( 1 1 + e − x ) ′ = − ( e − x ) ′ ( 1 + e − x ) 2 = e − x ( 1 + e − x ) 2 f'(x)=(\frac{1}{1+e^{-x}})'=-\frac{(e^{-x})'}{(1+e^{-x})^{2}}=\frac{e^{-x}}{(1+e^{-x})^{2}} f(x)=(1+ex1)=(1+ex)2(ex)=(1+ex)2ex

到这还不算完哦,我们发现 1 − f ( x ) = e − x 1 + e − x 1-f(x)=\frac{e^{-x}}{1+e^{-x}} 1f(x)=1+exex,而f’(x)正好可以拆分为 e − x 1 + e − x ⋅ 1 1 + e − x \frac{e^{-x}}{1+e^{-x}}\cdot\frac{1}{1+e^{-x}} 1+exex1+ex1,也就是说:
f ′ ( x ) = f ( x ) ⋅ ( 1 − f ( x ) ) f'(x)=f(x)\cdot(1-f(x)) f(x)=f(x)(1f(x))

当然,现在我们的x是已知的,未知的是β,所以后面是对β求导,记:
1 1 + e − x i β = f ( x i β ) \frac{1}{1+e^{-x_i\beta}}=f(x_i\beta) 1+exiβ1=f(xiβ)

把它代入前面我们得到逻辑回归的损失函数:
J ( β ) = − ∑ i = 1 n [ y i l o g ( f ( x i β ) ) + ( 1 − y i ) l o g ( 1 − f ( x i β ) ) ] = − ∑ i = 1 n g ( β i , x i , y i ) J(\beta) =- \sum_{i=1}^{n}\left[y_ilog(f(x_i\beta))+(1-y_i)log(1-f(x_i\beta))\right]=- \sum_{i=1}^{n}g(\beta_i,x_i,y_i) J(β)=i=1n[yilog(f(xiβ))+(1yi)log(1f(xiβ))]=i=1ng(βi,xi,yi)

简便起见,先撇开求和号看g(β,x,y)。不过这个g(β,x,y)里面也挺复杂的,我们再把里面的 f ( x i β ) f(x_i\beta) f(xiβ)挑出来,单独先看它对β向量中的某个βj求偏导是什么样。

根据上面的求导公式,有:
∂ f ( x i β ) ∂ β j = f ( x i β ) ⋅ ( 1 − f ( x i β ) ) ⋅ x i j \frac{\partial f(x_i\beta) }{\partial \beta_{j}} = f(x_i\beta)\cdot(1-f(x_i\beta))\cdot x_{ij} βjf(xiβ)=f(xiβ)(1f(xiβ))xij

注意咯,这个xi实际上指的是第i个样本的特征向量,即 ( 1 , x i 1 , . . . , x i p ) (1, x_{i1}, ...,x_{ip}) (1,xi1,...,xip),其中只有xij会和βj相乘,因此求导后整个xi只剩xij了。

理解了前面说的,下面的化简就轻而易举:
∂ g ( β i , x i , y i ) ∂ β j = y i 1 f ( x i β ) ∂ f ( x i β ) ∂ β j − ( 1 − y i ) 1 1 − f ( x i β ) ∂ f ( x i β ) ∂ β j = ( y i f ( x i β ) − 1 − y i 1 − f ( x i β ) ) ⋅ ∂ f ( x i β ) ∂ β j = ( y i f ( x i β ) − 1 − y i 1 − f ( x i β ) ) ⋅ f ( x i β ) ⋅ ( 1 − f ( x i β ) ) ⋅ x i j = [ y i ( 1 − f ( x i β ) ) − ( 1 − y i ) f ( x i β ) ] ⋅ x i j = ( y i − f ( x i β ) ) ⋅ x i j \begin{aligned} \frac{\partial g(\beta_i,x_i,y_i)}{\partial \beta_{j}} &=y_i \frac{1}{f(x_i\beta)} \frac{\partial f(x_i\beta)}{\partial \beta_{j}}-\left(1-y_i\right) \frac{1}{1-f(x_i\beta)} \frac{\partial f(x_i\beta)}{\partial \beta_{j}}\\ &= \left( \frac{y_i}{f(x_i\beta)}-\frac{1-y_i}{1-f(x_i\beta)}\right) \cdot \frac{\partial f(x_i\beta)}{\partial \beta_{j}} \\ &= \left( \frac{y_i}{f(x_i\beta)}-\frac{1-y_i}{1-f(x_i\beta)}\right) \cdot f(x_i\beta)\cdot(1-f(x_i\beta))\cdot x_{ij}\\ &=\left[y_i(1-f(x_i\beta))-(1-y_i) f(x_i\beta)\right]\cdot x_{ij}\\ &= \left(y_i-f(x_i\beta)\right) \cdot x_{ij} \end{aligned} βjg(βi,xi,yi)=yif(xiβ)1βjf(xiβ)(1yi)1f(xiβ)1βjf(xiβ)=(f(xiβ)yi1f(xiβ)1yi)βjf(xiβ)=(f(xiβ)yi1f(xiβ)1yi)f(xiβ)(1f(xiβ))xij=[yi(1f(xiβ))(1yi)f(xiβ)]xij=(yif(xiβ))xij

加上求和号:
∂ J ( β ) ∂ β j = − ∑ i = 1 n ( y i − f ( x i β ) ) ⋅ x i j = ∑ i = 1 n ( 1 1 + e − x i β − y i ) ⋅ x i j \frac{\partial J(\beta)}{\partial \beta_{j}} = - \sum_{i=1}^{n} \left(y_i-f(x_i\beta)\right) \cdot x_{ij} = \sum_{i=1}^{n} \left(\frac{1}{1+e^{-x_i\beta}}-y_i\right) \cdot x_{ij} βjJ(β)=i=1n(yif(xiβ))xij=i=1n(1+exiβ1yi)xij

有了偏导,也就有了梯度G,即偏导函数组成的向量。

梯度下降算法过程:

  1. 初始化 β \beta β向量的值,即 Θ 0 \Theta_{0} Θ0,将其代入G得到当前位置的梯度;
  2. 用步长 α \alpha α乘以当前梯度,得到从当前位置下降的距离;
  3. 更新 Θ 1 \Theta_1 Θ1,其更新表达式为 Θ 1 = Θ 0 − α G \Theta_1=\Theta_0-\alpha G Θ1=Θ0αG
  4. 重复以上步骤,直到更新到某个 Θ k \Theta_k Θk,达到停止条件,这个 Θ k \Theta_k Θk就是我们求解的参数向量。

8.结尾

文章写到这里就结束了,其实逻辑回归还有很多值得深入学习和讨论的,但是“讲人话”系列的定位就是个入门,本人水平也有限,所以本篇不再往后写了。

主要一篇文章写起来蛮累……其他都还好,就是打公式挺麻烦,还挺费时间>.<

最后,欢迎各位一起学习讨论啊~


你可能感兴趣的:(机器学习,机器学习,逻辑回归,logistic,regression,算法)