coursera机器学习课程笔记 【week 6】

本周的学习内容不是一个新的模型或是算法,而是与特定算法无关、对于整个机器学习领域实践方面的通用的建议。

模型评估

在前面的学习中,我们已经提到了过拟合和欠拟合问题,出现这些问题都说明我们需要修正模型。那么首先,如何判断是否出现了这些问题,即如何对模型进行评估呢?在比赛或实际应用中,我们不会拿到特定的测试集以供我们验证模型的准确率。因此,我们需要自己找测试集。这部分测试集与我们在参数选择、模型训练的过程无关,因此在这个测试集上有较好的准确率,则说明我们的模型有较好的泛化性能。

通常我们可以把训练集分成两部分,一部分仍然作为训练集,而另一部分则充当测试集。比如说,随机选取70%作为训练集,再把剩下的30%的数据用来测试。

模型选择

在模型选择的时候,我们需要不断地测试模型的准确率并进行调整。然而,如果每次都用先前选定的测试集的话,会造成我们的模型和这个测试集拟合得很好,却依然没有较好的泛化性能的情况:因为模型的调整是以拟合这个测试集为目标的。因此这个测试集在模型选择的过程中不能用,而是用在最后的泛化性能测试中,充当“一般化的数据”的角色。那么在模型选择时,我们就需要从训练集再取出一部分数据(称为验证集)作为基准。

也就是说,整个原始数据集被分成三份:训练集,验证集和测试集。它们的关系和作用如下图表示:

三个数据集的关系
三个数据集的关系

欠拟合(高偏差) VS 过拟合(高方差)

当一个算法的表现不理想时,通常是两种情况:

  1. 欠拟合。在这种情况下,我们的算法还学得不够好,模型的拟合能力不够强。因此,模型对训练集预测出的结果和实际标签之间有较大的偏差。
  2. 过拟合。在这种情况下,我们的模型高度拟合与训练集,但它学得过多,导致训练数据的一点点小变动都会导致模型的显著变化。这时就是较大的方差。

总的来说,随着训练程度的加强,偏差逐渐减小,方差逐渐增大,导致模型的泛化误差是先减小后增大的。因此,训练程度过弱或过强都不可取,我们的目标是取到泛化误差最小的那个点。

另外,正则化其实就是“抑制”我们的训练、学习的过程。所以偏差、方差、泛化误差随正则化参数\(\lambda\)的变化与它们随训练程度的变化情况是相反的:随着\(\lambda\)变大,偏差逐渐增大,方差逐渐减小,泛化误差先减小后增大。

学习曲线

正常情况下,模型对于训练集和验证集的误差随训练集大小的变化情况如下:

learning-rate
learning-rate

从图中可以看出,

  1. 训练集上的误差随着训练集大小递增。在样本很少的时候,容易找出合适的模型来拟合到所有的样本点,但随着样本增多,要考虑到所有样本点就没那么容易了。
  2. 验证集的误差随样本数递减。样本少会导致无法充分学到数据中的规律,在验证集中进行预测时也就会有较大的偏差。而随着样本增多,模型越学越好,误差逐渐降低。
  3. 另外还能观察到,虽然一增一减,但验证集上的误差率始终高于训练集的误差率。

上面的这两条曲线叫做学习曲线,我们可以用学习曲线来判断是否出现了欠拟合、过拟合问题。比如说,当出现欠拟合(高偏差)的情况时,学习曲线会呈现出如下的样子:

欠拟合/高偏差的学习曲线
欠拟合/高偏差的学习曲线

在这图中,有以下几点特征:

  1. 验证误差会首先下降,但下降趋势逐渐减缓,且到最后趋于水平。这说明在我们遇到欠拟合问题时,增加样本数量并不能提高模型的准确率。
  2. 训练误差逐渐增大,并接近验证误差。
  3. 两种误差在趋于稳定后,会保持在一个较高的误差值的范围内,也就是说,模型的性能并不好。

接下来看过拟合(高方差)的情形:

欠拟合/高偏差的学习曲线
欠拟合/高偏差的学习曲线

过拟合的学习曲线的特征为:

  1. 训练误差逐渐增大,但值比较小。考虑一种极端情况:当样本数非常大时,仍然拟合到了几乎所有样本点,那么训练误差必然很低。
  2. 验证误差逐渐下降,但值很大。因为过拟合的模型过多得学习了训练数据的特性,导致泛化性能不好,因此有较高的验证误差率。
  3. 两种误差之间仍有明显的一段差距:训练误差很小,验证误差很大。
  4. 随着样本数的不断增大,两种误差会逐渐接近。这点可以这样理解:假设样本数非常大,模型从训练集中学到的规律趋于适用于所有数据的通用规律,而不是训练集中独有的特性。这就代表模型在验证集上的拟合误差率逐渐接近于在训练集上的误差率,也就代表着泛化性能的增强。因此,在遇到过拟合的问题时,增大样本数目往往会有帮助。

模型调整

这里列举一些常见的调整模型的行为,以及它们能够缓解的问题是什么:

行为 能够缓解的问题
增加训练样本 过拟合
减少特征 过拟合
添加特征 欠拟合
添加多项式特征(\(x_1^2,x_2^2,x_1x_2\),etc) 欠拟合
减少\(\lambda\) 欠拟合
增大\(\lambda\) 过拟合

另外,在使用神经网络时,如果使用的是小型的神经网络,计算量比较小,但可能会遇到欠拟合的问题;而如果使用大型的神经网络,通常学习能力更好,可能会遇到过拟合。注意在遇到过拟合时,在大型神经网络上进行正则化通常要比选择小型的神经网络要好。而至于隐层的层数选择,我们可以尝试多种方案,并用交叉验证比较它们的优劣。