XGboost常见面试题总结(一)——About过拟合

XGBoost防止过拟合的方法

1. 正则化

  • L1/L2正则化:在目标函数中加入L1(Lasso)或L2(Ridge)正则项,分别通过alphalambda参数控制,限制模型复杂度。在这里插入图片描述

2. 树结构控制

  • 最大深度(max_depth:限制树的最大深度,防止过深导致过拟合。
  • 最小叶子权重(min_child_weight:设置叶子节点所需的最小样本权重和,避免过小的叶子节点。
  • 分裂阈值(gamma:控制分裂所需的最小损失减少,防止不必要的分裂。

3. 子采样

  • 行采样(subsample:训练时随机抽取部分样本,减少对特定样本的依赖。
  • 列采样(colsample_bytree, colsample_bylevel, colsample_bynode:分别控制每棵树、每层、每个节点的特征采样比例,增加多样性。

4. 学习率与树的数量

  • 学习率(eta:降低学习率,配合更多的树(n_estimators),使模型更稳定。
  • 早停法(Early Stopping):在验证集性能不再提升时提前停止训练,避免过拟合。

5. 交叉验证

  • 交叉验证:使用交叉验证评估模型性能,选择最佳参数组合,提升泛化能力。

6. 监控与调参

  • 监控训练过程:通过监控训练集和验证集的性能,及时调整参数。
  • 参数调优:使用网格搜索或随机搜索优化参数,找到最佳组合。

7. 其他方法

  • 增加数据:更多数据有助于提升泛化能力。
  • 数据增强:通过数据增强生成更多训练样本,提升模型鲁棒性。

理解记忆补充:

树结构控制

最小叶子权重(min_child_weight

定义min_child_weight 是控制叶子节点中样本权重和的最小值。
在回归任务中,样本权重通常是样本的二阶导数(Hessian);
在分类任务中,样本权重与样本的梯度(Gradient)相关。
作用

  • 防止叶子节点过小:设置较大的 min_child_weight 可以避免模型生成过小的叶子节点,从而降低过拟合风险。
  • 控制模型复杂度:较大的值会限制树的生长,使模型更简单。

公式
在这里插入图片描述

分裂阈值(gamma

定义gamma 是控制分裂所需的最小损失减少的参数。只有在分裂后的损失减少大于 gamma 时,才会进行分裂。

作用

  • 防止不必要的分裂:较大的 gamma 会阻止那些对损失减少贡献不大的分裂,从而简化模型。
  • 控制模型复杂度:较大的 gamma 会限制树的生长,降低过拟合风险。

公式
在这里插入图片描述
示例

  • gamma=0,任何正损失减少都会导致分裂。
  • gamma=0.1,只有损失减少大于0.1时才会分裂。

子采样

行采样(subsample

定义
subsample 参数控制每次构建树时随机抽取的训练样本比例。例如,subsample=0.8 表示每次只使用80%的样本进行训练。

作用

  • 减少对特定样本的依赖
  • 增加多样性
  • 类似Bagging:行采样的思想类似于随机森林中的Bootstrap Aggregating(Bagging),通过引入随机性来提升模型的泛化能力。

参数范围
subsample 的取值范围是 (0, 1],默认值为1(即使用全部样本)。

示例

  • 如果训练集有1000个样本,设置 subsample=0.8,则每次构建树时随机抽取800个样本进行训练。
列采样(Feature Subsampling)

列采样是对特征进行随机抽样,XGBoost提供了三种列采样方式,分别控制不同粒度的特征采样:

(1)colsample_bytree
  • 定义:控制每棵树构建时随机抽取的特征比例。
  • 作用:每棵树只使用部分特征,增加树之间的多样性,降低过拟合风险。
  • 参数范围:(0, 1],默认值为1(即使用全部特征)。
  • 示例:如果总共有10个特征,设置 colsample_bytree=0.7,则每棵树随机抽取7个特征进行训练。
(2)colsample_bylevel
  • 定义:控制树中每一层节点分裂时随机抽取的特征比例。
  • 作用:每一层只使用部分特征进行分裂,进一步增加随机性。
  • 参数范围:(0, 1],默认值为1(即使用全部特征)。
  • 示例:如果总共有10个特征,设置 colsample_bylevel=0.6,则每一层随机抽取6个特征进行分裂。
(3)colsample_bynode
  • 定义:控制每个节点分裂时随机抽取的特征比例。
  • 作用:每个节点只使用部分特征进行分裂,增加更多的随机性。
  • 参数范围:(0, 1],默认值为1(即使用全部特征)。
  • 示例:如果总共有10个特征,设置 colsample_bynode=0.5,则每个节点随机抽取5个特征进行分裂。
行采样与列采样的区别
采样类型采样对象作用粒度主要作用
行采样 (subsample)样本每次构建树时减少对特定样本的依赖,增加多样性
列采样 (colsample_*)特征每棵树、每层或每个节点减少对特定特征的依赖,增加随机性
子采样的优势
  1. 防止过拟合+加速训练+增加多样性
  2. 类似集成学习:子采样的思想类似于随机森林中的Bagging和随机子空间方法,通过随机性提升模型性能。
注意事项
  1. 采样比例的选择
    • 过小的采样比例可能导致模型欠拟合,过大的采样比例可能无法有效防止过拟合。
    • 通常建议从较大的值(如0.8)开始,逐步调整。
  2. 与其他参数的关系
    • 子采样通常与其他正则化参数(如 max_deptheta 等)配合使用,以达到最佳效果。
    • 例如,较小的 subsample 可以配合较小的 eta 和较大的 n_estimators
  3. 随机性引入的影响
    • 子采样会引入随机性,可能导致模型训练结果不稳定。可以通过设置随机种子(seed)来控制随机性。

学习率与树的数量

在XGBoost中,学习率(eta树的数量(n_estimators 是两个紧密相关的超参数,它们共同控制模型的训练过程和性能。

1. 学习率(eta

定义
eta 是每棵树的权重缩减系数(也称为学习率),用于控制每棵树对最终预测结果的贡献程度。eta 的取值范围是 (0, 1],默认值为 0.3。

作用

  • 控制每棵树的贡献:较小的 eta 会降低每棵树对最终预测结果的影响,使模型更加保守。
  • 平滑训练过程:较小的 eta 可以使模型训练过程更加平滑,减少过拟合的风险。
  • 需要更多的树:较小的 eta 通常需要更多的树(n_estimators)来达到相同的性能。

公式
在这里插入图片描述
示例

  • 如果 eta=0.1,则每棵树的预测结果只会以10%的权重添加到最终预测中。
  • 如果 eta=0.01,则每棵树的预测结果只会以1%的权重添加到最终预测中。
2. 树的数量(n_estimators

定义
n_estimators 是模型中使用树的数量(即迭代次数)。XGBoost 是一个加法模型,每棵树都会尝试修正前一棵树的残差。

作用

  • 控制模型的复杂度:较多的树会使模型更加复杂,可能增加过拟合的风险。
  • 与学习率的关系:较小的 eta 通常需要更多的树来达到相同的性能。

示例

  • 如果 n_estimators=100,则模型会构建100棵树。
  • 如果 n_estimators=500,则模型会构建500棵树。
3. 学习率与树数量的关系
  • 较小的 eta + 较多的树
    较小的 eta 会使每棵树的贡献较小,因此需要更多的树来达到相同的性能。这种组合通常会使模型更加稳定,减少过拟合的风险,但训练时间会更长。
  • 较大的 eta + 较少的树
    较大的 eta 会使每棵树的贡献较大,因此需要较少的树来达到相同的性能。这种组合可能会使模型训练更快,但容易导致过拟合。
    经验法则
  • 通常建议从一个较小的 eta(如0.1或0.01)开始,然后根据性能调整 n_estimators
  • 较小的 eta 通常需要更多的树,但会使模型更加鲁棒。
4. 早停法(Early Stopping)

定义
早停法是一种防止过拟合的技术,通过在验证集性能不再提升时提前停止训练,避免模型过度拟合训练数据,还能节省训练时间。
实现方式

  • 在训练过程中,模型会定期在验证集上评估性能(如每10棵树评估一次),注意是1-10,11-20这种。
  • 如果验证集的性能在一定的迭代次数内(由 early_stopping_rounds 参数控制)没有提升,则训练会提前停止。

参数

  • early_stopping_rounds:控制允许验证集性能不提升的最大迭代次数。例如,early_stopping_rounds=10 表示如果验证集性能在10次迭代内没有提升,则停止训练。
  • eval_set:指定验证集,用于监控模型性能。

示例

from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split

# 假设 X 是特征矩阵,y 是标签
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义模型
model = XGBClassifier(eta=0.1, n_estimators=1000, early_stopping_rounds=10)
# 训练模型
model.fit(X_train, y_train, eval_set=[(X_val, y_val)], verbose=True)
  • 在这个例子中,模型会在验证集上监控性能,如果验证集性能在10次迭代内没有提升,则停止训练。
5. 学习率、树数量与早停法的结合
  • 学习率与早停法:较小的 eta 会使模型训练更加平滑,早停法可以防止模型过度训练。
  • 树数量与早停法:早停法可以动态确定最佳的树数量,而不需要手动设置 n_estimators

示例

  • 设置 eta=0.01n_estimators=1000,并使用早停法(early_stopping_rounds=10)。
  • 模型会在验证集性能不再提升时提前停止,可能最终只使用了200棵树。
6. 评估指标的选择

XGBoost支持多种评估指标,具体取决于任务类型:

任务类型常用评估指标说明
分类任务loglosserrorauc对数损失、错误率、AUC(ROC曲线下面积)
回归任务rmsemae均方根误差、平均绝对误差
排序任务mapndcg平均精度(MAP)、归一化折损累积增益(NDCG)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值