这篇文章是斯坦福大学吴恩达老师机器学习课程第三周的笔记
分类
分类问题如同回归问题,只不过其预测值变成了有限的特定集合。对于二分类来说,预测值仅仅为0或者1,称为逻辑回归。
假设函数
对于逻辑回归其假设函数是,而对于分类问题,假设函数变为:,其中,称该函数为 函数或者 函数。该函数图像如下:
这里,给出的结果是对预测的概率值,取值为从0到1。
决策边界
为了对分类进行预测,给定一个阈值0.5,当时,则预测,反之则为。而该分界点对应着,也就是说:
而决策边界就是将分离开来的边界线,对应着,这是由假设函数所决定的线。当然,值得强调一点的是,决策边界可能是直线,也可能是任意形状,比如下图:
逻辑回归的损失函数
在线性回归中,曾讨论过线性回归的损失函数,首先我们定义一个代价函数,对于线性回归,由于是多项式,其损失函数总是,而对于逻辑回归函数,由于当中有一项,导致其损失函数是一个非凸函数,进而会导致函数求解存在局部最优解,如下图示意:
鉴于以上原因,需要重新定义逻辑回归的损失函数,给出定义如下:
$Cost(h_\theta(x),y)=-log(h_\theta(x)) \quad if\ y=1 $
上述的两个代价函数可以合并为以下形式:
函数图像如下示意:
现在,逻辑回归的损失函数可以完整表示为:
向量化表示为:
其梯度下降更新公式为:
向量化表示为:
高级优化器
为了求解参数,我们使用了梯度下降算法作为优化算法,事实上,有其他更多高级的优化算法,比如BFGS(共轭梯度),L-BFGS等。这些算法通常有着比梯度下降更好的性能、更快的收敛速度,但是实现更为复杂。在Octave中,可以使用fminunc函数来使用这些优化器,函数会自动选择合适的优化器。
% 计算损失J及其梯度
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end
% 调用优化器
options = optimset('GradObj', 'on', 'MaxIter', 100);
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
多分类问题
逻辑回归的多分类问题可以通过一对多实现,即:对于n个分类,针对每一个类别与其他类别,分别训练一个分类器,共训练n个分类器。对于某样本的预测值,最后取n个分类器概率最大值即可。
过拟合
如下图,对于房价预测的例子,假设我们有这样一组数据,想要做出一个拟合模型。最简单的就是直线拟合,如图中灰色线,但此时很多点都在直线外;进一步,使用三次多项式拟合,此时对点的拟合效果较好;更进一步,如果使用5次多项式进行拟合,此时几乎所有点都在直线上,但是这也明显看得出来这条预测线对已知数据拟合得**“太好了”** ,几乎已经失去了对新数据进行合理预测的能力。因此称这种现象为过拟合(Over fitting) ,而第一种情况则相应的称为欠拟合。
一般的,欠拟合:存在着高偏差(bias),而过拟合,则存在着高方差(variance)。
为了减少过拟合的问题,可采用的方法包括:
- 减少特征数量
- 正则化
代价函数的改进
为了解决过拟合的问题,我们可以在代价函数上进行改进。在上面的房价预测中,我们希望假设函数是一个接近二次或者三次的多项式,但实际上我们的假设函数是五次多项式:,此时,实际上我们希望接近0,那么真实的预测函数就会接近二次多项式。这种情况可以通过在损失函数中添加正则化项来实现。
上式中,称为正则化参数,该参数能平滑拟合函数,减少过拟合。当其过大,会造成拟合线趋近于水平线,导致欠拟合,而当其过小(接近于0),则起不到平滑作用,导致过拟合。
正则化线性回归
首先,将参数更新修改为以下形式:
将分离出来的原因是正则化项并不从0开始。这是一种约定俗成。
将上述更新公式稍作改变:
可以发现,正则化后的更新公式就是在原来的更新公式基础上对做了缩放,并且,由于。所以正则化总是将参数进行了压缩。
正规方程解法的改进
添加了正则化项后的正规方程变化为以下形式:
当然,此时同样需要注意矩阵的不可逆问题。
正则化逻辑回归
对于逻辑回归,其原理跟线性回归完全一致,只不过相应的损失函数变为: