RF、GBDT、XGBOOST常见面试算法整理

1、RF与GBDT之间的区别

相同点

  • 都是由多棵树组成
  • 最终的结果都是由对棵树一起决定

不同点

  • 组成随机森林的数可是分类树也可以是回归树,而GBDT只由回归树组成
  • 组成随机森林的数可是并行生成,而GBDT只能是串行生成
  • 随机森林的结果是多棵树表决决定,而GBDT则是多棵树累加之和
  • 随机森林对异常值不敏感,而GBDT对异常值比较敏感
  • 随机森林是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能
  • 随机森林不需要进行数据预处理、归一化,而GBDT需要进行特征归一化

2、分类树与回归树的区别

  • 分类树使用信息增益或者增益比率来划分节点;每个节点样本的类别情侣投票决定测试样本的类别
  • 回归树使用最小化均方差划分节点;每个节点样本的均值作为测试样本的回归预测值

3、GBDT的核心

  • GBDT的核心就在于每一棵树都建立在之前所学的所有树的绝了和残差,这个残差就是一个加预测值后能的真实值的累加量

4、XGBOOST和GBDT的区别

  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的.
  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。为什么xgboost要用泰勒展开,优势在哪里?xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
  • Xgboost在代价函数里加入了正则项,用于控制模型的复杂度降低过拟合的可能性。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和
  • Xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行

问题整理

1、 GBDT怎样设置单棵树的停止生长条件?
  • 节点分裂时的最小样本数
  • 树的最大深度
  • 最多叶子结点数
  • Loss满足约束条件
2、 GBDT如何评估特征的权重大小?
  • 通过计算每个特征在训练集下的信息增益,最后计算每个特征信息增益与所有特征信息增益之和的比例为权重值。
  • 借鉴投票机制。用相同的GBDT参数对w每个特征训练出一个模型,然后在该模型下计算每个特征正确分类的个数,最后计算每个特征正确分类的个数与所有正确分类个数之和的比例为权重值。

3、GBDT当增加样本数量时,训练时长是线性增加吗?

  • NO,因为生成单颗决策树时,对于 损失函数极小值与样本数量N不是线性相关

4、当增加树的颗数时,训练时长是线性增加吗?

  • NO,因为每个数的生成时间复杂度O(N)不同

5、当增加一个棵树叶子节点数目时,训练时长是线性增加吗?

  • NO,叶子节点数和每棵树的生成的时间复杂度O(N)不成正比

6、每个节点上都保存什么信息?

  • 中间节点保存某个特征的分割值,叶节点保存预测是某个类别的概率

7、如何防止过拟合?

  • 增加样本,移除噪声
  • 减少特征,保留一些重要的特征
  • 对样本进行采样,就是在构建树的时候,不是把所有的样本都作为输入,而是选择一部分数据作为子集
  • 对特征进行采样化,和对样本采样基本一致,就是在每次建树的时候只对部分的特征进行切分

8、GBDT中哪些部分可以并行?

  • 计算每个样本的负梯度时
  • 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时
  • 更新每个样本的负梯度时
  • 最后预测的过程当中,每个样本将之前的所有树的结果累加的时候

9、树生成畸形树,会带来哪些危害,如何预防?

  • 在生成树的过程中,加入树不平衡的约束条件。这种约束条件可以是用户自定义的。例如对样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚





### 关于GBDTXGBoost面试题目及答案解析 #### 1. GBDTXGBoost 的主要区别是什么? 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`: 这些选项分别决定了每棵树、每一级乃至每个分支所使用的属性集合规模占比情况。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值