机器学习之方差与偏差(bias-variance)

方差与偏差作为学机器学习的一个基本功,经常被某些重视基础的面试官所问到,这里整理了一下相关的知识。

问题背景

我们评价一个机器学习模型的好坏,通常是评价模型的泛化性能,而对泛化性能为什么高低缺乏一些了解。偏差-方差分解(bias-variance decomposition)就是解释学习算法泛化性能的一种重要工具。

原理

偏差、方差与噪声的含义

偏差:度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;
方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;
噪声:则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

偏差与方差的冲突

一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variance dilemma),如下图所示。
这里写图片描述
给定学习任务,假设我们能控制学习算法的训练程度,那么训练不足时,训练数据的扰动不足以使学习器产生显著变化,此时偏差占主导;随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐占主导;在训练程度充足后,学习器拟合能力已非常强,训练数据的轻微扰动都会导致学习器发生显著变化,若继续学习,则将发生过拟合。

参考文献

[1] 《机器学习》(周志华著)

### Bias-Variance Decomposition 的概念 在机器学习领域,模型误差可以被分解为三个主要部分:偏差bias)、方差variance)以及不可约误差(irreducible error)。这种分解方法有助于理解模型性能的局限性和优化方向。 #### 偏差Bias偏差衡量的是模型预测值真实值之间的差异程度。高偏差通常意味着模型过于简单,无法捕捉数据的真实模式,从而导致欠拟合现象[^1]。例如,在线性回归中,如果实际关系是非线性的,则即使增加训练时间也无法显著改善模型表现。 #### 方差Variance方差反映的是当使用不同训练集时,模型参数变化的程度。高方差表明模型对特定训练样本过度敏感,容易过拟合到噪声上而不是泛化至未见数据[^2]。理想情况下,一个好的模型应该具有较低的方差以便更好地推广到新实例上去。 #### 不可约误差(Irreducible Error) 这部分是由随机因素引起的固有不确定性所造成的错误率底线;无论怎样改进算法都无法消除它因为这取决于问题本身特性而非建模过程中的决策失误所致[^3]. ### 应用于机器学习实践当中 为了实现最佳平衡状态即最小总损失函数E[L], 我们需要找到适当复杂度水平下的假设空间H*使得两者兼顾良好 - 即既不过于简化以至于忽略掉重要特征也不至于过分精细以至于捕获到了无意义的变化趋势.[^4] 通过调整正则项系数λ来控制权重衰减力度进而影响上述两方面权衡比例便成为了一种常见手段之一. ```python from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import numpy as np def bias_variance_tradeoff(X, y): X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2) model_complexities = range(1, 10) # Example complexity levels training_errors = [] validation_errors = [] for degree in model_complexities: poly_features = PolynomialFeatures(degree=degree) X_poly_train = poly_features.fit_transform(X_train.reshape(-1, 1)) lin_reg = LinearRegression() lin_reg.fit(X_poly_train, y_train) X_poly_val = poly_features.transform(X_val.reshape(-1, 1)) y_pred_train = lin_reg.predict(X_poly_train) y_pred_val = lin_reg.predict(X_poly_val) mse_train = mean_squared_error(y_train, y_pred_train) mse_val = mean_squared_error(y_val, y_pred_val) training_errors.append(mse_train) validation_errors.append(mse_val) return model_complexities, training_errors, validation_errors # Plotting code omitted here but would involve matplotlib or similar library. ``` 此脚本展示了如何评估多项式回归的不同阶数对于给定数据集的影响,并绘制相应的训练和验证误差曲线图以直观展示偏倚—变异权衡情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值