评估学习算法
想要降低预测误差,即提高预测精度,我们往往会采用这些手段:
-
采集更多的样本(解决高方差问题)
错误的认为样本越多越好,其实数据多并不是越好。 -
降低特征维度,减少一些特征,解决过拟合问题(解决高方差问题)
降维可能去掉了有用的特征。 -
采集更多的特征,增加一些额外的特征(解决高偏差问题)
增加了计算负担,也可能导致过拟合。 -
进行高次多项式回归,如
(解决高偏差问题)
过高的多项式可能造成过拟合。 -
调试正规化参数
,将其增大(参数
会减小,解决高方差问题)或者减少
(参数
会增加,解决高偏差问题)
增大或者减少都是凭感觉。
评价假设函数
首先我们要评估的是我们的假设函数(Hypothesis)。当我们选择特征值或者参数来使训练集误差最小化,但是我们会遇到过拟合的问题,推广到新的训练集就不再使用了。而且当特征量很多的时候,我们就不能将 可视化看出其是否随着迭代次数而下降了。所以我们采用以下的方法来评估我们的假设函数:
假设有 10 组数据,随机把 70% 做为训练集,剩下的 30% 做为测试集。训练集和测试集尽量保证是随机排列。
接下来:
- 对训练集进行学习得到参数
,也就是利用训练集最小化训练误差
- 计算出测试误差
,取出之前从训练集中学习得到的参数
放在这里,来计算测试误差。
对于线性回归:
对于逻辑回归:
逻辑回归不同于线性回归,因为它只有0和1两个值, 所以怎么判断误差如下:
这里的误差也叫误分类率,也叫 错分率。
这种情况下,假设结果更趋向于1,但是实际给出的判断却是0,或者假设结果更趋向于0,实际给出的判断却是1 。
如果以上情况都没有,那么就没有误差,即为0 ,也代表了假设值能够正确的对样本进行分类。
测试集的平均测试误差为:
模型选择和训练集/验证集/测试集
我们这里用 d 表示多项式的个数。我们可以改变多项式次数的多少来选择合适我们的模型。例如上面的 ,这个多项式
。
我们可以测试每一个模型得到他们的 ,判断哪一个模型比较好。
当选择出了一个多项式 d 能很完美的拟合测试集,接下来就不能再用测试集了,因为 d 本来就已经完美拟合测试集了,再测试就没有意义了,需要换一个测试集。所以更需要关心的对新样本的拟合效果。
为了解决上述问题,我们把数据分为 3 类,训练集 60% /交叉验证集 20% /测试集 20%。
通过三个集合,可以算出训练误差:
交叉验证误差:
测试误差:
于是我们选择模型不在仅仅通过测试集来选择了,而是:
- 利用训练集的数据代入每一个多项式模型,通过最小化训练误差
,得到相应的参数
。
- 用交叉验证集的数据,计算并找出最小交叉验证误差的多项式模型。
- 最后用测试集的数据计算出所选模型的测试误差
,用来判断所选模型的“泛化”能力。
诊断偏差和方差
在机器学习中,偏差(bias)反映了模型无法描述数据规律,而方差(variance)反映了模型对训练集过度敏感,而丢失了数据规律,高偏差和高方差都会造成新数据到来时,模型给出错误的预测。
还是以这个图为例,最左边的图是欠拟合(高偏差),最右边的图是过拟合(高方差)。
训练误差:
交叉验证误差:
上图是 训练集、交叉验证集误差随多项式次数 d 的变化规律。横坐标是我们的d,也就是多项式的个数,纵坐标就是我们的代价函数。
我们先来看一下红色曲线 ,随着多项式个数的增加,其假设函数是越来越接近要拟合的数据,所以其代价函数会随着多项式个数的增加下降。
然后绿色的曲线是 ,当多项式个数比较少的时候,那当然会出现欠拟合的现象,所以一开始其代价函数
是很大的,随着多项式个数的增加而下降,但是当其多项式个数再继续增加的话,就会出现过拟合的现象,
就又会增加。所以
函数是先递减再递增的,在其最低点就是最合适的多项式次数。
多项式回归中,如果多项式次数较高,则容易造成过拟合,此时训练误差很低,但是对于新数据的泛化能力较差,导致交叉验证集和测试集的误差都很高,此时模型出现了高方差(过拟合):
过拟合的情况下,训练集误差通常比较小,并且远小于交叉验证误差。
而当次数较低时,又易出现欠拟合的状况,此时无论是训练集,交叉验证集,还是测试集,都会有很高的误差,此时模型出现了高偏差(欠拟合):
欠拟合的情况下,训练集误差会很大。
为什么 会先降后升,而
一直下降?
原因是参数 是只针对训练集所训练出来的,当其代入到
后,就会随着多项式的增加数据偏差就会越来越大,也就是随着拟合程度的不断增加,他的模型会越来越专门适用于训练集,他的泛化能力会逐步的降低。
正则化的偏差和方差
为了防止过拟合的现象,我们加上一个正则化项,但是正则化参数 与过拟合又有什么关系呢?
当 很大的时候,就会使得后面的每一个
都被惩罚,也就是
的权重会降低,
的值会减小,甚至接近于0,所以只剩下
,那么其假设函数就会变成一条直线,出现欠拟合的现象。
当 很小的话,一个极端例子就是
,也就是相当于没有加正则化那项,这就会导致过拟合的现象。
的取值不能过大也不能过小。
的取值可以在
,在这12个不同的模型中针对每一个
的值,都去计算出一个最小代价函数,从而得到
得到了12个 以后,就再用交叉验证集去评价它们。即计算每个
在交叉验证集上的平均误差平方和
选择一个交叉验证集误差最小的 最能拟合数据的作为正则化参数。
最后拿这个正则化参数去测试集里面验证 预测效果如何。
随着 参数的增大,也就是
的值会减小,偏差逐渐增大,
自然也会随之增大,这是因为当
的时候,
是没有正则化项的。
但是对于 来说,它假设函数里面的
是根据训练集里面拟合出来的,所以在没有加入正则化前,
是很大的。但是随着
的逐渐增大,也就是随着正则化的效果逐渐体现出来,在交叉验证集里面与测试数据就会越来越拟合,这时候的
自然会慢慢下降。但是当
变得足够大的时候,参数
会变得很小,甚至接近于0,也就是说交叉训练集的
就会趋近一条直线,
自然会随之上升。
Learning Curves 学习曲线
假设我们用 去拟合数据,当数据只有几个的时候,拟合效果那肯定的非常好的,但是,当数据越来越多,我们的假设函数因为多项式太少就不能很好地拟合数据了。所以训练集的误差
会随着数据的增多而增大。如上图蓝色的曲线。
但是对于交叉验证集呢?因为一开始只有几个数据,那么在训练集拟合出来的参数就有很大的可能不适合交叉验证集,所以在数据很小的情况下其误差是很大的,但是随着数据的慢慢增多,虽然个别的数据拟合不上,但是整体的拟合效果那肯定比只有几个数据的时候好了,所以其整体误差是逐步下降的,也就是说模型随着训练数据,样本的增多,他的泛化能力会不断增加。如上图粉色的曲线。
当数据存在高偏差也就是欠拟合的时候,即使数据再继续增多也无补于事,所以其误差会趋于一个平衡的位置,而且 和
的误差都会很大。
所以,当数据存在欠拟合的问题,我们选用更多的训练样本是没有办法解决问题的。
当数据存在高方差也就是过拟合的时候,随着数据的增多,因为过拟合所以在训练集基本能完美拟合其数据,所以训练集的误差虽然会上升,但是其幅度是非常缓慢的,在交叉验证集也一样,所以过拟合的时候其图像如上,在 和
之间有一大段空隙。
所以,当数据存在过拟合的现象,选用更多的样本有利于我们解决这个问题。
4. Deciding What to Do Next Revisited 决定下一步该做什么
总结 :
手段 | 使用场景 |
---|---|
采集更多的样本 | 高方差(过拟合) |
降低特征维度 | 高方差(过拟合) |
采集更多的特征 | 高偏差(欠拟合) |
进行高次多项式回归 | 高偏差(欠拟合) |
降低参数 λ | 高偏差(欠拟合) |
增大参数 λ | 高方差(过拟合) |
当我们选用一些较小的神经网络,虽然其计算量较少,但是容易出现欠拟合的现象。相反,我们选用一些层数比较多,层的单元比较多的神经网络,容易出现过拟合的现象。我们之前提到越大型的神经网络效果越好,为了防止出现过拟合的现象,我们可以使用正则化的方法来修正。
使用单个隐藏层是一个很好的默认开始。您可以使用交叉验证集在许多隐藏层上训练您的神经网络。然后您可以选择性能最好的一个。
模型复杂性影响:
- 低阶多项式(低模型复杂度)具有高偏差和低方差。在这种情况下,该模型很难一致
- 高阶多项式(高模型复杂度)非常适合训练数据,测试数据极其糟糕。这些对训练数据的偏倚低,但差异很大
- 实际上,我们希望选择一个介于两者之间的模型,它可以很好地推广,但也可以很好地适合数据。