泛化误差
对学习算法除了通过实验估计其泛化性能之外,人们往往还希望了解它为什么具有这样的性能。“偏差-方差分解”(bias-variance decomposition) 就是从偏差和方差的角度来解释学习算法泛化性能的一种重要工具。
在机器学习中,我们用训练数据集去训练一个模型,通常的做法是定义一个误差函数,通过将这个误差的最小化过程,来提高模型的性能。然而我们学习一个模型的目的是为了解决训练数据集这个领域中的一般化问题,单纯地将训练数据集的损失最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的损失与一般化的数据集的损失之间的差异就叫做泛化误差(generalization error)。
而泛化误差可以分解为偏差(Biase)、方差(Variance) 和噪声(Noise)。
偏差、方差与噪音
真实模型
如果我们能够获得所有可能的数据集合,并在这个数据集合上将损失最小化,那么学习得到的模型就可以称之为 “真实模型” 。当然,在现实生活中我们不可能获取并训练所有可能的数据,所以 “真实模型”肯定存在,但是无法获得 。我们的最终目的是学习一个模型使其更加接近这个真实模型。
描述模型与真实模型的差距
Bias和Variance分别从两个方面来描述我们学习到的模型与真实模型之间的差距,分别反映了模型的拟合能力和稳定性
Bias(偏差)
Bias衡量的是用所有可能的训练数据集训练出的所有模型的预测输出的平均值,与真实模型的输出值之间的差异。
- 高偏差通常意味着模型过于简单,无法捕捉数据的复杂模式,导致欠拟合。
- 低偏差意味着模型能够更好地拟合数据,反映其较高的拟合能力。
- 例子:假设真实模型是一个二次函数 $y = x^2$,而我们用线性模型 $y = ax + b$ 去拟合数据。由于线性模型无法捕捉二次关系,无论用什么数据训练,模型的预测平均值都会与真实值存在较大偏差,这就是高偏差的表现。
Variance(方差)
Variance衡量的是不同的训练数据集训练出的模型输出值之间的差异。
- 高方差意味着模型对训练数据的变化非常敏感,容易捕捉到数据中的噪声,导致过拟合。
- 低方差意味着模型在不同数据集上的表现比较稳定,泛化能力强。
- 例子:继续以上面的二次函数为例,如果我们用一个高阶多项式模型(如 $y = ax^5 + bx^4 + \dots$ )去拟合数据,模型可能会完美拟合训练数据,但在不同的数据集上表现得差异很大,这就是高方差的表现。
Noise(噪声)
Noise 是数据中不可消除的随机波动,反映了数据本身的固有不确定性。它是机器学习算法无法直接克服的问题,因为算法只能基于给定数据进行学习。数据的质量(包括噪声的多少)决定了模型性能的潜在上限。 在数据已经确定的情况下,这一上限也随之固定,我们的目标是通过优化模型和方法,尽可能接近这一上限。
- 例子:在房价预测中,如果有部分房屋的价格记录存在错误(如录入错误或异常值),这些错误就是噪声。无论模型如何优化,都无法准确预测这些噪声部分。
用公式来理解
泛化误差可以分解为偏差、方差和噪音三个部分,其公式如下:
$$\text{Err}(x) = \left( E[\hat{f}(x)] - f(x) \right)^2 + E\left[ \left( \hat{f}(x) - E[\hat{f}(x)] \right)^2 \right] + \sigma_e^2$$ 即:
$$ \text{Err}(x) = \text{Bias}^2 + \text{Variance} + \text{Noise} $$
用图像来理解

偏差-方差窘境
一般情况下,偏差和方差之间存在一种权衡关系,这种关系被称为偏差-方差窘境(bias-variance dilemma)。在学习过程中,初始阶段由于模型训练不足,其拟合能力较弱,训练数据的轻微变化不足以对学习器产生显著影响,此时偏差在泛化误差中起主导作用,模型容易表现为欠拟合。随着训练的深入,模型的拟合能力逐渐增强,训练数据中的变化被更好地捕捉,方差的影响开始显现,泛化误差逐渐由方差主导。当训练程度达到较高水平时,模型的拟合能力过强,训练数据中的微小波动(如噪声或非全局特征)会被学习器过度关注,导致过拟合,此时方差进一步加剧了泛化误差的上升。因此,优化学习算法的关键在于找到一个平衡点,使偏差和方差都维持在合理范围内,从而实现最佳的泛化性能。

