这篇文章旨在梳理一下逻辑回归,因为其简单、实用、高效,在业界应用十分广泛。注意咯,这里的“逻辑”是音译“逻辑斯蒂(logistic)”的缩写,并不是说这个算法具有怎样的逻辑性。
前情提要:
机器学习算法中的监督式学习(Supervised Learning)可以根据返回值是否既定可以分为分类(classification)和回归(Regression):
分类模型:目标变量是分类变量(离散值);
回归模型:目标变量是连续性数值变量。
分析
逻辑回归虽名为“回归”但是解决的却是离散问题,也就是分类,例如预测肿瘤良性、电子邮件是否为欺诈邮件等。但是,“分类”是应用逻辑回归的目的和结果,但中间过程依旧是“回归”。
何出此言?因为通过逻辑回归模型。我们得到的计算结果是某件事情(不)发生的概率,值域为[0, 1]。然后,给这个概率加上了阈值,比如说0.5,则以上面的肿瘤为例,当肿瘤为良性的可能性大于等于0.5时,就可以将此肿瘤判别为良性肿瘤。
一、线性回归
1. 一般模型
考虑最简单的线性回归模型,也就是只有一个自变量。例如,广告投入金额 x 与 销售量 y 之间的联系,下面的散点图说明了x 与 y 之间的一元线性回归的关系。线性回归的相关概念:用人话讲明白线性回归LinearRegression
但是由于在实际问题中,因变量 y 是分类型,也就是只取 0、1 两个值,并非如上的对应关系(y可以取任意值)。
2.示例
假设我们有这样一组数据:给不同的用户投放不同金额的广告,记录他们购买广告商品的行为,1代表购买,0代表未购买,如下所示:
此时仍考虑线性回归模型,则会拟合出一条直线:
可以看出,没有只有极少数点落在了直线上,看起来各散点和直线并没有什么关系。但是我们可以在输出 y 的结果后可以加一个阈值限制,也即是取中值 0.5.当输出的 y > 0.5时,则就认为其是属于 1 这一分类,也就是会购买商品,反之则不会购买。$ y = \left{\begin{matrix} 1, f(x) >0.5\ 0,f(x) \le 0.5 \end{matrix}\right.$
因为解出的拟合方程为 $y = 0.34x$,那么就可以通过代入y的阈值0.5,反解出x的阈值1.47,从而将上面的分段函数等价为:$ y = \left{\begin{matrix} 1, x >1.47\ 0,x \le 1.47 \end{matrix}\right.$ ,这种形式和单位阶跃函数非常相似:$ y = \left{\begin{matrix} 1, z >0\ 0.5,z = 0\ 0, z<0 \end{matrix}\right.$ ,图像如下:
我们发现,把阶跃函数向右平移一下,就可以比较好地拟合上面的散点图呀!但是阶跃函数有个问题,它不是连续函数。非连续函数不便于拟合,所以理想的情况,是像线性回归的函数一样,X和Y之间的关系,是用一个单调可导的函数来描述的。下面我们就引入处理函数来解决:
二、sigmond函数
实际上,我们使用Logistic Regression算法时,常用的拟合函数是sigmoid函数,函数表达式为:$f(z) = \frac{1}{1+e^{-z}} $。图像如下:
sigmoid函数是一个s形曲线,就像是阶跃函数的温和版,阶跃函数在0和1之间是突然的起跳,而sigmoid有个平滑的过渡。
从图形上看,sigmoid曲线就像是被掰弯捋平后的线性回归直线,将取值范围(−∞,+∞)映射到(0,1) 之间,更适宜表示预测的概率,即事件发生的“可能性”
三、推广至多元回归
1. 多元线性回归方程
一般形式:$y=\theta{0}+\theta{1} x{1}+\theta{2} x{2}+\cdots+\theta{p} x_{p} $
可以简写为矩阵形式: $ \boldsymbol{Y}=\boldsymbol{X} \boldsymbol{\theta} $
迭代方式:求导,利用所有数据集来更新$\theta$
2. 多元Logistic Regression
一般形式,直接将sigmoid函数的自变量修改为多元线性回归的方程即可。
$f(\boldsymbol{X} \boldsymbol{\theta}) = \frac{1}{1+e^{- \boldsymbol{X} \boldsymbol{\theta}}} = P(Y = 1)$
因为Logistic Regression 的核心思想就是利用线性回归解出的值来进行分类。
到目前为止,逻辑函数的构造算是完成了。找到了合适的函数,下面就是求函数中的未知参数向量$\theta$了。求解之前,我们需要先理解一个概念——似然性
四、似然函数
我们常常用概率(Probability) 来描述一个事件发生的可能性。
而似然性(Likelihood) 正好反过来,意思是一个事件实际已经发生了,反推在什么参数条件下,这个事件发生的概率最大。
用数学公式来表达上述意思,就是:
已知参数 $\theta$ 前提下,预测某事件 x 发生的条件概率为 $P(x|\theta)$ ;
已知某个已发生的事件 x,未知参数 $\theta$ 的似然函数为$L(\theta|x)$;
上面两个值相等,即: $P(x|\theta)$ = $L(\theta|x)$。
一个参数 $\theta$ 对应一个似然函数的值,当$\theta$ 发生变化,$L(\theta|x)$也会随之变化。当我们在取得某个参数的时候,似然函数的值到达了最大值,说明在这个参数下最有可能发生x事件,即这个参数最合理。
因此,最优$\theta$,就是使当前观察到的数据出现的可能性最大的$\theta$。
五、最大似然估计
1. 基本公式
在二分类问题中,y只取0或1,可以组合起来表示y的概率:
$P(y) = P(y=1)^{y}*P(y=0)^{1-y}$
上面的式子,更严谨的写法需要加上特征x和参数$\theta$:
$P(y|(x,\theta)) = P(y=1|(x,\theta))^{y}*P(y=0|(x,\theta))^{1-y}$
前面说了,$\frac{1}{1+e^{- \boldsymbol{X} \boldsymbol{\theta}}} = P(Y = 1)$表示的就是P(y=1),代入上式:
$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}$
根据上一小节说的最优的定义,也就是最大化我们见到的样本数据的概率,即求下式的最大值。
$\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|\theta)$ = $L(\theta|x)$,对于某个观测值$y_i$,似然函数的值 $L(\theta|y_i)$就等于条件概率的值 $P(y_i|\theta)$ 。
另外我们知道,如果事件A与事件B相互独立,那么两者同时发生的概率为P(A)*P(B)。那么我们观测到的$y_1,y_2,y_3,\dots,yn$,他们同时发生的概率就是。$\prod{i=1}^{n} P\left(y{i} \mid x{i}, \theta\right)$
因为一系列的$x_i$和$y_i$都是我们实际观测到的数据(或者是我们收集到的数据集),式子中未知的只有$\theta$。因此,现在问题就变成了求$\theta$在取什么值的时候,L($\theta$)能达到最大值。
L($\theta$)是所有观测到的y发生概率的乘积,这种情况求最大值比较麻烦,一般我们会先取对数,将乘积转化成加法。
取对数后,转化成下式:
$\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=\sum{1}^{n}\left(y{i}-\hat{y}{i}\right)^{2}=\sum{1}^{n}\left(y{i}-x{i} \theta\right)^{2}$
这是个凸函数,有全局最优解。
2. 逻辑回归损失函数
如果逻辑回归也用平方损失,那么就是:
$Q=\sum{1}^{n}\left(y{i}-\frac{1}{1+e^{-x_{i} \theta}}\right)^{2}$
很遗憾,这个不是凸函数,不易优化,容易陷入局部最小值,所以逻辑函数用的是别的形式的函数作为损失函数,叫对数损失函数(log loss function)。
这个对数损失,就是上一小节的似然函数取对数后,再取相反数哟:
$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) = \frac{1}{1+e^{-z}} $,f'(x)等于多少?
如果你还记得导数表中这2个公式,那就好办了(不记得也没关系,这就给你列出来):
$\begin{array}{l} \left(\frac{1}{x}\right)^{\prime}=-\frac{1}{x^{2}} \ \left(e^{x}\right)^{\prime}=e^{x} \end{array}$
根据上两个公式,推导:
$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)=\frac{e^{-x}}{1+e^{-x}}$ ,而$ f^{\prime}(x) $ 正好可以拆分为$ \frac{e^{-x}}{1+e^{-x}} \cdot \frac{1}{1+e^{-x}} $, 也就是说:
$f^{\prime}(x)=f(x) \cdot(1-f(x))$
当然,现在我们的 x 是已知的,末知的是 $\theta$ ,所以后面是对 $\theta $求导,记:
$\frac{1}{1+e^{-x{i} \theta}}=f\left(x{i} \theta\right)$
2. 简化损失函数表示并对$\theta$求导
将$\frac{1}{1+e^{-x{i} \theta}}=f\left(x{i} \theta\right)$代入前面的损失函数得:
$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(\theta, x, y)$ 。不过这个 $ g(\theta, x, y) $ 里面也挺复杂的,我们再把里面的$f(x_i\theta)$ 挑出来,单独先看它对$\theta$向量中的某个$\theta_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 = \begin{bmatrix} y_1 \ y_2\ \dots\ ym \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}$
注意咯,这个$xi$实际上指的是第 i 个样本的特征向量,即 $\left(1, x{i 1}, \ldots, x{i p}\right) $ ,其中只有$x{ij}$会和$\theta_j$相乘,因此求导后整个$xi$只剩$x{ij}$了。
理解了前面说的,下面的化简就轻而易举:
$\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}$
加上求和号:
$\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. 梯度下降算法过程:
初始化β向量的值,即$\Theta_0$,将其代入G得到当前位置的梯度;
用步长α乘以当前梯度,得到从当前位置下降的距离;
更新$\Theta_1$ ,其更新表达式为$\Theta_1=\Theta_1-\alpha G$;
重复以上步骤,直到更新到某个$\Theta_k$,达到停止条件,这个 $\Theta_k$ 就是我们求解的参数向量。
本文转载自知乎用户化简可得 - 知乎 (zhihu.com)的文章用人话讲明白逻辑回归Logistic regression - 知乎 (zhihu.com)。