机器学习学习笔记(十一)调试算法

当发现测试算法时预测的结果有非常大的误差时,有以下几种方法解决问题:

  1. 使用更大的训练集

  2. 使用更少的特征值

  3. 使用更多的特征值

  4. 使用更高次幂的特征值

  5. 减少正则化参数

  6. 增加正则化参数

判断如何选择方法不应该"凭感觉"选择,而应该科学地使用机器学习诊断法进行判断,以更省时间,更有意义地改进算法.

过拟合与欠拟合

upload successful

(图为过拟合)

过拟合与欠拟合都将不能很好的匹配新的数据.

方法:将所有数据分为训练集与测试集.比例可以使用7:3.

当训练集的\(J(\theta )\)很小,测试集的\(J(\theta )\)很大时,此时即为过拟合的情况.

\[ J_{test}(\theta )=\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\theta}(x_{test}^{i})-y_{test}^{i})^{2}\]

以上公式即为线性回归测试集误差计算公式;

\[ J_{test}(\theta )=-\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}y_{test}^{i}\log h_{\theta }(x_{test}^{i})+(1-y_{test}^{i})\log h_{\theta }(x_{test}^{i})\]

以上公式为逻辑回归测试误差公式;

可以看到其实误差公式与代价函数的计算是一致的.

通过以上计算公式可以量化测试集测试训练集的训练结果.


确定多项式的次数

已经知道,当多项式的次数过高的时候,会发生过拟合现象.如何根据数据来确定多项式次数d呢?

与之前加上验证集不同的是,将数据集分成三部分:训练集,测试集,交叉验证级.

选择不同的多项式次数分别对验证集进行计算,

\[ 1. h_{\theta }(x)=\theta _{0}+\theta _{1}x\\2. h_{\theta }(x)=\theta _{0}+\theta _{1}x+\theta _{2}x^{2}\\3. h_{\theta }(x)=\theta _{0}+\theta _{1}x+...+\theta _{3}x^{3}\\\vdots \\10. h_{theta }(x)=\theta _{0}+\theta _{1}x+...+\theta _{10}x^{10}\]

得到各自的\(J_{cv}(\theta )\),由此可以选择出最合适的多项式次数.


因此,选择算法使用验证集进行模型选择,使用测试集来评价模型的好坏,这样就能找到合适的模型.

偏差(bias)与方差(variance)

upload successful

具体来说,欠拟合是高偏差情况,过拟合是高方差情况.

分别对训练集和验证集的误差情况与多项式次数进行画图

upload successful

可以看到当项数次数过少时,错误相当的大,此时是高偏差情况;当项数次数过多时,训练集的误差变得非常小,呈现出过拟合的情况.但是交叉验证集的错误将急剧上升,此时的情况是高方差.

直接描述就是:训练集误差小验证集误差大时,就是过拟合-高方差情况;

选择合适的正则化参数lambda

改变lambda时,训练集\(J_{train}\)与交叉验证集\(J_{cv}\)都会发生一定的变化.

当参数过多过大时,后面的正则化项的值就会很大,因而导致$ J()$也变大,从而使这个预测方程得到更多的惩罚,使其像参数变量尽量小的地步靠拢。对正则化过程有影响的是lambda,当lambda数值大的时候,函数收到的惩罚更多,会更快地减少参数数值;当lambda为0的时候,函数则不会对参数进行正则化处理。

如图所示

upload successful

当lambda过大时,会处于高偏差情况,\(J_{train}\)的值会很大,lambda值过小时会处于过拟合情况.

因此,上图的左端对应着高方差,右端对应着高偏差问题,

学习曲线

用于判断算法的学习情况.可以判断此时处于高方差高偏差情况以对于算法进行修改.

绘出\(J_{train}(\theta )\)\(J_{cv}(\theta )\)的图像.

upload successful

上图为训练集大小与两个J的对应情况.

当训练集过大时,\(J_{train}\)越来越难对与过大的训练集做出良好的拟合,因此在图上表现出m越大error越多.

相反,当训练集大的时候,\(J_{cv}\)更能获得更好的泛化,即对新样品的适应更好,因此可以得到上述曲线.

如果不使用多项式拟合而直接用一条直线,那么数据集的大小再大也于事无补,无法更加接近实际情况.此时\(J_{train}\)\(J_{cv}\)会很接近,

upload successful

这种情况便是高偏差情况.

反之,如果项数很大的话,学习曲线会如图所示:

upload successful

\(J_{train}\)\(J_{cv}\)间会有很大的差距,这种情况是高方差.



回到最开始的情况

  1. 使用更大的训练集可以对于高方差的情况有所帮助(将学习曲线画出来可以看出)

  2. 使用更少的特征值可以修复一定的高方差情况.

  3. 使用更多的特征值可以修复高偏差情况

  4. 使用更高次幂的特征值可以修复高偏差情况

  5. 减少正则化参数可以修复高偏差

  6. 增加正则化参数可以修复高方差