偏差和方差

本文探讨了机器学习中模型表现不佳时可能遇到的偏差和方差问题,以及它们与欠拟合和过拟合的关系。通过训练集和交叉验证集误差的比较,可以判断模型的偏差或方差是否过高。正则化是防止过拟合的有效手段,通过选择合适的λ值,可以在训练和交叉验证误差间找到平衡。文章还提出了调整模型的多种策略,包括增减特征、改变正则化程度等,以优化模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、诊断偏差和方差

当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况: 要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟 合问题。那么这两种情况,哪个和偏差有关,哪个和方差有关,或者是不是和两个都有关? 搞清楚这一点非常重要,因为能判断出现的情况是这两种情况中的哪一种。其实是一个很有效的指示器,指引着可以改进算法的最有效的方法和途径。

训练集误差和交叉验证集误差近似时:偏差/欠拟合

交叉验证集误差远大于训练集误差时:方差/过拟合

二、正则化与偏差/方差

在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能 会正则化的程度太高或太小了,即我们在选择 λ 的值时也需要思考与刚才选择多项式模型次 数类似的问题。

我们选择一系列的想要测试的 𝜆 值,通常是 0-10 之间的呈现 2 倍关系的值(如: 0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共 12 个)。我们同样把数据分为训练 集、交叉验证集和测试集。

选择𝜆的方法为:

1.使用训练集训练出 12 个不同程度正则化的模型

2.用 12 个模型分别对交叉验证集计算交叉验证误差

3.选择交叉验证误差最小的模型

4.运用步骤 3 中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ 的值绘制在一张图表上:

• 当 𝜆 较小时,训练集误差较小(过拟合)而交叉验证集误差较大

• 随着 𝜆 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加。

• 最终选择的 𝜆 取值为使交叉验证集误差最小的 𝜆。

1. 获得更多的训练实例——解决高方差

2. 尝试减少特征的数量——解决高方差

3. 尝试获得更多的特征——解决高偏差

4. 尝试增加多项式特征——解决高偏差

5. 尝试减少正则化程度 λ——解决高偏差

6. 尝试增加正则化程度 λ——解决高方差

### 残差、偏差方差的概念及其关系 #### 1. 残差 (Residuals) 残差是指实际观测值与模型预测值之间的差异。它是评估模型拟合程度的一个重要指标,在监督学习中用于优化模型参数。通过最小化残差平方(RSS),可以有效减少模型的预测误差[^1]。 #### 2. 偏差 (Bias) 偏差表示模型预测值与真实值之间的平均差距。高偏差通常意味着模型欠拟合,即模型未能捕捉到数据中的复杂模式。例如,在Boosting算法中,随着弱分类器数量增加,偏差会逐渐降低,从而提高模型的整体性能。 #### 3. 方差 (Variance) 方差反映了模型对训练数据的变化敏感度。当模型过于复杂时,可能会过度适应训练数据中的噪声,导致在未见数据上的表现较差。因此,高方差往往对应于过拟合现象[^2]。 #### 4. 泛化误差 (Generalization Error) 泛化误差是模型在新数据上的预测能力的表现。理想情况下,一个优秀的模型应具有较低的泛化误差,这意味着它不仅能在训练集上表现良好,还能很好地处理未知的数据点[^3]。 #### 5. Bias-Variance Tradeoff 机器学习的核心挑战之一就是找到偏差方差之间的最佳平衡点。如果模型太简单,则可能产生较高的偏差;而如果模型过于复杂,则可能导致较大的方差。为了实现良好的泛化效果,需要在这两者间做出适当取舍。 #### XGBoost 中的特殊处理 XGBoost作为一种高效的梯度提升框架,在面对含有缺失值的数据时能够自动决定分裂方向,这一特性有助于改善模型对于不完全数据的学习效果,间接影响了模型的偏差方差控制[^4]。 ```python import xgboost as xgb from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 创建模拟数据集 X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7) # 划分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7) # 定义并训练XGBoost模型 model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss') model.fit(X_train, y_train) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZGlenfiddich

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值