假如你在开发一个机器学习系统,或者想试着改进一个机器学习系统的性能,你应如何决定接下来应该选择哪条道路?
减小假设函数误差
仍然使用预测房价的学习例子,假如你已经完成了正则化线性回归,也就是最小化代价函数J的值,假如,在你得到你的学习参数以后,如果你要将你的假设函数放到一组新的房屋样本上进行测试,假如说你发现在预测房价时产生了巨大的误差,现在你的问题是要想改进这个算法,接下来应该怎么办?
实际上你可以想出很多种方法来改进这个算法的性能,其中一种办法是使用更多的训练样本。但有时候获得更多的训练数据实际上并没有作用,避免把过多的时间浪费在收集更多的训练数据上。
还有一种办法是尝试选用更少的特征值,如果有一系列特征值,可以从这些特征去掉一小类来防止过拟合。
我们也可以尝试增加多项式特征的方法,比如𝑥1的平方,𝑥2的平方,𝑥1, 𝑥2的乘积,我们可以花很多时间来考虑这一方法,我们也可以考虑其他方法:减小或增大正则化参数𝜆的值。
我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的,这是一种测试方法,通过执行这种测试,能够深入了解某种算法到底是否有用。这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试,才是有意义的。
评估算法得到的假设函数
判断拟合情况
将所有数据随机分成训练集和测试集,一般比例为7:3。
测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:
1.对于线性回归模型,我们利用测试集数据计算代价函数𝐽
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:
除了代价函数,还有另外一种测试度量:错误分类也叫做0/1分类错误,0/1表示了你预测的分类是正确还是错误。即计算误分类的比率。
,然后对计算结果求平均。
模型选择和交叉验证集
对于一个数据集最适合的多项式次数,怎样选择正确的特征项来构造学习算法;或者选择学习算法中的正则化参数𝜆;这类问题被叫做模型选择问题,这类问题需要讨论的不仅是把数据分为训练集和测试集,而是把数据分为三个数据组:训练集、验证集、测试集。
训练集误差不能用来判断该假设对新样本的拟合好坏,具体来说如果用这些参数𝜃1、𝜃2、𝜃3…来拟合训练集,就算假设函数在训练集上表现很好,也不意味着该假设对训练集中没有的新样本有很好的泛化能力。
如果你的参数对某个数据集拟合的很好,比如训练集或者其他数据集,那么用同一数据集计算得到的误差,并不能很好的估计实际的泛化误差。
模型选择
假设我们要在 10 个不同次数的二项式模型之间进行选择:
显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。
使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试集。
定义**训练误差、交叉验证误差、测试误差 **:
选择一个模型,然后最小化代价函数,得到对应模型的一个参数向量𝜃,依次得到所有模型的参数向量。
模型选择的方法
- 使用训练集训练出所有模型
- 用所有模型分别对交叉验证集计算得出交叉验证误差 ps:在选择模型时,我们使用交叉验证集来选择,而不是测试集。
- 选取交叉验证误差值最小的模型
- 用步骤 3 中选出的模型对测试集计算得出测试误差
诊断偏差和方差
当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。
判断
我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:
训练集的代价函数误差随着多项式次数的增加而减小(过拟合问题);而交叉验证集的代价函数误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
高偏差:训练集和交叉验证集的代价函数误差都很大,也就是使用了一个过于小的多项式次数,即欠拟合。
高方差:交叉验证集的代价函数误差远大于训练集的误差,使用了一个过于大的多项式次数,即过拟合。
正则化和偏差/方差
正则化可以防止算法过拟合,但正则化跟算法的偏差和方差有怎样的关系?
在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能会正则化的程度太高或太小了,即我们在选择 λ 的值时也需要思考与选择多项式模型次数类似的问题。
- 当 𝜆 较小时,过拟合
- 当𝜆 较大时,欠拟合
如何选择合适的𝜆
我们选择一系列的想要测试的 𝜆 值,通常是 0-10 之间的呈现 2 倍关系的值(如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共 12 个)。我们同样把数据分为训练集、交叉验证集和测试集。
选择𝜆的方法为:
1.使用训练集训练出 12 个不同程度正则化的模型
2.用 12 个模型分别对交叉验证集计算的出交叉验证误差
3.选择得出交叉验证误差最小的模型
4.运用步骤 3 中选出模型对测试集计算得出测试误差
用不同的正则化参数𝜆进行拟合;然后用交叉验证集来评价,即测出每个参数𝜃在交叉验证集上的 平均的误差平方和 ;用交叉验证集来拟合参数,用测试集来验证参数对于新样本的泛化能力。
注意:这里把训练误差、交叉验证误差定义为不包括正则化项,只有误差平均平方和。𝜆太小时,可以忽略正则化项,对于J(𝜃)只用最小化平方误差。
我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ 的值绘制在一张图表上:
- 当 𝜆 较小时,可以忽略正则化项,过拟合,训练集误差较小(能很好得拟合训练集),而交叉验证集误差较大(不能很好地预测)
- 当𝜆 较大时,可以防止过拟合,但过大会欠拟合,训练集误差不断增加(不能很好地拟合训练集数据),而交叉验证集误差则是先减小后增加(有一个最佳值)
- 𝜆的最佳值取在训练集误差最小值处。
学习曲线
学习曲线用于检查学习算法运行是否正常或者改进算法表现,用来判断算法是否处于偏差、方差问题或者两者都有。
学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(𝑚)的函数绘制的图表。
思想: 当训练较少行数据(m较小)的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据;当训练较多行数据(m较大)的时候,训练的模型将不能完美地适应训练数据,但该模型却能很好地泛化表现。
那么在高偏差/方差的情况下,这些函数会怎么表现?
我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观:
所以,在高偏差的情况下,训练集误差、交叉验证集误差分别不断增加、减小,但最终两个误差会非常接近。也就是说在高偏差/欠拟合的情况下,增加数据对改善算法表现无益。
如何利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。
最明显的特征:在训练误差和交叉验证误差之间有一段很大的差距。随样本数增加,交叉验证误差曲线将会一直下降,即对改进算法是有帮助的
下一步做什么
回顾文章最开始,为了减小假设函数误差,我们有6种办法,让我们来看一看在什么情况下应该怎样选择:
- 获得更多的训练实例——解决高方差
- 尝试减少特征的数量——解决高方差
- 尝试获得更多的特征——解决高偏差
- 尝试增加多项式特征——解决高偏差
- 尝试减少正则化程度 λ——解决高偏差
- 尝试增加正则化程度 λ——解决高方差
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
总结:对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。