XGBoost 原理与面试问题

原理推导:

xgboost常见面试题

1.Boosting的思想

(直接讲adaboost)初始化训练一个弱学习器,每次依照训练结果调整样本权重,增大错分样本的权重并基于此训练下一个学习器,预测时串联各学习器的加权结果。

2.XGBoost和GBDT的区别:

  1. 损失函数上:对于Loss部分是一阶还是二阶展开(二阶更准确)

  2. 正则项上:XGBoost加上树模型复杂度的正则项

  3. 特征选择上:

    • 加入近似算法(不是遍历所有可能取值,而是有间隔的选取候选拆分点/分桶),默认tree_method = “auto”将在中小数据上沿用贪心算法,大数据集上使用近似算法。

    • XGBoost引入随机森林在特征集合抽样的思想,帮助降低过拟合

  4. 基学习器上:gbdt 只能用cart算法的回归树,而xgboost 支持线性分类器 gblinear。

  5. 缺失值处理上:XGBoost在训练时缺失值会被分到左子树和右子树,分别计算目标函数,对比选择较优的分配方式。

  6. 计算速度上——pre_sorted预排序、分箱的近似算法、分布式计算等

3.XGBoost 计算速度上的提升点

  1. 决策树最耗时的步骤是对特征的值排序,XGBoost在迭代之前,先进行预排序,存为block结构,每次迭代重复使用该结构,降低计算,同时各个特征的增益计算可以开多线程进行

    (这里也有一个考点,xgb 的并行和Rf不同,是在选择分割方式时,并行计算各个特征的最佳分割点,而不是并行构造tree,所有 boosting 算法都是additive training 无法并行构造tree)

  2. 分箱 / 近似直方图算法,不是遍历所有可能取值,而是有间隔的选取候选拆分点/分桶,比如连续值直接取分位数。(LightGBM方法采用histogram算法,复杂度更低)

4.目标函数 MAE 二阶不可导问题

有绝对值的目标函数 MAE MAPE 二阶不可导,主流方法是用利用可导函数逼近,比如MSE或者Pseudo-Huber loss function

[公式]

5.XGBoost 如何调参?

所有参数介绍地址

  • 确定 eta(学习率)和 n_estimators(迭代次数=树的个数)
  • 再确定每棵树的基本信息,max_depth 和 min_child_weight(即节点大H值)
  • 再确定全局信息:比如最小分裂增益,采样参数(样本采样 subsample、特征采样colsample_bytree),正则参数(L1-alpha和L2-lambda)
  • 重新降低 eta(学习率),得到最优解

6.XGBoost 过拟合怎么办?

  1. 对树的剪枝:

    • 降低树的深度 max_depth
    • 增大 min_child_weight(即节点大H值)
    • 增大惩罚系数alpha和lambda
  2. subsample 力度变大,降低异常点影响

  3. 减小 learning rate,提高 n_estimators