机器学习算法一般都会有训练和测试的过程,而且算法在不同训练集(训练集来自同一个分布)上学得的模型,测试的结果也很可能不同。
一般来说,算法的方差衡量了训练集的变动导致的模型性能的变化,即多次训练的模型之间的性能差异性。偏差则是度量算法的期望输出与真实标记的区别,表达了学习算法对数据的拟合能力。而噪声则表示数据的真实标记与数据在数据集上标记的区别,表明算法在当前任务上能达到的测试误差的下界。
假设数据集用 D D D表示,测试样本 x x x, y y y表示 x x x在数据集上的标记, y ~ \tilde{y} y~表示 x x x的真实标记, f ( x ; D ) f(x;D) f(x;D)表示从训练集 D D D上学得的模型 f f f的预测输出。
令
f
(
x
)
‾
\overline{f(x)}
f(x)表示从不同训练集上学得模型的期望输出,则
f
(
x
)
‾
=
E
D
[
f
(
x
;
D
)
]
\overline{f(x)} = E_D[f(x;D)]
f(x)=ED[f(x;D)]
则可以定义方差、偏差和噪声的表达,
方差为:
v
a
r
(
x
)
=
E
D
[
(
f
(
x
;
D
)
−
f
(
x
)
‾
)
2
]
var(x) = E_D[(f(x;D) - \overline{f(x)})^2]
var(x)=ED[(f(x;D)−f(x))2]
偏差为:
b i a s 2 ( x ) = [ f ( x ) ‾ − y ~ ] 2 bias^2(x) = [\overline{f(x)} - \tilde{y}]^2 bias2(x)=[f(x)−y~]2
噪声为:
ϵ 2 = E D [ ( y ~ − y ) 2 ] \epsilon^2 = E_D[(\tilde{y} - y)^2] ϵ2=ED[(y~−y)2]
如果对期望泛化误差进行分解,可以得到
E ( f ; D ) = b i a s 2 ( x ) + v a r ( x ) + ϵ 2 E(f;D) = bias^2(x) + var(x) + \epsilon^2 E(f;D)=bias2(x)+var(x)+ϵ2
即算法的期望泛化误差可以分解为偏差、方差和噪声之和。
另外,一般来说,如果泛化误差的下界为0%,则高方差和高偏差对应如下几种情况。
train error | 1% | 15% | 15% |
test error | 15% | 16% | 30% |
方差、偏差 | 高方差 | 高偏差 | 高偏差&高方差 |
在机器学习中,针对高方差和高偏差的情况,处理机制也是完全不一样的。首先要确保算法有足够的拟合能力,能够很好地处理该任务,即降低偏差,而这通常需要更换算法或者调优算法。在达到低偏差后,如果存在高方差,则需要通过获取更多的训练数据或正则化或dropout等机制减少方差。
另外,在集成学习中,bagging一般可以用来减少方差,而boosting则有利于减小偏差。