阿南带你理解逻辑回归

刚买了个罗技鼠标,就来写个逻辑回归吧!

Posted by Nam on February 21, 2020

前言

逻辑回归,刚开始学习的时候感觉觉得这是一个非常简单模型。同时我也产生了疑惑,为什么这么简单的线性模型会广泛应用于工业中(如银行业的防欺诈、推荐算法等)和频繁出现在面试中。秉承着 “书读百遍,其意自现” 的观点,现在想把自己关于逻辑回归的一些理解写出来,希望能帮助到大家。

逻辑回归 (Logistic Regression)

大家可不要被逻辑回归的名字给欺骗了!尽管名字里写着“回归”二字,但是实际上这是一个 分类模型

重要的事情说三遍,这是一个 分类模型分类模型分类模型

逻辑回归算法的优点是直接针对分类的概率进行建模,因此不需要去假设数据的分布。这样就避免了假设分布不准确所带来的其它麻烦。最重要的一点就是,逻辑回归的输出是一个 $[0,1]$ 之间的概率值,相比于其它模型来说逻辑回归拥有非常好的 可解释性

假设我们拥有如下数据集:$T={(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}$,其中,$x_i\in \chi=R^n, y_i\in \gamma ={+1,0}$。其中$x_i$是数据集中第$i$个样本或称为实例,$y_i$为$x_i$的类标记。我们应该如何应用逻辑回归对其进行分类呢?

一种很自然的想法就是,我们希望知道实例 $x_i$ 属于某个类别 $Y$ 的概率,随后判定实例属于概率最大的那个类别。

因此我们对概率建模,假设实例 $x_i$ 属于类别 $1$ 的概率为 $\pi$,即 $P(Y=1\mid x_i)=\pi$。

利用 $Sigmoid$ 函数连续可导,单调递增,值域为 $(0,1)$ 等众多优良性质,我们通过 $Sigmoid$ 函数建立一个自变量 $x_i$ 和因变量 $Y$ 之间的映射关系。即:

\[P(Y=1|x_i) = \frac{1}{1+e^{-(w^Tx_i)}} = \pi \tag{1}\]

其中 $w$ 是我们需要计算的参数,为了书写方便,此处将偏置 $b$ 写进 $w$ 中。故 $w$ 的维度为 $(n+1)$,同时将实例 $x_i$ 的维度加一并置 $1$,即 $x_i\in R^{n+1}, (1,x_i^1,x_i^2,…,x_i^n)$

下图为 $Sigmoid$ 函数:

Sigmoid

由于是二分类问题,因此实例 $x_i$ 属于另一类别 $0$ 的概率为 $1-\pi$,即:

\[P(Y=0\mid x_i) = \frac{e^{-(w^Tx_i)}}{1+e^{-(w^Tx_i)}} =1-\pi \tag{2}\]

以此为基础,我们再给出 发生比 (Odds) 的定义:

\[\frac{P(Y=1|x_i)}{1-P(Y=1|x_i)} = \frac{\pi}{1-\pi} \tag{3}\]

发生比: 一件事发生的概率与其不发生的概率之比,取值范围为 $[0,\infty)$。其值若接近 $0$ 表示发生的概率非常低,几乎不可能发生,反之越接近 $\infty$ 则表示发生的概率非常大。

因此在这里我们可以将实例 $x_i$ 属于类别 $1$ 表示为发生,类别 $0$ 为不发生,这些只是解释上的变化,不影响问题的本质。

通过整理式 $(1),(2),(3)$ 可得:

\[\frac{P(Y=1|x_i)}{1-P(Y=1|x_i)} = \frac{\pi}{1-\pi} = e^{w^Tx_i} \tag{4}\]

对上式 $(4)$ 两边同时取对数,可得:

\[\ln (\frac{P(Y=1|x_i)}{1-P(Y=1|x_i)}) =w^Tx_i \tag{5}\]

这里称式 $(5)$ 左边部分为 对数发生比 (log-odds)分对数 (logit)。因此,逻辑回归模型 $(1)$ 可以视作分对数变换下关于 $X$ 的一个 线性模型

或者给出一个更直观的推导解释:决策超平面是由样本属于两个类别的概率相同的点所连成的等高线,即在决策超平面上的点属于每个类别的概率都相等:

\[\begin{aligned} P(Y=1| \boldsymbol{x},\theta) & = P(Y=0| \boldsymbol{x},\theta) \\ \frac{1}{1+e^{-(w^T \boldsymbol{x})}} & = \frac{e^{-(w^T \boldsymbol{x})}}{1+e^{-(w^T \boldsymbol{x})}} \\ 1 & = e^{-(w^T \boldsymbol{x})} \\ w^T \boldsymbol{x} & = 0 \end{aligned} \tag{6}\]

通过式 $(6)$ 可以看出,逻辑回归的决策超平面是一个线性函数,即参数与变量之间是线性相关的。


模型参数的估计

逻辑回归模型 $(1)$ 中的参数 $w$ 是未知的,我们需要通过训练集对这些参数进行估计。由于 极大似然方法 (Maximum Likelihood Estimate, MLE) 具有极好的统计性质,所以我们通常采用极大似然方法估计系数。

极大似然法你和逻辑回归的基本思想:寻找 $w$ 的一个估计,使得式 $(1)$ 所得到的每个实例属于类别 $1$ 的概率尽可能的与实际情况相吻合。 换句话说就是我们把 $w$ 带入到 $(1)$ 式中,能够使得实际属于类别 $1$ 的实例所计算出来的概率是 $1$, 而类别 $0$ 的实例的概率为 $0$。

上述思想的似然函数方程形式如下:

\[\ell(w) = \prod_{i:y_i=1}P(Y=1|x_i)\prod_{j:y_j=0} (1-P(Y=1|x_j)) \tag{7}\]

如果我们拥有良好的关于 $w$ 估计,那么带入上式 $(6)$ 之后应使得似然函数值最大。

将式 $(6)$ 结合式 $(1)(2)$,可以将其改写成如下直观的形式:

\[\prod_{i=1}^{N}\pi^{y_i}[1-\pi]^{1-y_i} \tag{8}\]

简单地解释一下式 $(7)$,当 $x_i$ 属于 $1$ 类时,只保留左半部分 $\pi^{y_i}$ 而右半部分因为指数 $1-y_i=0$ 的关系的关系导致右半部分值为 $1$。同理,当实例 $x_i$ 属于 $0$ 类时,只保留右半部分,而左半部分因为指数为 $0$ 的关系导致左半部分值为 $1$。

为了运算方便,首先对似然函数 $(7)$ 取对数,将连乘转变为连加:

\[\begin{aligned} L(w) = \log \ell(w) &= \sum_{i=1}^N [y_i \log\pi + (1-y_i)\log (1-\pi)] \\ & = \sum_{i=1}^N [y_i \log \frac{\pi}{1-\pi} + \log [1-\pi]] \\ & = \sum_{i=1}^N [y_i(w\cdot x_i) + \log (\frac{e^{-(w^Tx_i)}}{1+e^{-(w^Tx_i)}})] \\ & = \sum_{i=1}^N [y_i(w\cdot x_i) + \log (1 - \frac{1}{1+e^{-(w^Tx_i)}})] \end{aligned} \tag{9}\]

此处取对数似然函数有两个好处:

  1. 方便计算,对数函数时严格单调递增函数,不改变原函数的单调性。
  2. 由于概率的值域为 $[0,1]$,当样本量比较大的时候累乘概率值很有可能得到一个很小的数值,造成浮点数下溢,不利于之后的计算。 而取对数似然函数则将累乘转变为累加,解决了这个问题。

机器学习中我们用损失函数来衡量模型出错的程度,通常我们时想要极小化损失函数。

此处我们恰好可以利用极大化似然函数的思想,取整个数据集的平均负似然函数作为损失函数,我们可以得到:

\[J(w) = -\frac{1}{N}L(w) \tag{10}\]

因此在逻辑回归中,最小化损失函数和最大化似然函数实际上是等价的。

利用梯度上升法求解参数

为了得到关于参数 $w$ 的极大似然估计,我们求对数似然函数关于任意 $w$ 处的梯度,利用 梯度上升法 (Gradient Ascent) 解出 $w$。

\[\begin{aligned} \frac{\partial L(w)}{\partial w} & = \frac{\partial }{\partial w} \sum_{i=1}^N [y_i(w\cdot x_i) - \log (1 - \frac{1}{1+e^{-(w^Tx_i)}})] \\ & = \sum_{i=1}^N[y_ix_i+(\frac{1}{1-\frac{1}{1+e^{-w^Tx_i}}} \times \frac{x_i e^{-w^Tx_i}}{(1 + e^{-w^Tx_i})^2})] \\ & = \sum_{i=1}^N[y_ix_i+(\frac{1+e^{-w^Tx_i}}{e^{-w^Tx_i}} \times \frac{x_i e^{-w^Tx_i}}{(1 + e^{-w^Tx_i})^2})] \\ & = \sum_{i=1}^N[y_ix_i+(-x_i \frac{1}{1+e^{-w^Tx_i}}) \\ & = \sum_{i=1}^N[y_ix_i-x_i\pi] \\ & = \sum_{i=1}^N[x_i(y_i-\pi)] \end{aligned} \tag{11}\]

此时我们非常耿直地用训练集中所有实例点计算出了当前关于任意 $w$ 处的梯度 $\nabla L(w)$。

在这里我解释一下为什么用梯度上升法以及为什么可以使用梯度上升法。原因如下:

  1. 似然函数 $L(w)$ 是一个 连续凸函数, 我们的目的是找到一个 $w$ 可以使得似然函数取得最大值,因此我们应当沿着梯度上升的方向去更新 $w$。
  2. 并且,又由于似然函数 $L(w)$ 是一个 连续凸函数,意味着其只可能存在一个全局最优的点,不存在局部最优。因此我们放心的使用梯度上升法而不用担心结果落入局部最优。

现在我们根据梯度上升法来更新 $w$:

\[w^{new} = w^{old} + \eta \nabla L(w) \tag{12}\]


利用随机梯度上升法求解参数

到这里还没完,阿南悄悄地告诉你:我们没有必要那么耿直地把所有实例点都用来计算梯度。我们只需要每次随机选取一个实例点 $(x_i,y_i)$ 用来表示整体样本,并将它的值乘以 $N$,就得到了关于梯度的无偏估计值:

\[w^{new} = w^{old} + \eta N [x_i(y_i-\pi)] \tag{13}\]

上面秘诀就来自 随机梯度上升法 (Stochastic Gradient Ascent) 的核心思想。

逻辑回归算法:

输入: 数据集:$T={(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}$,其中,$x_i\in \chi=R^n, y_i\in \gamma ={+1,0}$。其中$x_i$是数据集中第$i$个样本或称为实例,$y_i$为$x_i$的类标记。

输出: 概率值 $\pi$

  1. 随机初始化 $w$
  2. 利用梯度上升或随机梯度上升更新 $w$
  3. 重复 $1,2$,只到两次更新的差值小于阈值 $\epsilon$ 时跳出,输出模型:
\[P(Y=1|x_i) = \frac{1}{1+e^{-(w^Tx_i)}} = \pi\]

总结

由于逻辑回归是直接对条件概率 $P(Y\mid X)$ 建模,因此属于判别模型。

接下来要说的是,逻辑回归最大的特点就是解释性很强!

  1. 模型的计算的是有意义的概率值,而不是冷冰冰类别。

    这点非常重要!试想如果一个实际患病的病人被感知机或KNN模型简单地判定为没有患病,而事实上只是因为在前两个模型最后的指示函数上偏向了未患病 $0.01$ 就导致结果完全不同,甚至可能会剥夺一个人的生命!

    而逻辑回归的输出值就是概率。同样的案例逻辑回归的结果可能是患病的概率是 $49.9\%$ 而未患病的概率是 $50.1\%$,因此当医生看到这个结果时很大概率会加大警惕并且让这个病人去复查,从而挽救一条鲜活的生命!

  2. 在模型训练完成之后,我们获得的是一组 $n$ 维的权重向量 $w$ 和偏置 $b$。

    对于权重向量 $w$, 其每个维度的值衡量了该维度上的特征对于最终结果的贡献大小。假如权重 $w$ 的第 $i$ 个维度上的值为正,说明第 $i$ 个特征对于判定实例属于正类起着正向贡献,并且其值越大贡献越大。

    而对于偏差 $b$,表示对正负两个类别的倾向。如果 $b=0$ 则表示对于两个类别是公平的,没有任何倾向。假如 $b>0$ 则表示实例更容易分到正类,反之亦然。

在式 $(1)$ 的部分,小伙伴们可能会感到疑惑,为什么 $P(Y=1\mid x_i)=\pi$ 要用 $Sigmoid$ 函数来进行映射,这里简单地讲一下我的理解。

仔细观察 发生比 $(Odds)$ 的定义我们可以发现其值域为 $[0,+\infty)$。然鹅我们想用值域为 $(-\infty, +\infty)$ 的线性模型 $y=w^Tx$ 去与发生比建立关系。

发现对 $Odds$ 取自然对数就能获得和线性函数相同的值域,故建立如下映射关系:

\[\ln Odds = \ln \frac{\pi}{1-\pi} = w^Tx \tag{14}\]

于是我们可以通过构建自然指数,反解 $(13)$ 得出实例属于类别 $1$ 的概率 $\pi$s:

\[\pi=\frac{e^{w^Tx}}{1+e^{w^Tx}}=\frac{1}{1+e^{-w^Tx}} \tag{15}\]

到这里关于逻辑回归基本上就介绍完啦~ 欢迎各位小伙伴的意见与建议!

谢谢观看 :)