Bias & variance
在机器学习中,我们所做的是从数据中学习它的模型,我们所希望的就是学习到一个能够百分百刻画出全体数据分布的模型,这样我们就可以用这个模型来做预测。然而实际情况是,我们几乎不可能找到最完美的模型能够刻画全体数据,比如说房价预测,每年都有新的房子被建造出来,同一个房子的房价本身也会变化,即使我们有办法拿到从古至今所有的房价样本参数,但是我们还是没有办法拿到未来的房价参数,所以对于房价整体数据集来说,我们永远没有办法拿到全体的数据,只能拿到一部分,除非有一天没有房子了,或者房子都不要钱了,那个时候就不会有新的数据产生,我们又恰好拿到了过往的所有数据。那么我们是能找到一个模型完美的刻画这个数据集的,做一个搜索模型就行了。不过那个时候这个模型就只能自娱自乐了,因为没有太大的意义。我们学习房价模型的目的是为了预测未来的房价的,预测未知的房价的。所以,我们训练的模型给出的预测结果基本都是会有误差的,那么误差来自于哪里呢?
什么是 bias 和 variance
误差的第一个来源就是偏差。我们可以想象我们找模型的过程是在打靶,最完美的模型的 e r r o r = 0 error=0 error=0 ,是靶心。而我们训练出的模型的 e r r o r error error 是打到靶子上的其他点。你有可能是个神枪手,能够瞄哪打哪,但是你瞄的不是准心,瞄错了,那么可以想象你的结果不会能打到靶心,这就是 Bias 。你还可能枪不是很稳,瞄着一个点但是打不到,非常的分散。但是多打几次后,所有的点的中心基本就是你瞄的地方,那么这里的误差是 variance 造成的。所以说 bias 是所有射击的均值(中心点)与靶心的偏差,而 variance 其实是所有射击的方差,描述的是分散程度,下面一张图可以很好的理解 bias 和 variance。
bias 和 variance 的来源
知道是什么之后,我们再来讨论下为为什么,也就是bias和variance分别是怎么产生的?首先是bias,bias 的产生其实是由数据集的分布偏移造成的。试想一下有一个全国人民收入的数据全体,我想要了解全国人民的平均收入,但是我没法弄到所有人的收入数据,所以我就去采集了部分样本,我跑到农村去挨家挨户的问,结果问出来他们的平均收入是1000(随便编的),然后我就说“啊,我知道了,全国人的平均收入是1000” ,这个结果显然是偏差很大的。数据集的好坏其实就决定了我能取的模型的所有结果的中心点在哪,也就是决定了偏差的大小。接下来是 variance ,variance 的大小其实是有你的模型的复杂程度决定的。因为我们在进行机器学习其实就是从模型集合里找一个最好的模型,那么想要找到那个完美模型的前提肯定得是你的模型集合里包括了这个完美的模型。当你的模型变得很复杂时,其实你的模型集合就变得更大了,比如多项式模型其实就包含了一次项模型,因为只要把高次项系数都取零就行了。所以模型的集合范围变大了,能取得结果也就变大了,也就变得更离散了。
下面从实例中来理解 bias 和 variance 。因为现实中的例子我们是没法知道完美模型长什么样的,所以我们就只能自己造一个完美的模型,再从上面采点作为训练集去训练拟合曲线。假设我们的完美模型是长下面这样的:
然后我们每次从上面这条曲线上取一些点,然后分别用线性模型、多项式模型、更高次的多项式模型来拟合,重复多次分别得到多条曲线画在图上,将均值用蓝线画出,结果是下面这样的:
可以看到线性模型的取值(红线)是最为集中的,即他的离散程度是最小的,variance是最小的。随着模型原来越复杂,红线覆盖的范围越来越大,取值越来越分散,variance越来越大,但是蓝线越来越能拟合完美曲线,即bias越来越小。最简单的模型和最复杂的模型用靶图画出来大概是下面这样,模型太简单时,范围比较小,没有包含靶心,模型范围变大时,包含了靶心,但是比较分散。
当偏差过大时,我们说模型是欠拟合的,当方差过大时,我们说是过拟合的。欠拟合时,我们可以发现在训练集上和测试集上的错误率或损失值 J J J 都很大,而过拟合时是在训练集上损失很小,但在训练集上很大。我们可以画出一个模型的学习曲线来观察是否是过拟合还是欠拟合。学习曲线的很坐标是训练集样本的个数,纵坐标是损失值 J J J 。
如何应对 variance
高variance可以通过两种方法来应对,第一种是增加训练集的样本数,第二种是减少模型的复杂度,进行正则化。还是上面的例子,当样本数从10变成100后,可以看到曲线明显变集中了。
当使用正则化后,增大正则化系数,曲线也在明显变集中:
N-fold cross validation
N N N 折交叉验证是将训练集分成 N N N 份,然后依次取其中的一份作为验证集,其余 N − 1 N-1 N−1 份作为训练集进行训练和验证,同一个模型可以训练 N N N 次得到 N N N 个结果,通过综合比较所有结果的好坏(例如取均值)来比较各个模型之间的性能。
在选出最好的模型后,最好使用全部的训练集再训练得出结果,然后作为最终结果去测试集上测试,在测试集上的这个结果基本可以反映模型的泛化能力,即在实际使用中的表现。