前言
1.决定下一步要做什么(Deciding What to Try Next)
2.评估假设(Evaluating a Hypothesis)
3.模型选择和交叉验证集(Model Selection and Train_Validation)
4.诊断偏差和方差(Diagnosing Bias vs. Variance)
5.正则化和偏差/方差(Regularization and Bias_Variance)
6.学习曲线(Learning Curves)
7.决定下一步做什么(Deciding What to Do Next Revisited)
应用机器学习的建议
(一)决定下一步要做什么(Deciding What to Try Next)
之前我们学习过许多机器学习的算法了,也在具体的问题中实现了这些算法。但是,如果我们在解决实际问题的时候,发现我们的模型预测和实际结果有很大的误差,我们想改进这个算法,我们应该怎么做 ?具体的我们有以下方法:
-
获得更多的训练样本(通常是有效的,但代价较大,可考虑先采用下面的几种方法)
-
尝试减少特征的数量
-
尝试获得更多的特征
-
尝试增加多项式特征
-
尝试减少正则化程度 λ \lambda λ
-
尝试增加正则化程度 λ \lambda λ
虽然有以上方法,但我们不能凭感觉随机地选择一种,因为它可能耗费我们几个月的时间而看不到任何效果。我们运用“机器学习诊断法”来判断我们的模型有什么问题,从而选择相应的解决方法。第一步就是判断我的模型到底是好还是不好,也就是评估假设。
(二)评估假设(Evaluating a Hypothesis)
之前我们对假设的评估主要依靠代价函数,代价函数越小,训练的误差也就越小,我们认为假设拟合数据拟合的越好。但这不是完全正确的,因为我们知道存在过拟合现象,过拟合会导致误差很小,但是模型的泛化能力很差,对于新数据的预测往往误差很大。那我们怎样判断模型是否存在过拟合现象呢?最简单的办法就是对假设函数
h
(
x
)
h(x)
h(x)进行画图。如图:
很明显,该假设存在过拟合现象。可见,画图在特征数量很少时确实可行,但是,当我们的特征数量很大时,画图就没那么容易了。因此,我们需要另一种方法来评估我们的假设函数。我们将数据分成训练集train和测试集test,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。为了保证数据的随机性,我们一般会对数据进行“洗牌”,然后再分成训练集和测试集。
我们用训练集进行参数优化,拟合出
θ
\theta
θ的值,然后将
θ
\theta
θ的值代入到代价函数中,对测试集中的数据求取误差,我们有两种方式计算误差:
- 对于线性回归模型,我们直接利用测试集数据计算代价函数 J J J
- 对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:
J t e s t ( θ ) = − 1 m t e s t ∑ i = 1 m t e s t ( y ( i ) t e s t ) log h θ ( x ( i ) t e s t ) + ( 1 − y ( i ) t e s t ) log h θ ( x t e s t ( i ) ) J_{test}{(\theta)} = -\frac{1}{{m}_{test}}\sum\limits_{i=1}^{m_{test}}({y^{(i)}{test}})\log{h_{\theta}(x^{(i)}{test})}+(1-{y^{(i)}{test}})\log{h_{\theta}(x^{(i)}_{test})} Jtest(θ)=−mtest1i=1∑mtest(y(i)test)loghθ(x(i)test)+(1−y(i)test)loghθ(xtest(i))
还可以利用误分类率,对于每一个测试集样本,计算:
然后求取平均值。如果存在过拟合,那么训练集的代价函数的值会很小,测试集的误差则会很大。
(三)模型选择和交叉验证集(Model Selection and Train_Validation)
模型选择也是我们很关心的一个问题,最主要的就是确定特征的最高阶次,例如:
越高次数的多项式模型肯定是越能适应我们的训练集数据,但不代表可以推广到更一般的情况,所以我们需要衡量到底哪种才是最好的。如何选择呢?很简单,一一实现一遍。我们把以上10个假设全部实现一遍,选择效果最好的作为最终的假设。由于我们多了确定最高次数这一步,所以我们需要对数据集进行进一步地划分:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集。具体的实现过程是这样的:
-
使用训练集训练出10个模型,得到每个模型的最优参数 θ \theta θ
-
用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值),选取代价函数值最小的模型,也就是确定好了模型
-
用选出的模型对测试集计算得出推广误差(代价函数的值),也就是前面说的对该假设进行评估
训练集的误差公式(得到 θ \theta θ):
J t r a i n ( θ ) = 1 2 m ∑ i = 1 m t r a i n ( h θ ( x t r a i n ( i ) ) − y t r a i n ( i ) ) 2 J_{train}(\theta)=\frac{1}{2m}\sum\limits_{i=1}^{m_{train}}(h_{\theta}(x^{(i)}_{train})-y^{(i)}_{train})^2 Jtrain(θ)=2m1i=1∑mtrain(hθ(xtrain(i))−ytrain(i))2
交叉验证集误差(选中模型):
J c v ( θ ) = 1 2 m c v ∑ i = 1 m c v ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2 J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum\limits_{i=1}^{m_{cv}}(h_{\theta}(x^{(i)}_{cv})-y^{(i)}_{cv})^2 Jcv(θ)=2mcv1i=1∑mcv(hθ(xcv(i))−ycv(i))2
测试集误差(评估假设):
J t e s t ( θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h θ ( x t e s t ( i ) ) − y t e s t ( i ) ) 2 J_{test}(\theta) = \frac{1}{2m_{test}}\sum\limits_{i=1}^{m_{test}}(h_{\theta}(x^{(i)}_{test})-y^{(i)}_{test})^2 Jtest(θ)=2mtest1i=1∑mtest(hθ(xtest(i))−ytest(i))2
(四)诊断偏差和方差(Diagnosing Bias vs. Variance)
当我们运行一个学习算法的时候,结果可能并不理想,多半是由于欠拟合和过拟合现象,它们所对应的分别是偏差较大和方差较大的问题。当运行结果不理想的时候,能够确定算法是偏差还是方差的问题是很重要的。如我们很熟悉的下图,第一个是欠拟合,对应高偏差;第三个是过拟合,对应高方差。
我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析。我们知道,当假设函数的多项式的次数越高时,拟合的效果会越好,但同时会带来过拟合的问题,也就是算法的泛化能力很差,在交叉验证集上的误差往往较大。所以,我们建立一个图像,以多项式的次数为横轴,以代价函数的误差为纵轴。考虑训练集上的误差,由于次数越高,拟合效果越好,所以随着次数的增加,训练集上的误差会越来越小;考虑交叉验证集上的误差,在一开始次数增加的时候,假设函数由欠拟合逐渐改善,拟合越来越好,误差也自然降低,但是,随着次数的继续增加,过拟合现象产生,泛化能力的减弱导致误差会逐渐增大。而且,由于训练集是用来最优化参数的,所以其误差肯定是小于交叉验证集误差的,所以图像相对在下。总结起来可以用下图表示:
所以,我们在判断是高偏差还是高方差的时候,用图像就可以很容易判断。当训练集误差和交叉验证集误差都很大而且相近的时候,就是高偏差;当训练集误差很小,而交叉验证集误差很大时,就是高方差。可以总结成下图,当训练集和交叉验证集的误差都较小时,对应的次数就是我们想要的。
(五)正则化和偏差/方差(Regularization and Bias_Variance)
上面我们讲了偏差和方差的问题,也就是欠拟合和过拟合的问题,我们可以通过正则化的方法来防止过拟合的发生。回顾一下正则化的公式:
和上面选择多项式的次数一样,正则化系数的选择也很重要,当
λ
\lambda
λ 的值太小,接近0的时候,相当于没有正则化,那么可能会导致过拟合,也就是高方差的问题;当
λ
\lambda
λ 的值太大,那么对每个模型参数的惩罚力度也就会很大,会导致所有的参数都会变得很小,接近0,那么拟合出来的就是一条横线,大小就是
θ
0
\theta_{0}
θ0,这就导致了欠拟合,也就是高偏差的问题。归纳为下图:
那么我们如何选择
λ
\lambda
λ呢?首先,我们列出一系列的待选用的
λ
\lambda
λ的值,比如0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5,12,10共12个;然后我们在训练集上对每个不同
λ
\lambda
λ所对应的代价函数进行优化,得到12个不同正则化程度的模型;我们在交叉验证集上运行每个模型,得到误差最小的那个作为我们最终的模型;最后,用我们选择的模型在测试集上计算推广误差。
借鉴选择多项式次数的方法,我们也可以同时将训练集和交叉验证集模型的代价函数误差与
λ
\lambda
λ的值绘制在一张图表上。随着
λ
\lambda
λ值的不断增大,模型参数的值会越来越接近0,发生欠拟合线性,导致训练集的误差会越来越大;对于交叉验证集的误差,一开始,随着
λ
\lambda
λ的增大,正则化现象得到改善,模型的泛化能力得到提高,所以误差会逐渐减少,当
λ
\lambda
λ增大到某一值的时候,欠拟合现象会导致误差又逐渐增大,总结起来可以用下图表示,中间的
λ
\lambda
λ的值就是我们需要的。
(六)学习曲线(Learning Curves)
学习曲线就是将训练集误差和交叉验证集误差作为训练集样本数量(
m
m
m)的函数绘制的图表。也就是随着样本数的增加,观察训练集和交叉验证集的误差的变化。
通过下面这个例子大致感受下学习曲线的含义。
假设我们用一个二次多项式拟合我们的数据,我们会发现最开始只有一两个样本的时候二次曲线拟合效果非常好,可以说没有误差,当样本量逐渐增加的时候,训练集的误差也会随之慢慢增加。对于交叉验证集,当只有一两个样本的时候,虽然拟合的曲线对于训练集来说很好,但是由于样本量太少,拟合的曲线泛化能力太差,交叉验证集的误差会很大,随着样本量的增加,这一现象会得到改善,误差也会逐渐减少。可以用下图总结:
进一步地,我们利用学习曲线识别高偏差和高方差问题。
- 首先是高偏差,也就是欠拟合问题。假设我们用一条直线拟合数据,不论样本量怎么增加,我们都是用直线拟合,我们会发现无论样本量怎么增加,最后训练集的误差都不会有太大的改善,也就是对于高偏差问题,增加样本量不一定有帮助。
画出的学习曲线如下,随着样本量的增加,训练集和交叉验证集的误差逐渐接近,最后趋于一个稳定值不会有太大的变化。
- 然后是高方差,也就是过拟合现象。假设我们用100次的多项式拟合数据,拟合效果会很好,随着样本量的增加,训练集的误差会缓缓增加,而交叉验证集的误差会缓缓下降。
学习曲线如下,训练集和交叉验证集的误差之间保持较大的差距,随着样本数的增加,两条曲线的差距会逐渐减小,训练集的误差会增大,而交叉验证集的误差会减小,所以增大样本数量对于高方差现象是有用的。
(七)决定下一步做什么(Deciding What to Do Next Revisited)
在最开始,我们给出了一些解决运行学习算法时出现问题的解决方法,我们没有指出每个方法对应能够解决的问题,通过上面的分析,我们对每个方法的解决对象有了认识,总结起来如下:
-
获得更多的训练样本——解决高方差
-
尝试减少特征的数量——解决高方差
-
尝试获得更多的特征——解决高偏差
-
尝试增加多项式特征——解决高偏差
-
尝试减少正则化程度λ——解决高偏差
-
尝试增加正则化程度λ——解决高方差
进一步地,我们了解一下神经网络的方差和偏差。使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合问题,但计算使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合问题。但是,往往较大的神经网络有更强的能力,所以通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。