GBDT面试级知识点整理

GBDT是梯度下降树,适用于分类和回归,以其优秀的效果和特征筛选能力受到关注。GBDT通过迭代多个决策树并累加其预测值来逼近真实值。每棵树学习前一棵树残差的微小部分,以减少过拟合。算法流程包括选择特征,用负梯度拟合回归树,每轮迭代优化损失函数。在分类问题中,GBDT使用CART回归树,通过softmax转换产生类别概率。

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

简介

gbdt全称梯度下降树,在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一,在前几年深度学习还没有大行其道之前,gbdt在各种竞赛是大放异彩。

原因大概有几个:

  1. 效果确实挺不错。
  2. 即可以用于分类也可以用于回归。
  3. 三是可以筛选特征。

这三点实在是太吸引人了,导致在面试的时候大家也非常喜欢问这个算法。 gbdt的面试考核点,大致有下面几个:

  • gbdt 的算法的流程?
  • gbdt 如何选择特征 ?
  • gbdt 如何构建特征 ?
  • gbdt 如何用于分类?
  • gbdt 通过什么方式减少误差 ?
  • gbdt的效果相比于传统的LR,SVM效果为什么好一些 ?
  • gbdt 如何加速训练?
  • gbdt的参数有哪些,如何调参 ?
  • gbdt 实战当中遇到的一些问题 ?
  • gbdt的优缺点 ?

GBDT解析

GBDT主要由三个概念组成:

  • Regression Decistion Tree(即DT)
  • Gradient Boosting(即GB),
  • Shrinkage (算法的一个重要演进分枝,目前大部分源码都按该版本实现)。
    搞定这三个概念后就能明白GBDT是如何工作的。

DT 回归树

GBDT的核心在于累加所有树的结果作为最终结果,而分类树的结果显然是没办法累加的,所以GBDT中的树都是回归树,不是分类树,这点对理解GBDT相当重要。

GB 梯度迭代

Boosting,迭代,即通过迭代多棵树来共同决策。

这怎么实现呢?难道是每棵树独立训练一遍,比如A这个人,第一棵树认为是10岁,第二棵树认为是0岁,第三棵树认为是20岁,我们就取平均值10岁做最终结论?–当然不是!且不说这是投票方法并不是GBDT,只要训练集不变,独立训练三次的三棵树必定完全相同,这样做完全没有意义。

之前说过,GBDT是把所有树的结论累加起来做最终结论的,所以可以想到每棵树的结论并不是年龄本身,而是年龄的一个累加量

GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量

比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。
这就是Gradient Boosting在GBDT中的意义,简单吧。

Shrinkage

Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。

Shrinkage仍然以残差作为学习目标,但对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001(注意该step非gradient的

### 关于GBDT和XGBoost的面试题目及答案解析 #### 1. GBDT 和 XGBoost 的主要区别是什么? GBDT (Gradient Boosting Decision Tree) 是一种迭代决策树算法,通过构建一系列弱分类器并逐步减少前一轮预测误差来进行学习。而 XGBoost 则是在 GBDT 基础上做了多项改进: - **正则化项**:XGBoost 显式加入了 L1 和 L2 正则化项来控制模型复杂度,从而提高泛化能力[^1]。 - **目标函数定义更灵活**:除了支持自定义损失函数外,还允许用户指定权重参数调整不同样本的重要性。 - **列采样机制**:类似于随机森林的做法,每次分裂节点时只考虑部分特征子集,有助于降低过拟合风险。 - **处理缺失值策略**:能够自动识别最优分割点位置,即使某些维度含有大量空缺数据也能正常工作。 ```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=2, n_redundant=10, random_state=7) # 将数据分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, stratify=y, random_state=78) # 定义DMatrix对象用于加速计算效率 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) ``` #### 2. 如何解释 XGBoost 中的目标函数? XGBoost 的核心在于其独特设计的目标函数形式。该公式不仅包含了传统的加权平方误差成分,更重要的是额外增加了两项惩罚因子——L1 范数(绝对值之和)以及 L2 范数(平方和)。这种设置使得最终得到的结果更加平滑稳定,不容易受到极端异常点的影响[^2]。 具体而言,对于每一个叶子结点 i ,假设当前有 ni 条记录落入其中,则对应的增益 g_i 表达式如下所示: \[ \text{Gain}=\frac{\sum_{i=1}^{n}\left[g_{i}-\bar{g}_{j}\right]}{\lambda+n_{t}}-\gamma \] 这里 gi 表示第 i 个实例对应的一阶导数值;λ 控制着 L2 正则强度大小;γ 决定了最小叶节点数目阈值。 #### 3. 当面对大规模稀疏矩阵作为输入时,为什么说 XGBoost 更适合解决这类问题而不是传统意义上的 GBDT? 这是因为相比于普通的 GBDT 方法,在遇到高维稀疏向量的情况下,XGBoost 展现出了更好的适应性和鲁棒性特点[^3]: - 支持内置的数据预处理功能可以直接读取 libsvm 格式的文件格式; - 提供了专门针对稀疏性的优化措施比如近似直方图算法; - 对于非常宽广但是密度很低的数据结构依然保持较高的运算速度而不至于耗尽物理内存资源。 #### 4. 在实际应用过程中如何调节 XGBoost 参数以达到最佳性能表现? 调参是一个反复试验的过程,涉及到多个方面因素考量。以下是几个常用技巧帮助找到合适的配置方案[^4]: - `max_depth` : 设置最大树深,默认为6层。较小值可防止过拟合并加快收敛速率,但可能造成欠拟合现象发生。 - `eta` 或者说是 learning rate :减小步长有利于获得更为精细的学习成果,不过会增加总的迭代次数需求。 - `subsample`: 每次建模之前先抽取一部分比例的数据参与本轮更新操作,以此方式增强整体稳定性。 - `colsample_bytree`, `colsample_bylevel`, `colsample_bynode`: 这些选项分别决定了每棵树、每一乃至每个分支所使用的属性集合规模占比情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值