「吴恩达机器学习」7.Logistic回归
之前讲解了机器学习中的回归问题,本章节主要讲解了另外一类问题——分类问题。
Classification
本节课引入了机器学习的另外一类问题——分类问题。
分类问题的应用:
- Email: Spam / Not Spam?
- Online Transactions: Fraudulent (Yes / No)?
- Tumor: Malignant / Benign ?
上面这3个问题都属于分类问题中的二分类(binary/two-class)问题,也就是预测结果有两个输出值,0和1,0表示负向类,1表示正向类。
哪个类别为正,哪个类别为负并没有明确的规定,但我们通常把有某种东西定义为1,没有则定义为0.
能否采用线性回归的方法解决分类问题?
我们以肿瘤预测问题为例,这是一个二分类问题。
假如我们的数据集只有左边8个点,那么我们采用线性回归的方法可能会得到蓝色的线,当假设函数的结果大于等于0.5时,我们预测出1;当假设函数的结果小于0.5时,我们预测出0.这似乎得到了一个不错的结果。
但是,假如我们的数据集增加了最右边的点,那么在线性回归中,为了使得代价函数最小,我们的假设函数就会发生偏移,可能就变成了绿色的线,这时我们就会发现预测结果错误率很高。
所以,从这个例子中来看,采用线性回归解决分类问题是不靠谱的。
从另一个角度来说,分类问题的输出是\(y = 0 \space or \space 1\),而线性回归的假设函数的输出\(h_\theta(x)\)可以大于1也可以小于0,这也是不太合理的。
所以我们接下来引入逻辑回归算法(Logistic Regression),它的输出值\(0 \le h_\theta(x) \le 1\)。
注意:逻辑回归名字中带有回归是历史原因,但它是分类算法,而且是经典的二分类算法。
Hypothesis Representation
主要讲解逻辑回归模型中假设函数如何表示。
在逻辑回归模型中,我们希望假设函数\(0 \le h_\theta(x) \le 1\),而线性回归的假设函数\(h_\theta(x)=\theta^Tx\)的输出值为任意值,因此我们引入了Sigmoid funciton\(g(z)\),也称为Logistic function(这就是逻辑回归算法名字的由来):
Sigmoid function的函数图像如下:
可以看到,其输入是整个实数范围,而输出在0到1之间。
sigmoid funcion的Python代码实现:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
我们把线性回归模型的假设函数,再经过sigmoid function的映射,就能得到一个输出值在0到1之间的函数:
这就是逻辑回归的假设函数。
Interpretation of Hypothesis Output
\(h_\theta(x)\)的作用是,对于给定的输入变量\(x\),根据选择的参数\(\theta\),计算输出变量\(y=1\)的概率,数学表达式为\(h_\theta(x)=P(y=1|x;\theta)\)(probability that y = 1, given x, parameterized by \(\theta\))。
estimated probability that y = 1 on input x.
E.g. 对于给定的\(x=\begin{bmatrix}1 \\ tumorSize\end{bmatrix}\),通过确定的参数计算出\(h_\theta(x)=0.7\),也就是告诉病人肿瘤有70%的概率是恶性的。
Decision Boundary
主要讲解决策边界的概念,有助于我们理解逻辑回归的假设函数究竟在计算什么。
逻辑回归的假设函数如下:
函数图像如图:
假设,
- 当\(h_\theta(x) \ge 0.5\)时,预测\(y=1\);
- 当\(h_\theta(x) \lt 0.5\)时,预测\(y=0\)。
这里的等号放在哪边都可以。
因为\(z=\theta^Tx\),所以从图像中可以看出:
- 当\(\theta^Tx \ge 0\)时,预测\(y=1\);
- 当\(\theta^Tx \lt 0\)时,预测\(y=0\)。
Example
现在假设我们训练集如下:
假设函数为:\(h_\theta(x)=g(\theta_0 + \theta_1 x_1 + \theta_2 x_2)\),并且参数\(\theta=\begin{bmatrix} -3 \\ 1 \\1 \end{bmatrix}\).
则当\(\theta^Tx = -3 + x_1 + x_2\ge 0\)时,即\(x_1+x_2 \ge 3\)时模型将预测\(y=1\),所以直线\(x_1+x_2=3\)就是我们的决策边界。
决策边界将预测为1的区域和预测为0的区域分隔开。
假如我们的数据集如下图所示,那么我们可能会得到一个圆形\(x_1^2+x_2^2=1\)的决策边界。
注意:决策边界是假设函数的属性。
Cost Function
本节课主要定义了逻辑回归的代价函数。
对于逻辑回归模型,我们如何选择参数\(\theta\),也就是如何拟合模型?
和线性回归问题一样,为了选择最优的参数\(\theta\),我们需要先定义出代价函数。
在线性回归中,我们定义的代价函数为:\(J(\theta)=\frac{1}{m}\sum_{i=1}^m{\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2}\)。为了简化方程,我们令\(Cost(h_\theta(x^{(i)}), y^{(i)})={\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2}\),那么代价函数就简写为:
假如我们对逻辑回归沿用这个定义,那么当我们将\(h_\theta(x)=\frac{1}{1 + e^{-\theta^Tx}}\)代入到代价函数中时,得到的将是一个非凸函数(non-convex function)。
而非凸函数的问题在于有很多局部最优解,我们很难通过梯度下降法找到一个全局最优解。
所以我们重新定义逻辑回归的代价函数为:
其中,
当\(y=1\)时,\(h_\theta(x)\)与\(Cost(h_\theta(x), y)\)的关系如下图所示:
如果\(y=1\),那么\(h_\theta(x)\)越接近于1,cost就越接近于0;反之\(h_\theta(x)\)越接近于0,说明我们的预测结果越不准确,cost就会越大。
同理,当\(y=0\)时,\(h_\theta(x)\)与\(Cost(h_\theta(x), y)\)的关系如下图所示:
从上面两幅图可以得出,我们的代价函数从原理上是合理的,符合“代价函数”的定义。
Simplified Cost Function and Gradient Descent
本节课主要讲解如何简化代价函数,以及如何运用梯度下降算法。
Logistic regression cost function
前面我们已经得到了逻辑回归的代价函数:
由于\(y\)总是等于1或者0,所以我们可以把上面的\(Cost(h_\theta(x), y)\)方程合并为:
那么假设函数\(J(\theta)\)就变成:
得到这样一个代价函数之后,我们就能够使用梯度下降算法来求解使得代价函数最小的参数了。
代价函数之所以是这样,是因为采用了统计学中的极大似然估计法得出的,这已经超出本门课程的讨论范畴,同时我们只需要知道这个函数是凸函数,没有局部最优解即可。
Gradient descent
求解方法和之前的线性回归一样:
求导后得到:
我们可以发现这个式子和之前的线性回归的式子看起来是一模一样的,但是,实际上我们的假设函数\(h_\theta(x)\)不一样,所以两者其实是完全不同的。
在逻辑回归中,同样可以应用特征缩放的方法,让梯度下降收敛更快。
Advanced Optimization
主要介绍了求解参数\(\theta\)的更高级的方法,替换梯度下降法。
先来看一下梯度下降法的本质是什么。
我们想要计算使得\(J(\theta)\)最小的参数\(\theta\)值,采用梯度下降法需要计算\(J(\theta)\)和\(\frac{\partial}{\partial\theta_j}J(\theta)\)。因此如果有一种算法可以计算这两个式子,那么就能够替代梯度下降法。
只有需要看代价函数的下降过程才需要计算\(J(\theta)\),否则可以不计算
有以下优化算法:
- Gradient descent
- Conjugate gradient(共轭梯度法)
- BFGS(变尺度法)
- L-BFGS(限制变尺度法)
后面三种算法的具体细节都超过了本门课程的讨论范畴,我们只需要知道其优缺点即可。
Advantages:
-
不需要人工选取学习率\(\alpha\)
他们有一个智能的内部循环,称为线性搜索(line search)算法,可以自动尝试不同的学习率
-
通常比梯度下降法快
Disadvantages:
- 更复杂
其实这些复杂算法我们并不需要自己实现,甚至不需要知道内部细节,只要能够调包使用即可。
Multi-class Classification: One-vs-all
讲解如何使用逻辑回归解决多类别分类问题,具体介绍了“一对多”(one-vs-all)分类算法。
Multiclass classification examples
- Email foldering/tagging: Work, Friends, Family, Hobby
- Medical diagrams: Not ill, Cold, Flu
- Weather: Sunny, Cloudy, Rain, Snow
二元分类问题和多类别分类问题数据集可能分别如下所示:
下面介绍的“一对多”(one-vs-all)分类方法,也称为“一对余”(one-vs-rest)方法。
训练集如左图所示,一共有3个类别。我们可以把类别2和类别3的数据集“合并”到一次,创建一个新的“伪”数据集,类别1设定为正类,类别2/3设定为负类,训练出分类器\(h_\theta^{(1)}(x)\)。再以此类推训练出分类器\(h_\theta^{(2)}(x)\)和\(h_\theta^{(3)}(x)\)。
对于每一个类别\(i\),我们都采用逻辑回归的方法训练出了对应的分类器\(h_\theta^{(i)}(x)\),可以预测\(y=i\)的概率。这样对于新的输入\(x\),我们只需要选择分类器\(h_\theta^{(i)}(x)\)中概率最大的作为\(x\)对应的类别\(i\)即可。
简单来说“one-vs-all”算法的思想就是将一个多类别分类器拆分成多个二元分类器,将未知问题转换成已知问题的分析方法。