机器学习面试——XGBoost,GBDT,RF

238 阅读5分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。​​

​ 1、常见的集成思想

bagging: 基学习器之间并行训练,且学习器之间没有依赖,像是集体决策的过程,每个个体都进行单独学习,再通过投票的方式做最后的集体决策。常见的算法有随机森林

boosting: 基学习器之间串行训练,且学习器之间存在依赖,将基学习器层层叠加,每一层在训练的时候,对前一层基学习器分错的样本给予更高的权重。类似于人类的学习过程,对于错误,进行加强学习,直到犯错误的次数减少到很低的程度。常见的算法有AdaBoost、GBDT、XGBoost

Stacking: 首先使用原始数据训练出一级学习器,将一级学习器的输出作为输入并使用对应原始标记作为新标记,组成新的数据集来训练二级学习器(结合学习器)。常用于模型融合。

2、从偏差和方差的角度解释Bagging和Boosting

偏差是由于分类器的表达能力有限导致的系统性错误;

方差是由于分类器对于样本分布过于敏感,导致在训练样本数较少时,产生过拟合;

bagging是采用分而治之策略,通过对训练样本进行多次采样,并分别训练出不同模型,然后做综合,减小集成分类器之间的方差。

boosting是通过逐步聚焦于基学习器分错的样本,减小集成分类器的偏差。

2、随机森林的随机性?

数据集:有放回随机取样

特征:随机选取特征,进行分割点计算

3、Adboost、提升树(boosting tree),梯度提升树的异同?

相同:

  • 加法模型:模型是基学习器进行累加,得到一个最终的加法模型。
  • 前向分步算法:从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数,简化优化的复杂度。

区别:

Adaboost的实现步骤:

(1)初始化权重分布,假设模型有均匀的权值分布。D_{1}={w_{11},w_{12},...,w_{1n}}

(2)对数据进行学习,计算Gm(分类器)在训练数据集上的分类误差率,

(3)计算Gm(分类器)系数​,系数代表在最终分类器上的重要性。

(4)更新权重​D_{m+1}​​(m步的权重分布),D_{1}={w_{m1},w_{m2},...,w_{mn}}

(5)对基学习器进行累加,组成线性组合​,得到最终的分类器:

注释:I(x)是指示函数,sign(x)是符号函数。

I_{A}(x)=\left {\begin{matrix} 1 , x\in A \ 0,x\notin A \end{matrix} \right.​,​sign(x)=\left { \begin{matrix} -1,x<0\ 0,x=0\ 1,x>0 \end{matrix} \right.​​

提升树(Boosting Tree)的实现步骤:

提升方法实际采用加法模型和前向分布算法,以决策树为基函数的提升方法称为提升树,对分类问题决策树是二叉分类树,损失函数时指数损失,对于回归问题决策树是二叉回归树,损失函数是均方损失。

分析:

其中,r是当前模型拟合数据的残差。

梯度提升树(Gradient boosting DT):

将当前模型损失函数的负梯度作为残差的近似替换值。

4、RF和GBDT的区别

相同点:都用了集成思想

不同点:

  • RF是bagging思想,减小了方差,GBDT是boosting思想,减小了偏差
  • RF是串行,GBDT是并行
  • RF是分类和回归树,GBDT只能回归树
  • RF是采用投票进行最终决策,GBDT是多棵树累加决策
  • RF对异常值不敏感,且不需要归一化,GBDT对异常值敏感(串行),需要归一化(GBDT的树是在上一颗树的基础上通过梯度下降求解最优解,归一化能收敛的更快,而随机森林本来就是通过减少方差提高性能的,树之间建立关系是独立的,不需要归一化)

5、GBDT的缺点?

  • 在高维稀疏的数据集上,表现性不好。
  • 训练过程是串行,需要在决策树内部采用一些局部并行的手段提高训练速度。

6、GBDT和XGBoost的异同?

不同:

  • GBDT用了一阶导数信息,XGBoost用了一阶、二阶导数信息
  • GBDT不执行并行化,XGBoost在数据和特征方便增加了并行化处理,(数据采样、特征重要性排序)
  • GBDT对异常值敏感,XGBoost新增了缺失值处理策略
  • GBDT只能是树模型,XGBoost可以自定义基学习器
  • XGBoost增加了正则化的策略

7、Xgboost 如何寻找最优特征?是有放回还是无放回呢?

Xgboost在训练的过程中给出各个特征的增益评分,最大增益的特征会被选出来作为分裂依据,从而记忆了每个特征对在模型训练时的重要性。从根到叶子中间节点涉及某特征的次数作为该特征重要性排序。Xgboost是不放回,还支持子采样和列采样。

8、Xgboost为什么要用泰勒展开,优势在哪里?

XGBoost使用了一阶和二阶偏导,二阶导数有利于梯度下降的更快更准,使用泰勒展开取得函数做自变量的二阶导数形式,可以再不选定损失函数具体形式的情况下,仅仅依靠输入数据的值就可以进行叶子分裂优化算法,本质上将损失函数的选取和模型算法优化/参数选择分开,这种去耦合增强了XGBoost的适用性,使得模型按需选取损失函数。

9、RF如何处理缺失值?

方法一:将数值型变量中的缺失值用其所对应类别中的中位数替换。把描述型变量缺失的部分用所对应类别出现最多的数值替代。

方法二:在方法一的基础上做了升级,引入了权重变量,即对需要替换的数据先和其他数据做相似度测量,如果是分类变量,则用没有缺失的观测实例相似度的权重投票,如果是连续型变量,则用加权平均和进行填充

10、XGBoost如何处理缺失值?

xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。

11、随机森林如何评估特征重要性?

12、XGBoost如何给特征评分?

在CART树中,通过基尼指数选取分离点的特征,一个特征被选中的次数越多,该特征的评分就越高。

在XGboost中,枚举不同的树结构,利用打分函数来寻找最优的结构树。从树深度0开始,每个节点遍历所有特征,对于单个特征,首先对特征的值进行排序,然后线性扫描该特征进行选择最好的切割点,再比较所有的特征,选择信息增益增高的特征为当前节点。

假设年龄这个特征,我们首先对年龄进行排序,设定阈值a,将小于阈值a的分为一类,大于阈值a的分为一类,计算该特征的基尼指数,若存在多个阈值,就会出现多个基尼指数值,选择最大的那个为当前的阈值,并计算所有特征(年龄、性别、职业等),选择最大的gini指数的特征为当前节点。这种只看到当前节点的思想就是greddy exact。

引入新叶子的惩罚项是为了优化目标函数,对应了树的剪枝,当分割阈值小于惩罚项,就忽略这个分割。