咱们以前已经学习过一些机器学习的算法,如今咱们来谈谈如何评估算法学习获得的假设。当发现预测的结果和实际的数据有偏差的时候,咱们须要进行一些调整来保证预测的准确性,大部分状况下,有如下几种办法来调整假设函数:算法
假设函数相对于训练集可能获得的偏差很小,好比在过拟合的状况下,这时候就不能确定假设函数是准确的。所以,咱们有时候将数据集分红两块:训练集和测试集,通常来讲训练集占70%,测试集30%。定义训练集的偏差为$J_{train}(\Theta)$,测试集为$J_{test}(\Theta)$。这样,咱们要作的就是:经过训练集训练来最小化$J_{train}(\Theta)$和计算测试集$J_{test}(\Theta)$的偏差。
对于线性回归:网络
$$ J_{test}(\Theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\Theta(x_{test}^(i)))^2 $$app
对于分类问题:
当$h_\Theta(x)>=0.5且y=0$或$h_\Theta(x)<0.5且y=1$ 时,$err(h_\Theta(x),y) = 1$;不然,$err(h_\Theta(x),y) = 0$。
他们对于测试集的平均偏差为:机器学习
$$ Test Error = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}err(h_\Theta(x_{test}^(i)),y_{test}^(i)) $$函数
这个给与咱们测试集中错误分类的比例。学习
因为学习算法可能对于训练集的数据相对很吻合,但不表明这是一个好的假设,以前说过了,这多是过拟合的状况,从而致使预测的结果在测试集中的表现会不尽如人意。从当前数据集训练出的假设函数的偏差是会比其余数据集要小的。
提供多个不一样级数的多项式模型时,咱们可使用系统的方法来鉴别是不是最好的函数。为了选择最佳的假设,能够对于每个不一样的级数的多项式进行计算,得出他们的偏差,从而比较出哪个才是最合适的。
上文中咱们将数据集分红了训练集和测试集两部分,实际状况中常常会分为三部分,其中60%为训练集,20%为交叉验证集,20%为测试集。咱们能够分别计算这三部分的偏差,测试
接下来:优化
当运行一个学习算法时,若这个算法的结果不理想,多半是出现两种状况:要么是误差比较大(high bias),要么是方差比较大(high variance)。换句话说,要么是欠拟合问题要么是过拟合问题。
即高误差致使欠拟合,高方差致使过拟合。理想状况下,咱们要在这二者之间找到最佳的平均值。
当增长多项式的级数d时,训练集的偏差将会减少。同时当增长级数d到达某个点时,交叉验证偏差会渐渐的减少,而后其会伴随着d的增长而增长,图像为一个凸曲线。以下图:spa
总的来讲:code
在以前的课程中已经学习过经过正则化来解决过拟合问题,如今再来谈谈正则化和误差方差之间的关系。
在上图中,当$\lambda$很大,对于$\theta1$,$\theta1$..的惩罚都很大,则假设函数将会等于或近似于$\theta_0$,最终获得的假设函数就是一条直线,所以这个假设对于数据严重欠拟合。另外一个状况当$\lambda$很小时,趋向于0,那么正则化项趋向于0,获得的假设函数则会出现过拟合的状况。只有当咱们取一个比较合适的$\lambda$时,咱们才能获得对数据拟合比较合理的$\theta$的值。
那么如何选择合适的模型和合适的正则化参数$\lambda$呢,具体有以下几个步骤:
1. Create a list of lambdas (i.e. λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24}); 2. Create a set of models with different degrees or any other variants. 3. Iterate through the λs and for each λ go through all the models to learn some \ThetaΘ. 4. Compute the cross validation error using the learned Θ (computed with λ) on the J_CV (Θ) without regularization or λ = 0. 5. Select the best combo that produces the lowest error on the cross validation set.
Using the best combo Θ and λ, apply it on J_test (Θ) to see if it has a good generalization of the problem.
将$\lambda$的取值和$J(\theta)$的曲线画出来以下所示:
$J_{train}(\theta)$随着$\lambda$值的增长而增长,由于$\lambda$的值增大会对应着高误差问题,此时连训练集都不能很好的拟合,当$\lambda$很小时,对应着你能够很容易地用高次多项式拟合你的数据。对于交叉验证的偏差,如图中粉色的图像所示,当$\lambda$很大时,会出现欠拟合问题,所以是那一片是高误差区域,此时交叉验证集的偏差会很大,当$\lambda$很小时,会出现过拟合问题,对应的是高方差问题,所以交叉验证集的偏差也会很大。一样的,总会有中间的某个点对应的$\lambda$表现的结果正好合适,交叉验证偏差和测试偏差都很小。
当训练集很小的状况下,好比只有两三条数据的时候,咱们很容易训练一个二次的算法来拟合数据,而且算法的偏差可能几乎为0,所以,
具体变化以下图所示:
随着训练集的增长,交叉验证集的偏差将会慢慢减少知道趋向于某一个值,由于拟合数据越多,就越能拟合出合适的假设。
那么若是出现了高误差的状况,学习曲线会变成什么样子:
若训练集量比较小,那么拟合效果固然很差,致使交叉验证集的偏差会很大,那么随着训练集的增长,拟合效果渐渐的变好了,交叉验证集的偏差也会渐渐变小,当训练集增大到某一个量时,咱们可能就会找到一条最有可能拟合数据的直线,而且此时即使继续增长训练集的样本容量,仍是会获得一条差很少的结果。那么对于训练偏差,一开始也是很小的,但在高误差的状况下,训练集的偏差会逐渐增大直到最后接近交叉验证偏差,这是由于你的参数很小,但又有不少数据,当m很大时,训练集和交叉验证集的偏差将会很是接近。总的来讲能得出一个结论,若是一个算法有高误差,那么选用更多的训练集数据并不能很好的改善算法。
对于高方差的状况,以下图:
一开始训练集的偏差是很小的,但随着训练集容量的增长,偏差会渐渐变大,也就是说数据越多,就越难将训练集数据拟合的很好,但总的来讲,训练集的偏差仍是很小。那么对于交叉验证集,因为是高方差的状况,偏差会一直都很大,虽然也会慢慢减少,但在训练偏差和交叉验证偏差之间依然有一段很大的差距。总的来讲得出的结论就是,若是咱们考虑增长训练集样本的容量,对于改善算法仍是有必定的帮助的,由于很显然交叉验证偏差再慢慢减少,那么测试集的偏差也会慢慢减少,固然一样这个也能告诉咱们这个算法可能存在高方差的问题。
上文中一开始咱们有说过几种不一样的方法来改善假设函数,但每每有些人只是凭借本身的感受来决定使用哪一种方法,那么经过本文介绍的一些知识,咱们能够得出,这几种方法分别对应于解决什么问题:
那么这里再补充一下对于神经网络的诊断:
总的来讲,模型的复杂程度的影响有如下几点:
以上,为吴恩达机器学习第六周Advice for Applying Machine Learning部分的笔记。