偏差-方差与欠拟合-过拟合的关系
一般来说,简单的模型会有一个较大的偏差和较小的方差,复杂的模型偏差较小方差较大。
欠拟合:模型不能适配训练样本,有一个很大的偏差
举个例子:我们可能有本质上是多项式的连续非线性数据,但模型只能表示线性关系。在此情况下,我们向模型提供多少数据不重要,因为模型根本无法表示数据的基本关系,模型不能适配训练样本,有一个很大的偏差,因此我们需要更复杂的模型。那么,是不是模型越复杂拟合程度越高越好呢?也不是,因为还有方差。
过拟合:模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差
方差就是指模型过于拟合训练数据,以至于没办法把模型的结果泛化。而泛化正是机器学习要解决的问题,如果一个模型只能对一组特定的数据有效,换了数据就无效,我们就说这个模型过拟合。这就是模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差。
偏差-方差和Bagging与Boosting的关系
Bagging与方差的关系
- Bagging的目标是通过降低方差来提高模型的稳定性。其核心思想是通过并行训练多个基础模型,然后对这些模型的预测结果进行平均或投票,从而减少模型的波动性。
- 具体方法:Bagging通过自助采样法(Bootstrap Sampling) 从训练集中生成多个子集,每个子集训练一个基础模型。由于每个子集的样本不同,训练出的模型也会有差异,但这些差异会被平均化,从而减少方差。
- 典型算法:Bagging的代表算法是随机森林(Random Forest),它在Bagging的基础上进一步引入了随机特征选择,进一步增强了模型的多样性和稳定性。
- 适用场景:Bagging特别适合高方差、低偏差的模型(如复杂决策树)。通过Bagging,可以显著降低模型的方差,从而提升泛化能力。
Boosting与偏差的关系
- Boosting的目标是通过降低偏差来提高模型的准确性。其核心思想是通过迭代训练多个基础模型,每个新模型都专注于修正前一个模型的错误,最终将多个模型的预测结果加权结合。
- 具体方法:Boosting在每一轮迭代中,根据上一轮模型的预测结果对样本进行重新加权,使得模型更加关注那些之前被错误预测的样本。通过这种方式,Boosting逐步减少模型的偏差。
- 典型算法:Boosting的代表算法包括AdaBoost和Gradient Boosting(如XGBoost、LightGBM、CatBoost)。这些算法通过不断优化模型的预测能力,显著降低了偏差。
- 适用场景:Boosting特别适合低方差、高偏差的模型(如简单决策树)。通过Boosting,可以显著降低模型的偏差,从而提高预测精度。
偏差-方差与K折交叉验证的关系
偏差、方差与K折交叉验证(K-fold Cross Validation) 之间的关系非常紧密,K折交叉验证通过在模型评估中对数据集进行多次划分和训练,能够更好地平衡偏差和方差。
K折交叉验证的基本原理
- 将原始数据集划分为K个子集(folds),这些子集的大小通常相等。
- 每次使用其中1个子集作为验证集,其余K-1个子集作为训练集。
- 训练模型并在验证集上进行评估,重复K次,得到K个模型的性能指标(如准确率、误差等)。
- 将K次的结果平均,作为模型性能的最终评估指标。
K值与偏差、方差的关系
在选择K值时,偏差和方差会呈现出一种权衡关系:
- K值较大时(例如K=N,即留一交叉验证,LOOCV):
- 偏差较小:
- 每次训练时使用的训练集大小为N-1,几乎覆盖了整个数据集,因此模型的训练结果更接近真实的数据分布。
- 模型能够在更大的数据集上学习,捕捉更多的信息,从而降低了偏差。
- 方差较大:
- 由于K值较大,模型的训练集之间会有很高的相似性,导致每次训练的模型对数据的变化(如噪声)非常敏感。
- 结果是模型可能会过度拟合训练数据,在验证集上的预测结果波动较大,方差较高。
- 偏差较小:
- K值较小时(例如K=2,即2折交叉验证):
- 偏差较大:
- 每次训练时使用的训练集大小为N/2,数据集较小,模型可能无法充分学习数据分布,导致偏差较大。
- 方差较小:
- 由于K值较小,模型的训练集之间差异较大,模型对数据的变化(如噪声)不敏感。
- 结果是模型不太容易过度拟合训练数据,预测结果的波动较小,方差较低。
- 偏差较大:
解决偏差和方差问题的整体思路
偏差和方差是模型性能的两大核心问题,解决它们的关键在于选择合适的模型、数据集和复杂度,同时结合具体的方法来调整模型的拟合能力。
解决偏差问题(避免欠拟合)
偏差问题通常表现为模型对数据的基本关系捕捉不足,导致欠拟合。解决方法包括:
- 选择正确的模型:
- 确保模型能够捕捉数据的基本关系。例如,对于非线性问题,使用线性模型会导致高偏差,应该选择非线性模型(如决策树、神经网络等)。
- 增加特征:
- 寻找更好的特征:选择具有代表性的特征,能够更好地描述数据。
- 用更多的特征:增加输入向量的维度,提供更多的信息供模型学习。
- 增加模型复杂度:
- 使用更复杂的模型(如增加神经网络的层数、增加决策树的深度等),以更好地拟合数据。
- 减少正则化:
- 正则化会限制模型的复杂度,如果偏差较大,可以尝试减少正则化强度。
解决方差问题(避免过拟合)
方差问题通常表现为模型对训练数据过度敏感,导致过拟合。解决方法包括:
- 增加数据集大小:
- 使用更多的数据可以减小数据扰动的影响,使模型更加稳健。
- 减少特征:
- 特征选择:去除不相关或冗余的特征,降低数据维度,减少模型复杂度。
- 降维:使用PCA、t-SNE等方法对数据进行降维。
- 正则化:
- 在损失函数中加入正则化项(如L1正则化、L2正则化),限制模型的复杂度,防止过度拟合。
- 交叉验证:
- 使用K折交叉验证来评估模型性能,避免模型在特定数据集上过度拟合。
- 早停法(Early Stopping): - 在训练过程中,当验证集误差不再下降时提前停止训练,防止模型过度拟合训练数据。
- 集成学习:
- 使用Bagging(如随机森林)或Boosting(如XGBoost)等方法来降低方差或偏差。
偏差(Bias)与方差(Variance) Understanding the Bias-Variance Tradeoff