ML - Logistic Regression Research

1,914 阅读9分钟

Logistic Regression Research

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

  • 前情提要:

​ 机器学习算法中的监督式学习(Supervised Learning)可以根据返回值是否既定可以分为分类(classification)和回归(Regression):

  1. 分类模型:目标变量是分类变量(离散值);

  2. 回归模型:目标变量是连续性数值变量。

  • 分析

​ 逻辑回归虽名为“回归”但是解决的却是离散问题,也就是分类,例如预测肿瘤良性、电子邮件是否为欺诈邮件等。但是,“分类”是应用逻辑回归的目的和结果,但中间过程依旧是“回归”

​ 何出此言?因为通过逻辑回归模型。我们得到的计算结果是某件事情(不)发生的概率,值域为[0, 1]。然后,给这个概率加上了阈值,比如说0.5,则以上面的肿瘤为例,当肿瘤为良性的可能性大于等于0.5时,就可以将此肿瘤判别为良性肿瘤。

一、线性回归

1. 一般模型

考虑最简单的线性回归模型,也就是只有一个自变量。例如,广告投入金额 x 与 销售量 y 之间的联系,下面的散点图说明了x 与 y 之间的一元线性回归的关系。线性回归的相关概念:用人话讲明白线性回归LinearRegression

v2-e277ce00fed265369f403381ccd34766_720w.jpg 但是由于在实际问题中,因变量 y 是分类型,也就是只取 0、1 两个值,并非如上的对应关系(y可以取任意值)。

2.示例

假设我们有这样一组数据:给不同的用户投放不同金额的广告,记录他们购买广告商品的行为,1代表购买,0代表未购买,如下所示:

v2-17549f0c5282036306c84107ffa8cff9_720w.jpg

此时仍考虑线性回归模型,则会拟合出一条直线:

v2-455ebb504864589ac07e24d75e60e7fa_720w.jpg

