Loading

吴恩达机器学习笔记-10(机器学习诊断法)

机器学习诊断法

当我们在开发一款机器学习系统时,总有想要改进算法的时候,这个时候就需要对所用的算法进行诊断,判断接下来该选择从哪些方面入手提高算法的性能。

评估假设函数

以房屋售价为例子。
当我们在选择假设函数的参数\(\theta\)时,有的人会选择能使训练误差最小的参数来进行拟合。
但是回想之前学过的过拟合问题,仅仅因为这个假设具有很小的训练误差,并不能说明它一定是一个好的假设。
image

对于这个简单的、特征数量偏少的例子我们可以画出假设函数然后观察。
但是对于一般的机器学习问题,特征数量是非常庞大的,此时要想画出假设函数来观察,几乎是不可能的事情。

那么就要引入一套评价假设函数的标准方法
假设有这样一组数据:
image

为了应用评价假设的标准方法,我们需要把数据集分成两部分:
image
通常情况下会按照\(7:3\)的比例分为训练集和测试集,也就是说不再将整个数据集作为训练集,而是取其中一部分作为训练集,另一部分作为测试集。这样要求数据是随机排列的,如果数据不是随机排列的,就需要将数据打乱。

在线性回归中,训练/测试的步骤为:

  1. 从训练集中学习得到参数\(\theta\)
  2. 将这个参数\(\theta\)用于在测试集的样本中计算平方误差。
    image

在逻辑回归中,做的其实和线性回归极其类似,只不过代价函数换为了逻辑回归的代价函数。
在逻辑回归中还有另一种错误度量,称为0/1误分类错误:

  1. 可以这样定义一次预测的误差
    image
    \(err(h_\theta(x),y)=1\)表示分类错误,\(err(h_\theta(x),y)=0\)表示分类正确。
  2. 然后就能定义测试误差:
    \(test\quad{error}=\frac{1}{m_{test}} \sum_{i=1}^{m_{test}}err(h_\theta(x^{(i)}_{test}),y^{(i)}_{test})\)

模型选择问题

