假设训练集,开发集和测试集都来自相同的分布,你应该获取更多训练数据,因为那样可以提高模型性能,对吧?
不幸运的是即使取得更多训练数据没有什么坏处,它也没有你想象的很多的好处。取得更多训练数据也有可能是在浪费时间,所以问题来了,你如何确定什么时候增加训练数据,什么时候不呢?
在机器学习领域有两大主要的误差来源:偏差和方差。理解了偏差和方差将帮助你确定什么时候增加数据,或者采用其他方式来提升性能。理解他们也会帮助你充分利用时间。
假设你想构建一个有5%错误率的猫分类器。现在你的训练集错误率为15%,开发集错误率16%。在这种情况下,增加训练数据可能没有什么帮助,你应该关注其他的方式。实际上,给训练集增加更多数据会导致算法更加难以在训练集上有好的表现(将会在下一章解释为什么)。
如果在训练集上错误率是15%(精度85%),但是你的目标是5%的错误率(精度95%),那么首要问题是提升算法在训练集的精度,因为算法在开发集/测试集上的表现一般比训练集差。所以如果算法在可见样本(训练集)上是85%精确度,那么在未见样本(开发集)上根本不可能获得95%的精确度。
像之前一样假设算法在开发集上错误率为16%(84%精度)。
将这16%的错误率拆解成两部分:
- 首先,在本例中算法在训练集上的错误率是15%,我们认为这是算法的偏差(非正式的偏差)
- 其次,算法在开发集(测试集)上的表现比训练集差了多少。在本例中,算法的开发集表现比训练集差了1%,我们认为这是算法的方差(非正式的方差)。
对算法进行修改可以解决第一方面的问题—偏差—提高算法在训练集上的性能。对算法做另一些修改解决第二方面的问题—方差—在开发集合测试集上获得更好的泛化性能。先理解这两方面的问题哪一个更加需要去解决,再决定对算法做什么样的修改,这样做非常非常的有用。
形成一个关于偏差方差直观的理解可以帮助你高效地修改算法。
1. 问题背景
NFL(No Free Lunch Theorem)告诉我们选择算法应当与具体问题相匹配,通常我们看一个算法的好坏就是看其泛化性能,但是对于一个算法为什么好为什么坏,我们缺乏一些认识。“Bias-Variance Decomposition”就是从偏差和方差的角度来解释一个算法的泛化性能。
2. 一点点数学
“Bias-Variance Decomposition” 是以测试集上的平方错误为基础的,假设我们的预测值为
g
(
x
)
g(x)
g(x),真实值为
f
(
x
)
f(x)
f(x),则均方误差为
E
(
(
g
(
x
)
−
f
(
x
)
)
2
)
E((g(x)−f(x))^2)
E((g(x)−f(x))2)
。
为了让世界更加美好,我们在这里不考虑样本的噪声。噪声的存在是学习算法所无法解决的问题,数据的质量决定了学习的上限。而假设在数据已经给定的情况下,此时上限已定,我们要做的就是尽可能的接近这个上限)
参考:https://blog.csdn.net/wuzqChom/article/details/75091612