偏差和方差
这篇博客介绍机器学习中误差(error)的来源,知道我们的模型中产生的误差来自于哪一部分,才能更好地进行模型的调整。一般来说,误差的来源有两部分:偏差(bias)和方差(variance)。偏差和方差——用来衡量模型泛化能力的工具,所以我的理解是在测试集上面根据偏差和方差来对模型进行一个评估。
回顾之前回归问题中的例子,简单模型对于数据的拟合能力比较差,在训练集和测试集上面效果均不好;但同时不是越复杂的模型越好,因为有可能产生过拟合的现象,所以需要选择合适的模型。偏差-方差分析可以帮我们诊断模型中存在的问题(过于复杂或者过于简单)。
还是以宝可梦进化之后的CP值预测为例,如果我们有一些不同的训练数据(也就是李宏毅老师PPT中所说从若干个平行世界中收集的不同的宝可梦),
实质上是指有几个不同的训练集(TrainData_1,TrainData_2,TrainData_3),模型分别在不同的训练集上面训练,然后在同样的测试集(TestData)上面测试。对于不同的训练集,我们会得到一个模型的实例,比如有一次模型和五次模型,训练结果:
这里,“模型”表示具体的模型类别(比如一次模型,二次模型);“模型实例”表示一个模型在不同训练集上面训练得到的最终模型,有几个训练集就会有几个模型实例。
图片中,红色线表示在100个不同的训练集上面得到的模型的实例,蓝色线表示模型的预测输出的期望,黑色线是真实值。
偏差就是:预测输出的期望值 - 真实值,(描述模型的拟合能力)
方差就是:(每个模型实例的预测输出 - 模型预测输出的期望值)^ 2 (描述模型的稳定性,即受数据扰动的影响程度)
可以看出,一次模型的偏差较大,方差较小;五次模型的偏差较小,方差较大。
数学定义
上面是偏差和方差一个比较直观的理解,接下来给出数学形式的定义:
数学符号 | 含义 |
---|---|
测试集 | |
测试集标签 | |
训练集 | |
模型 | |
模型在测试集上面的预测输出的期望 |
是某一机器学习模型(如线性回归模型),在不同的训练集上面训练之后,得到不同的模型实例,之后每个模型实例应用到测试集,得到每个模型实例下的预测输出。
模型在测试集上预测输出的期望:
模型的偏差:
模型的方差:
偏差-方差与模型复杂度
偏差和方差的几种情况:
- 偏差小,方差小:追求的目标,理想的模型。
- 偏差小,方差大:模型比较复杂,在训练集上面过拟合,导致在测试集上面泛化效果不好。
- 偏差大,方差小:模型比较简单,拟合能力较差,在训练集上面欠拟合,导致在测试集上面泛化效果不好。
- 偏差大,方差大:最糟的情况,模型需要重新进行设计,不适合于现有数据集。
很直观的一个解释,因为偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力,所以偏差大的模型拟合能力差,模型简单,容易欠拟合;方差度量数据扰动所造成的影响(在不同的训练集上面训练得到的模型在测试集上面效果表现相差很大),说明模型过于拟合训练集,模型复杂。
调整方法
综上,根据模型在测试集上的表现,可以得出结论:
偏差大,方差小:模型欠拟合
偏差小,方差大:模型过拟合
对于偏差大(欠拟合)的情况,常用的解决方法:
- 重新设计模型,使用更复杂的模型结构
- 输入中使用更多的特征
对于方差大(过拟合)的情况,常用的解决方法:
- 参数正则化(减小模型的复杂程度)
- 使用更多的训练数据
K-折交叉验证
模型的设计选择需要在偏差和方差之间进行平衡,在选择合适的模型(比如一次模型还是二次模型)时,常用的方法是进行K-折交叉验证。将训练集的数据等分成K份,每次使用(K-1)份数据进行训练,余下的1份数据进行验证,进行K次,保证每份数据均做过验证集,统计K次验证集上面的loss,取loss均值最小的模型作为使用的模型。