ML - Logistic Regression Research

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.5 0 , f ( x ) 0.5 y = \left\{\begin{matrix} 1, f(x) >0.5\\ 0,f(x) \le 0.5 \end{matrix}\right.

因为解出的拟合方程为 y = 0.34 x y = 0.34x ,那么就可以通过代入y的阈值0.5,反解出x的阈值1.47,从而将上面的分段函数等价为: y = { 1 , x > 1.47 0 , x 1.47 y = \left\{\begin{matrix} 1, x >1.47\\ 0,x \le 1.47 \end{matrix}\right. ,这种形式和单位阶跃函数非常相似: y = { 1 , z > 0 0.5 , z = 0 0 , 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 ) = 1 1 + e z f(z) = \frac{1}{1+e^{-z}} 。图像如下:

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

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

三、推广至多元回归

1. 多元线性回归方程

  1. 一般形式: y = θ 0 + θ 1 x 1 + θ 2 x 2 + + θ p x p y=\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 θ ) = 1 1 + e X θ = 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 ) y P ( y = 0 ) 1 y P(y) = P(y=1)^{y}*P(y=0)^{1-y}

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

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

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

P ( y x , θ ) = ( 1 1 + e x θ ) y ( 1 1 1 + e x θ ) 1 y P(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 = 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}(\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) ,对于某个观测值 y i y_i ,似然函数的值 L ( θ y i ) L(\theta|y_i) 就等于条件概率的值 P ( y i θ ) P(y_i|\theta)

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

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

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

取对数后,转化成下式:

log L ( θ ) = i = 1 n ( [ y i log ( 1 1 + e x i θ ) ] + [ ( 1 y i ) log ( 1 1 1 + e x i θ ) ] ) \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 = 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} \theta\right)^{2}

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

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} \theta}}\right)^{2}

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

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

J ( θ ) = log L ( θ ) = i = 1 n [ y i log P ( y i ) + ( 1 y i ) log ( 1 P ( y i ) ) ] 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 ) = 1 1 + e z f(z) = \frac{1}{1+e^{-z}} ,f'(x)等于多少?

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

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

根据上两个公式,推导:

f ( x ) = ( 1 1 + e x ) = ( e x ) ( 1 + e x ) 2 = e x ( 1 + e x ) 2 f^{\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}}

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

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

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

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

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

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

J ( θ ) = i = 1 n [ y i log ( f ( x i θ ) ) + ( 1 y i ) log ( 1 f ( x i θ ) ) ] = i = 1 n g ( θ i , x i , y i ) 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 ( x i θ ) f(x_i\theta) 挑出来,单独先看它对 θ \theta 向量中的某个 θ j \theta_j 求偏导是什么样。

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

f ( x i θ ) θ j = f ( x i θ ) ( 1 f ( x i θ ) ) x i j \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 = [ y 1 y 2 y m ] , X = [ 1 x 11 x 1 n 1 x 21 x 2 n 1 x m 1 x m n ] , θ = [ θ 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}

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

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

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\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 = 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(\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)

猜你喜欢

转载自juejin.im/post/7094106326296428580