提示:本文是基于吴恩达老师机器学习视频总结:
一、下一步做什么
假设我们已经实现了一个机器学习系统,但是他的预测表现并不是太好。那么我们就需要想办法去改进我们的机器学习系统,下面是我们通常会想到的一些办法:
1、获取更多的训练集
2、减少特征的数量(防止过拟合)
3、增加特征的数量
4、增加更多高阶多项式特征(x12,x22,x1x2等等)
5、尝试增大lamda
6、尝试减小lamda
但是大部分人对于上面方法的选择都是靠感觉来选择的,因此很可能一开始选择努力的方向就是错误的。
在接下来的小节中,我们会讨论机器学习模型的诊断方法。
。
二、评估假设
当我们确定学习算法的参数时,我们考虑的是选择参数使得训练误差最小化。
如上图中,我们很明显看到它是过拟合的。但是如果特征数很多的话,可视化的方法是不太方便的。
下面介绍一个评估假设的标准方法:将数据集划分成训练集和测试集。通常我们会使用70%的数据集作为训练集,30%的数据集作为测试集。当然,我们不一定要按照顺序选择训练集和测试集,随机选取70%的数据作为训练集和30%的数据作为测试集显然是一个更好的办法。如下图所示:
以线性回归为例,评估的步骤主要如下图所示:
1、通过训练集学习模型的参数(最小化训练集的代价函数J(θ))
2、计算测试集的代价函数
对于逻辑回归而言,其实原理也是一样的,主要步骤如下:
1、通过训练集学习模型的参数(最小化训练集的代价函数J(θ))
2、计算测试集的代价函数
另外一种评价测试集错误的方法就是计算测试集中的错误率,具体定义如下
三、模型选择问题和训练、验证及测试集
对于一些模型而言,有时候即使在训练集中表现良好,但是对于训练集之外的数据也并不一定具有很好的泛化能力。
那么,我们如何最好地去拟合数据的多项式次数,具体步骤如下图所示:
代码如下(示例):
步骤总结具体如下:
1、定义不同的多项式函数(d=1、d=2、…、d=10)
2、通过训练集最小化每个模型的代价函数,得到θ(i)。
3、分别选取每一种假设和它相应的参数θ(i),然后计算出它在测试集上的性能(计算Jtest(θ(i)))
4、选择拥有最小的Jtest(θ)的模型
从上面的步骤中,我们通过测试集选出了最优的模型。但是我们不能又使用测试集去验证模型的泛化能力,因此这里必须引入交叉验证集的概念
因此,我们需要将数据集划分成三个部分:训练集(60%)、交叉验证集(20%)、测试集(20%)。
我们可以对训练集、交叉验证集、测试集分别定义误差,如下图所示:
最后,我们尝试用训练集得到各个模型的最优参数集、使用交叉验证集选取模型,最后用测试集计算误差,如下图所示:
我们需要注意的是:
1、定义不同的多项式函数(d=1、d=2、…、d=10)
2、通过训练集最小化每个模型的代价函数,得到θ(i)。
3、分别选取每一种假设和它相应的参数θ(i),然后计算出它在交叉验证集上的性能(计算Jcv(θ(i)))
4、选择拥有最小的Jcv(θ)的模型
5、将选择的模型应用在测试集中测试模型的泛化能力
四、诊断偏差与方差
模型不理想的时候,通常也就是分为两种情况:偏差问题(欠拟合问题)和方差问题(过拟合问题)。如下图所示:
下面通过几幅图进一步了解偏差和方差的概念。
对于上图,我们需要注意以下几个点:
1、首先看粉色的线,代表训练集的误差。随着多项式d的增大,拟合效果会越来越好,因此Jtrain(θ)会不断减小。
2、再看橙色的线,代表交叉验证集的误差。刚开始的时候,由于多项式d较小,模型拟合效果较差,因此Jcv(θ)也比较大。但是随着多项式d的不断增大,Jcv(θ)会不断减小。但是当多项式d继续增大,会出现训练集的过拟合现象,从而造成Jcv(θ)重新变大。
那么,我们如何区分我们的模型是高偏差还是高方差呢,如下图所示:
在上图中我们需要注意以下两点方面:
1、高偏差的模型(欠拟合),通常会表现为Jtrain(θ)比较高,且Jcv(θ)≈Jtrain(θ)。
2、高方差的模型(过拟合),通常会表现为Jtrain(θ)比较低,且且Jcv(θ) >> Jtrain(θ)。
五、正则化、偏差、方差
本节要讨论的是正则化项是如何影响偏差和方差的。
正则化项对于模型的影响主要如下图所示:
对于上图,我们需要注意以下几点:
1、对于第一张图,λ特别大,导致各个参数被惩罚地很严重,hθ(x)相当于一条直线,这时就是一个高偏差的现象。
2、对于第二张图,选择了合适的lamda,因此模型拟合程度较好
3、对于第三张图,λ特别小,对各个参数几乎没有惩罚,出现了过拟合现象,也就是一个高方差的现象。
那么如何选择一个比较适合的lamda呢?
首先要分别定义好训练集、交叉验证集和测试集的代价函数,如下图所示:
需要注意的是,对于训练集,我们为了获得更好的假设函数,所以在代价函数中需要加入正则化项。但是对于交叉验证集和测试集的代价函数,则不需要加入正则化项。
对于lamda具体如何选择,如下图所示:
具体步骤如下:
1、根据不同的lamda分别计算Jtrain(θ),得到最优的θ(i)
2、根据交叉验证集,计算每一种模型的Jcv(θ),选出表现最好的模型
3、对于第二步选择的模型,利用测试集测试模型的泛化能力。
接下来我们通过可视化的方法来看下λ对于高偏差和高方差的影响。如下图所示:
从上图中,我们需要注意以下几个方面:
1、蓝色曲线代表训练集的误差,当lamda比较小的时候会出现过拟合现象,因此error也比较小。当lamda逐渐增大后,会出现欠拟合现象,因此error也会逐渐上升。
2、粉红色曲线代表交叉验证集的误差。当lamda比较小,出现过拟合的时候,error比较大。当lamda比较大,出现欠拟合的时候,error同样会比较大。
六、学习曲线
我们通常会利用学习曲线去判断一个算法是否处于偏差、方差问题,或者是二者皆有。
对于学习曲线,我们会采用训练样本逐渐增多的方法来进行可视化,如下图所示:
对于上图,我们需要注意以下几个方面:
1、蓝色曲线代表训练集误差Jtrain(θ),我们会发现当样本比较少的时候,拟合效果也比较好,误差也比较小。但是随着样本增多,拟合效果就没有那么好了,误差也就会逐渐增大。
2、粉红色曲线代表交叉验证集误差Jcv(θ),我们会发现,当数据量比较小的时候,模型的假设不是很好,因此验证集误差比较大。但是随着数据量增大,模型的假设会变得更好,因此验证集误差会逐渐减小。
对于高偏差的模型,它的学习曲线通常会如下图所示:
对于上图,我们需要注意以下几个方面:
1、首先对于右边的两幅小图,我们可以看到假设的是一元函数,随着数据量的增大,其实还是一个一元函数,拟合效果并不是很好
2、对于左边的图,粉红色曲线代表训练集误差,可以看到随着样本数量的增大,训练集误差也会逐渐增大
3、对于左边的图,蓝色曲线代表交叉验证集误差,可以看到随着样本数量的增大,交叉验证集的误差会逐渐下降,但是很快就会趋于平缓
4、我们从上图中,可以观察到,当模型出现高偏差的时候,随着样本数量的增大,训练集误差会逐渐增大,交叉验证集误差会逐渐下降。但是最后两者会比较接近。
5、通过上图,我们可以知道当模型出现高偏差的时候,增大数据量对于模型的改进意义不大,因为误差是比较大的。
对于高方差的模型,它的学习曲线通常会如下图所示:
对于上图,我们需要注意以下几个方面:
1、首先对于右边的两幅小图,我们可以看到假设的是一个十分复杂的多项式函数,容易出现过拟合现象
2、对于左边的图,蓝色曲线代表训练集误差,可以看到随着样本数量的增大,训练集误差也会逐渐增大,但是仍然处于一个比较低的水平
3、对于左边的图,粉红色曲线代表交叉验证集误差,可以看到随着样本数量的增大,交叉验证集的误差会逐渐下降
4、我们从上图中,可以观察到,当模型出现高方差的时候,随着样本数量的增大,训练集误差会逐渐增大,但是并不会太大。交叉验证集误差会逐渐下降。
5、通过上图,我们可以知道当模型出现高方差的时候,增大数据量是存在一定的意义的,可以在这方面尝试努力
6、特别注意上面的绘图中,训练集的误差是0~ size的误差,而交叉验证集的误差是整个的误差,而不是 0~ size的交叉验证集误差。
七、决定接下来做什么
对于第一小节提到的模型改进方法,分别进行总结不同适用的情况。
1.尝试更多的训练集——适用于模型处于高方差的状态
2.尝试减少特征的数量——适用于模型处于高方差的状态。但是如果发现模型是处于高偏差的状态,切记不要浪费时间在试图从已有的特征中挑出一小部分来使用,因为你已经有高偏差的问题了,使用更少特征也无济于事。反过来,如果你发现模型处于高方差的状态,从中挑选出一部分合适的特征则是正确的选择。
3.尝试增加特征的数量——适用于模型处于高偏差的状态。
4.尝试增加多项式特征——适用于模型处于高偏差的状态。
5.尝试减小λ——适用于模型处于高偏差的状态。
6.尝试增大λ——适用于模型处于高方差的状态。
最后介绍一下神经网络模型的修正方法,如下图所示:
对于上图,我们需要注意以下几点:
1、小型神经网络计算量比较小,但是容易出现欠拟合现象
2、大型神经网络拟合效果会比较好,但是计算量比较大,容易出现过拟合现象
3、通常会选择较大型的神经网络,因为即使出现过拟合现象,也可以使用正则化的方式进行修正。