可以看出,没有只有极少数点落在了直线上,看起来各散点和直线并没有什么关系。但是我们可以在输出 y 的结果后可以加一个阈值限制,也即是取中值 0.5.当输出的 y > 0.5时,则就认为其是属于 1 这一分类,也就是会购买商品,反之则不会购买。y={1,f(x)>0.50,f(x)0.5 y = \left\{\begin{matrix} 1, f(x) >0.5\\ 0,f(x) \le 0.5 \end{matrix}\right.

因为解出的拟合方程为 y=0.34xy = 0.34x,那么就可以通过代入y的阈值0.5,反解出x的阈值1.47,从而将上面的分段函数等价为:y={1,x>1.470,x1.47 y = \left\{\begin{matrix} 1, x >1.47\\ 0,x \le 1.47 \end{matrix}\right. ,这种形式和单位阶跃函数非常相似:y={1,z>00.5,z=00,z<0 y = \left\{\begin{matrix} 1, z >0\\ 0.5,z = 0\\ 0, z<0 \end{matrix}\right. ,图像如下:

v2-6e12db828d4dabc51af0e3a86f25b7e7_720w.jpg

我们发现,把阶跃函数向右平移一下,就可以比较好地拟合上面的散点图呀!但是阶跃函数有个问题,它不是连续函数。非连续函数不便于拟合,所以理想的情况,是像线性回归的函数一样,X和Y之间的关系,是用一个单调可导的函数来描述的。下面我们就引入处理函数来解决:

二、sigmond函数

实际上,我们使用Logistic Regression算法时,常用的拟合函数是sigmoid函数,函数表达式为:f(z)=11+ezf(z) = \frac{1}{1+e^{-z}} 。图像如下:

v2-c3c88e714d7327e527bb5a2e62639521_720w.jpg sigmoid函数是一个s形曲线,就像是阶跃函数的温和版,阶跃函数在0和1之间是突然的起跳,而sigmoid有个平滑的过渡。

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

三、推广至多元回归

1. 多元线性回归方程

  1. 一般形式:y=θ0+θ1x1+θ2x2++θpxpy=\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\cdots+\theta_{p} x_{p}

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

  2. 迭代方式:求导,利用所有数据集来更新θ\theta

2. 多元Logistic Regression

  1. 一般形式,直接将sigmoid函数的自变量修改为多元线性回归的方程即可。

    f(Xθ)=11+eXθ=P(Y=1)f(\boldsymbol{X} \boldsymbol{\theta}) = \frac{1}{1+e^{- \boldsymbol{X} \boldsymbol{\theta}}} = P(Y = 1)

    因为Logistic Regression 的核心思想就是利用线性回归解出的值来进行分类。

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

四、似然函数

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

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

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

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

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

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

五、最大似然估计

1. 基本公式

在二分类问题中,y只取0或1,可以组合起来表示y的概率:

P(y)=P(y=1)yP(y=0)1yP(y) = P(y=1)^{y}*P(y=0)^{1-y}

上面的式子,更严谨的写法需要加上特征x和参数θ\theta

P(y(x,θ))=P(y=1(x,θ))yP(y=0(x,θ))1yP(y|(x,\theta)) = P(y=1|(x,\theta))^{y}*P(y=0|(x,\theta))^{1-y}

前面说了,11+eXθ=P(Y=1)\frac{1}{1+e^{- \boldsymbol{X} \boldsymbol{\theta}}} = P(Y = 1)表示的就是P(y=1),代入上式:

P(yx,θ)=(11+exθ)y(111+exθ)1yP(y \mid x, \theta)=\left(\frac{1}{1+e^{-x \theta}}\right)^{y}\left(1-\frac{1}{1+e^{-x \theta}}\right)^{1-y}

根据上一小节说的最优的定义,也就是最大化我们见到的样本数据的概率,即求下式的最大值。

L(θ)=i=1nP(yixi,θ)=i=1n(11+exiθ)yi(111+exiθ)1yi\mathcal{L}(\theta)=\prod_{i=1}^{n} P\left(y_{i} \mid x_{i}, \theta\right)=\prod_{i=1}^{n}\left(\frac{1}{1+e^{-x i \theta}}\right)^{y i}\left(1-\frac{1}{1+e^{-x_{i} \theta}}\right)^{1-y_{i}}

这个式子怎么来的呢?其实很简单。

2. 推导过程

前面我们说了, P(xθ)P(x|\theta) = L(θx)L(\theta|x),对于某个观测值yiy_i,似然函数的值 L(θyi)L(\theta|y_i)就等于条件概率的值 P(yiθ)P(y_i|\theta)

另外我们知道,如果事件A与事件B相互独立,那么两者同时发生的概率为P(A)*P(B)。那么我们观测到的y1,y2,y3,,yny_1,y_2,y_3,\dots,y_n,他们同时发生的概率就是。i=1nP(yixi,θ)\prod_{i=1}^{n} P\left(y_{i} \mid x_{i}, \theta\right)

因为一系列的xix_iyiy_i都是我们实际观测到的数据(或者是我们收集到的数据集),式子中未知的只有θ\theta。因此,现在问题就变成了θ\theta在取什么值的时候,L(θ\theta)能达到最大值。

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

取对数后,转化成下式:

logL(θ)=i=1n([yilog(11+exiθ)]+[(1yi)log(111+exiθ)])\log \mathcal{L}(\theta)=\sum_{i=1}^{n}\left(\left[y_{i} \cdot \log \left(\frac{1}{1+e^{-x_{i} \theta}}\right)\right]+\left[\left(1-y_{i}\right) \cdot \log \left(1-\frac{1}{1+e^{-x_{i} \theta}}\right)\right]\right)

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

六、损失函数

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

1. 线性回归损失函数

在线性回归一文中,我们用到的损失函数是残差平方和SSE:

Q=1n(yiy^i)2=1n(yixiθ)2Q=\sum_{1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}=\sum_{1}^{n}\left(y_{i}-x_{i} \theta\right)^{2}

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

2. 逻辑回归损失函数

如果逻辑回归也用平方损失,那么就是:

Q=1n(yi11+exiθ)2Q=\sum_{1}^{n}\left(y_{i}-\frac{1}{1+e^{-x_{i} \theta}}\right)^{2}

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

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

J(θ)=logL(θ)=i=1n[yilogP(yi)+(1yi)log(1P(yi))]J(\theta)=-\log \mathcal{L}(\theta)=-\sum_{i=1}^{n}\left[y_{i} \log P\left(y_{i}\right)+\left(1-y_{i}\right) \log \left(1-P\left(y_{i}\right)\right)\right]

3. 示例

用文章开头那个例子,假设我们有一组样本,建立了一个逻辑回归模型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。

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

七、梯度下降法求解

1. 逻辑回归假设函数对x求导

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

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

如果你还记得导数表中这2个公式,那就好办了(不记得也没关系,这就给你列出来):

(1x)=1x2(ex)=ex\begin{array}{l} \left(\frac{1}{x}\right)^{\prime}=-\frac{1}{x^{2}} \\ \left(e^{x}\right)^{\prime}=e^{x} \end{array}

根据上两个公式,推导:

f(x)=(11+ex)=(ex)(1+ex)2=ex(1+ex)2f^{\prime}(x)=\left(\frac{1}{1+e^{-x}}\right)^{\prime}=-\frac{\left(e^{-x}\right)^{\prime}}{\left(1+e^{-x}\right)^{2}}=\frac{e^{-x}}{\left(1+e^{-x}\right)^{2}}

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

f(x)=f(x)(1f(x))f^{\prime}(x)=f(x) \cdot(1-f(x))

当然,现在我们的 x 是已知的,末知的是 θ\theta ,所以后面是对 θ\theta 求导,记:

11+exiθ=f(xiθ)\frac{1}{1+e^{-x_{i} \theta}}=f\left(x_{i} \theta\right)

2. 简化损失函数表示并对θ\theta求导

11+exiθ=f(xiθ)\frac{1}{1+e^{-x_{i} \theta}}=f\left(x_{i} \theta\right)代入前面的损失函数得:

J(θ)=i=1n[yilog(f(xiθ))+(1yi)log(1f(xiθ))]=i=1ng(θi,xi,yi)J(\theta)=-\sum_{i=1}^{n}\left[y_{i} \log \left(f\left(x_{i} \theta\right)\right)+\left(1-y_{i}\right) \log \left(1-f\left(x_{i} \theta\right)\right)\right]=-\sum_{i=1}^{n} g\left(\theta_{i}, x_{i}, y_{i}\right)

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

根据上面的求导公式,有:

f(xiθ)θj=f(xiθ)(1f(xiθ))xij\frac{\partial f\left(x_{i} \theta\right)}{\partial \theta_{j}}=f\left(x_{i} \theta\right) \cdot\left(1-f\left(x_{i} \theta\right)\right) \cdot x_{i j}

Y=[y1y2ym],X=[1x11x1n1x21x2n1xm1xmn],θ=[θ0θ1θn]Y = \begin{bmatrix} y_1 \\ y_2\\ \dots\\ y_m \end{bmatrix},X = \begin{bmatrix} 1 & x_{11} & \dots &x_{1n} \\ 1 & x_{21} & \dots &x_{2n} \\ \dots &\dots & &\dots \\ 1 & x_{m1} & \dots &x_{mn} \end{bmatrix},\theta = \begin{bmatrix} \theta_0 \\ \theta_1\\ \dots\\ \theta_n \end{bmatrix}

注意咯,这个xix_i实际上指的是第 i 个样本的特征向量,即 (1,xi1,,xip)\left(1, x_{i 1}, \ldots, x_{i p}\right) ,其中只有xijx_{ij}会和θj\theta_j相乘,因此求导后整个xix_i只剩xijx_{ij}了。

理解了前面说的,下面的化简就轻而易举:

g(θi,xi,yi)θj=yi1f(xiθ)f(xiθ)θj(1yi)11f(xiθ)f(xiθ)θj=(yif(xiθ)1yi1f(xiθ))f(xiθ)θj=(yif(xiθ)1yi1f(xiθ))f(xiθ)(1f(xiθ))xij=[yi(1f(xiθ))(1yi)f(xiθ)]xij=(yif(xiθ))xij\begin{aligned} \frac{\partial g\left(\theta_{i}, x_{i}, y_{i}\right)}{\partial \theta_{j}} &=y_{i} \frac{1}{f\left(x_{i} \theta\right)} \frac{\partial f\left(x_{i} \theta\right)}{\partial \theta_{j}}-\left(1-y_{i}\right) \frac{1}{1-f\left(x_{i} \theta\right)} \frac{\partial f\left(x_{i} \theta\right)}{\partial \theta_{j}} \\ &=\left(\frac{y_{i}}{f\left(x_{i} \theta\right)}-\frac{1-y_{i}}{1-f\left(x_{i} \theta\right)}\right) \cdot \frac{\partial f\left(x_{i} \theta\right)}{\partial \theta_{j}} \\ &=\left(\frac{y_{i}}{f\left(x_{i} \theta\right)}-\frac{1-y_{i}}{1-f\left(x_{i} \theta\right)}\right) \cdot f\left(x_{i} \theta\right) \cdot\left(1-f\left(x_{i} \theta\right)\right) \cdot x_{i j} \\ &=\left[y_{i}\left(1-f\left(x_{i} \theta\right)\right)-\left(1-y_{i}\right) f\left(x_{i} \theta\right)\right] \cdot x_{i j} \\ &=\left(y_{i}-f\left(x_{i} \theta\right)\right) \cdot x_{i j} \end{aligned}

加上求和号:

J(θ)θj=i=1n(yif(xiθ))xij=i=1n(11+exiθyi)xij\frac{\partial J(\theta)}{\partial \theta_{j}}=-\sum_{i=1}^{n}\left(y_{i}-f\left(x_{i} \theta\right)\right) \cdot x_{i j}=\sum_{i=1}^{n}\left(\frac{1}{1+e^{-x_{i} \theta}}-y_{i}\right) \cdot x_{i j}

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

3. 梯度下降算法过程:

  1. 初始化β向量的值,即Θ0\Theta_0,将其代入G得到当前位置的梯度;

  2. 用步长α乘以当前梯度,得到从当前位置下降的距离;

  3. 更新Θ1\Theta_1 ,其更新表达式为Θ1=Θ1αG\Theta_1=\Theta_1-\alpha G

  4. 重复以上步骤,直到更新到某个Θk\Theta_k,达到停止条件,这个 Θk\Theta_k 就是我们求解的参数向量。

本文转载自知乎用户化简可得 - 知乎 (zhihu.com)的文章用人话讲明白逻辑回归Logistic regression - 知乎 (zhihu.com)