简介
在上一篇机器学习之线性回归中我们聊到了怎么使用线性模型预测房价问题。也就是回归问题。这次我们来聊聊分类问题。
例子
我们首先分析一下用线性回归做分类为什么不合适,如下图的例子
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170524164056232-360275758.png)
这是一个乳腺癌相关的例子,横轴表示肿瘤的大小,纵轴上的1和0标明是或者不是恶性肿瘤。当\(h_\theta\) 大于等于0.5时,预测y=1; 当\(h_\theta\)小于0.5时,预测y=0,似乎这样一个线性模型可以很好的预测。如果我们的样本中有一个非常大尺寸的肿瘤,我们的模型看起来会像下图
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170524165415904-2096306402.png)
可以看出如果继续使用0.5作为判断标准的话可以看出,左上方两个红色的点会被误判。我们需要一个新的模型
逻辑回归模型
\[h_\theta(x) = g(\theta^Tx)
\]
sigmoid函数
\[h_\theta(x) = g(\theta^Tx) = \frac{1}{1 + e^{-\boldsymbol{\theta}^{\text{T}}\boldsymbol{x}}}
\]
函数的图形如下所示
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170525112750075-1121564122.png)
为了下面参数求解方便,我们先推导一下sigmoid函数的导数
\[\begin{eqnarray*}
{g}'\left (z\right ) & = & {\left ( \frac{1}{1 + e^{-z}} \right )}' \\
& = & \frac{1'(1 + e^{-z}) + 1(1 + e^{-z})'}{(1 + e^{-z})^2} \\
& = & \frac{e^{-z}}{(1 + e^{-z})^2} \\
& = & \frac{1}{1 + e^{-z}}\cdot \frac{e^{-z}}{1 + e^{-z}} \\
& = & g(z)\cdot(1 - g(z))
\end{eqnarray*}\]
参数求解
我们从最大似然估计和损失函数的角度来求解参数\(\theta\)
最大似然估计
从概率角度考虑,由于逻辑回归适用于二元的分类问题,实际上是二项分布,我们可以如下定义:
\[\begin{eqnarray*}
P(y=1|x;\theta) & = & h_\theta(x) \\
P(y=0|x;\theta) & = & 1 - h_\theta(x)
\end{eqnarray*}\]
可以写成如下更简单的形式
\[p(y|x;\theta) = h_\theta(x)^y(1 - h_\theta(x))^{1-y}
\]
对m个样本,我们得到的最大似然函数:
\[\begin{eqnarray*}
L(\boldsymbol{\theta}) & = & \prod_{i=1}^{m} p\left(y^{(i)}\ |\ \boldsymbol{x}^{(i)};\boldsymbol{\theta}\right) \\
& = & \prod_{i=1}^{m} \left( h_\boldsymbol{\theta}(\boldsymbol{x}^{(i)}) \right) ^{y^{(i)}}\left( 1 - h_\boldsymbol{\theta}(\boldsymbol{x}^{(i)}) \right)^{1-y^{(i)}}
\end{eqnarray*}\]
求对数
\[\begin{eqnarray*}
l(\boldsymbol{\theta}) & = & \log L(\boldsymbol{\theta}) \\
& = & \sum_{i=1}^{m}y^{(i)}\log h_\boldsymbol{\theta}(\boldsymbol{x}^{(i)}) + (1-y^{(i)})\log \left( 1-h_\boldsymbol{\theta}(\boldsymbol{x}^{(i)}) \right)
\end{eqnarray*}\]
我们的目标是找出对数似然函数取最大值时\(\theta\)的取值,首先简化一下我们的问题,假设只有一个样本,求梯度
- 使用上面给出的结论对目标函数进行替换
\[h_\theta(x) = g(\theta^Tx)
\]
- 对我们的极大似然函数求偏导
\[\begin{eqnarray*}
\frac{\partial }{\partial \theta_j}l(\theta) & = & (y(\frac{1}{g(\theta^Tx)})\frac{\partial }{\partial \theta_j}g(\theta^Tx) + (1-y)(\frac{1}{1 - g(\theta^Tx)})\frac{\partial }{\partial \theta_j}(1 - g(\theta^Tx))) \\
& = & (y(\frac{1}{g(\theta^Tx)}) - (1-y)(\frac{1}{1 - g(\theta^Tx)}))\frac{\partial }{\partial \theta_j}g(\theta^Tx) \\
& = & (y(\frac{1}{g(\theta^Tx)}) - (1-y)(\frac{1}{1 - g(\theta^Tx)}))g(\theta^Tx)(1 - g(\theta^Tx))\frac{\partial }{\partial \theta_j}g(\theta^Tx) \\
& = & ((y(1 - g(\theta^Tx)) - (1-y)(g(\theta^Tx)))x_j \\
& = & (y - g(\theta^Tx))x_j \\
& = & (y - h_\theta(x))x_j
\end{eqnarray*}\]
- 由于求得是最大值,使用梯度上升算法
\[\begin{eqnarray*}
\theta_j & = & \theta_j - \alpha \frac{\partial}{\partial \theta_j} l(\boldsymbol{\theta}) \\
& = & \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} \left( h_\boldsymbol{\theta}(\boldsymbol{x^i}) - y^i \right) x^{i}_j
\end{eqnarray*}\]
损失函数
如果使用上篇线性回归中的均方误差作为损失函数,我们将得到一个非凸的,无法利用梯度下降方法来最小化损失函数。
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170525161456372-1592926581.png)
所以我们重新定义我们的损失:
\[Cost\left( h_\boldsymbol{\theta}(\boldsymbol{x}), y \right) = \left\{ \begin{align*} - \log \left( h_\boldsymbol{\theta}(\boldsymbol{x}) \right), \quad y=1 \\
- \log \left( 1-h_\boldsymbol{\theta}(\boldsymbol{x}) \right),\quad y=0
\end{align*}\right.
\]
\(h_\theta(x)\) 与 \(Cost(h_\theta(x), y)\)之间的关系如下图所示:
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170525162407419-1124227082.png)
当实际的\(y = 1\) \(h_\theta(x)\) = 1\(,损失为0。当实际的\)y = 1$ \(h_\theta(x)\) 不等于1时,损失随着\(h_\theta(x)\)变小而增大。当 \(y == 0\)时同理
所以上面的损失能够较好的评价回归模型的好坏。
基于上面的定义,定义逻辑回归的损失函数:
\[\begin{align*}J(\boldsymbol{\theta})&=\frac{1}{m} \sum_{i=1}^{m} Cost(h_\theta(x_{i}), y_{i}) \\
&=-\frac{1}{m}\left[\sum_{i=1}^{m}y_{i} \log h_\theta(x_{i})+(1-y_{i}) \log (1-h_\theta(x_{i}))\right]
\end{align*}
\]
可以看出和我们上面使用最大似然估计得到的结果一样,余下的步骤和上面是重复的
多分类任务
前面我们已经学习了如何解决二分类任务, 给定的任务类别多于2(也即多分类任务),那么应该怎么解决?下面就来介绍如何使用逻辑回归解决多分类问题。
首先我们形式化的表示我们的例子
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170531153428149-43680263.png)
现在我们有一个训练集,有3个类别,如上图所示,我们三角形表示y=1, 方框表示y=2, 叉叉表示y=3。我们的做法是把这个训练集分成3个二元分类问题
我们先从用三角形代表的类别 1 开始,实际上我们可以创建一个,新的"伪"训练集,类 型 2 和类型 3 定为负类,类型 1 设定为正类,我们创建一个新的训练集,如下图所示的那
样,我们要拟合出一个合适的分类器
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170531153143883-783935785.png)
- 这里的三角形是正样本,而圆形代表负样本。设置三角形的值为 1,圆形 的值为 0,下面我们来训练一个标准的逻辑回归分类器,这样我们就得到一个正边界。
为了能实现这样的转变,我们将多个类中的一个类标记为正向类(y=1),然后将其他 所有类都标记为负向类(y = 0),这个模型记作\(h_{\theta}^{1}x\) 。接着,类似地我们选择另一个类标记为 正向类(y=2),再将其它类都标记为负向类,将这个模型记作\(h_{\theta}^{2}x\) ,依此类推。 最后我们得到一系列的模型简记为:\(h_{\theta}^{(i)}x = p(y = i|x:\theta) \tag (i = 1, 2, 3, k)\)
![](https://images2015.cnblogs.com/blog/756316/201705/756316-20170531151348805-537275978.png)
最后,在我们需要做预测时,我们将所有的分类机都运行一遍,然后对每一个输入变量, 都选择最高可能性的输出变量
我们要做的就是在我们三个分类器里面输入 x,然后我们选择一个让\(h_{\theta}^{(i)}x\)最大的i, 也即最大的\(\max_{i}h_{\theta}^{(i)}x\)
代码
参考文献