解决这个问题,我们需要研究如何将数据集分为三部分:训练集、验证集、测试集。
考虑这样的一个例子:
我们现在需要找到最佳拟合数据的多项式次数(从1次到10次)
image
这类似于在算法中加入一个参数d,表示应该选择的多项式次数,d=1,2,3,4,...,10.
更具体地说就是要找出对于新样本泛化能力最强的那个多项式。
首先我们需要对每个多项式求出训练集上各自的参数\(\theta\)(也就是用训练集代价函数最小化,也即用训练集均方误差最小化)。(\(\theta^{(1)},\theta^{(2)},...,\theta^{(10)}\)

然后用各自的参数求出在测试集上面各自的均方误差值,取使均方误差最小的那个参数d,那么就得到了在测试集上拟合最好的模型。

这样做,由于使用的是测试集去求出参数d,所以从数学上来说,并不能做到对新样本的泛化。

那么就需要引入新的概念,验证集
我们将一组数据分为三部分:训练集、验证集、测试集。
image
一种典型的划分比例是\(6:2:2\)
\(m_{cv}\)表示交叉验证集(cross validation set)样本总数。
\(m_{test}\)表示测试集样本总数。

据此定义出三个集的均方误差:
image
在这里,\(J_{train}(\theta)\)和之前一直使用的\(J(\theta)\)是一模一样的东西。

现在再进行选择:
image
首先我们需要对每个多项式求出训练集上各自的参数\(\theta\)
然后用参数\(\theta\)交叉验证集中去求出使得\(J_{cv}(\theta)\)最小的那个模型。
此时可以用测试集去验证该模型的泛化能力。
这样求出来的模型,经过实践证明,是具有较好泛化能力的。

偏差与方差

沿用之前定义的训练误差和交叉验证误差:
image
画一个坐标系,横轴是多项式的次数,纵轴是误差量:
image

在其中作出训练误差的图像,通过前面的例子很容易知道,多项式次数较低时,误差往往偏高,而多项式次数较高时,误差往往偏低:
image

然后作出交叉验证误差的图像,多项式次数较低的时候,交叉验证误差会较大,多项式次数中等的时候,误差会较小。
需要注意的是,如果多项式次数较大,由于交叉验证集的样本数量偏少(和训练集的不一样多,所以曲线不同),所以会出现过拟合,那么交叉验证误差又会变大。
image

那么所谓的偏差(bias)指的是,训练误差较大,交叉验证误差和训练误差近似的情况。
方差(variance)指的是,训练误差较小,而交叉验证误差远大于训练误差的情况。
image

引入正则化的影响

以线性回归的正则化为例子。
image

回顾之前所学,对正则化参数\(\lambda\)的大小进行讨论。

  1. \(\lambda\)很大时,为了最小化代价函数\(J(\theta)\),就会使参数\(\theta_j\)变得很小,此时假设函数\(h_\theta(x)≈\theta_0\),就会出现高偏差(欠拟合)的情况
    image
  2. \(\lambda\)很小时,比如\(\lambda=0\),此时相当于没有正则化项,或者说可以忽略正则化项。那么就会出现高方差(过拟合)的情况。
    image

因此只有取适中的\(\lambda\)值,才能拟合出比较适合的模型。

首先定义出模型假设函数,代价函数。
以及训练集、验证集、测试集各自的均方误差。
(在先前所学中,没有引入正则化之前,训练集的均方误差和代价函数是等价的,但是引入正则化之后,两者就不一样了)
image
为了选择出最佳的\(\lambda\)值,我们会尝试一系列不同的取值。
以下列取值为例(当然也可以取其他值,一般来说会从\(\lambda=0\)开始取值):
image
将不同的\(\lambda\)代入代价函数中,求出不同\(\lambda\)对应的\(\theta\)

然后用交叉验证集来评价,也即测出每一个参数\(\theta\)在交叉验证集上的均方误差,选择均方误差最小的那个,就可以得出最佳的参数\(\lambda\)以及参数\(\theta\)
最后可以将\(\theta\)放进测试集中,观察在测试集上的表现。
用不同的组样本去做不同的事情,才可以得到对新样本具有较强泛化能力的模型。

引入正则化后再回过来考虑在坐标系中表示训练误差和验证误差。
\(\lambda\)很小时,是高方差(过拟合)。
\(\lambda\)很大时,是高偏差(欠拟合)。
那么容易作图:
image

粉红色的是验证误差,蓝色的是训练误差。
真实情况下的曲线会比这个曲线凌乱得多得多。

学习曲线(learning curves)

学习曲线是通过训练集大小变化,反映模型在训练集和验证集上误差大小变化的曲线。
学习曲线用于判断模型是否处在欠拟合(高偏差)或过拟合(高方差)状态。

首先定义训练误差和验证误差(假设不使用正则化):
image

正常情况下的学习曲线

考虑这样一个模型\(h_\theta(x)=\theta_0+\theta_1{x}+\theta_2{x^2}\)

当样本只有1个时,很容易完美拟合。此时误差为0
image

随着样本数量的增多,拟合难度会逐渐提高。训练误差也会随之提高。
image

那么容易画出训练误差的学习曲线:
image

对于验证误差而言,它体现的是模型对新样本的泛化能力强弱,验证误差越低,那么泛化能力越强。
那么在样本过少的情况下,训练出的模型,将不会有较好的泛化能力,因此验证误差会较大。
容易作出验证误差的学习曲线:
image

欠拟合(高偏差)下的学习曲线

考虑这样一个例子:
image
可以看出模型的函数并不会发生太大变化仍然是一条或者近似一条直线。
但是由于样本数量的增多,或多或少会有些样本正好落在线上,因此随着样本数量的增多,误差会在一定程度上减小。
需要注意的是,由于模型的函数并不会发生太大变化,永远都会是一条直线,而一条直线是无法很好拟合此例中的样本的,所以样本数量继续增加,并不会使误差持续下降。
那么容易得出学习曲线图:
image
在欠拟合(高偏差)的情况下,当样本多到一定程度后,训练误差会接近验证误差,此后样本数量不会再对误差产生明显影响。

过拟合(高方差)下的学习曲线

考虑这样一个例子:
image
同样的,随着样本数量增多,拟合难度会逐渐上升,但是总的来说,因为曲线相对来说更加扭来扭去,训练误差也不会过于离谱地大。

在高方差情况下,由于假设函数对样本过拟合,因此验证误差会一直都比较大。
容易作出学习曲线图:
image
此种情形下,验证误差和训练误差之间会有较大的差距。
随着样本数量的增多,训练误差会持续增大,验证误差会持续减小,那么两条曲线会越靠越近。
因此,如果处在这样的情况下,通过增加样本数量,是有可能改善过拟合(高方差)的。

posted @ 2021-06-09 11:09  mmmhongyu  阅读(271)  评论(0)    收藏  举报