机器学习面经-Xgboost LightGBM
一、简介
XGBoost(Extreme Gradient Boosting)和LightGBM(Light Gradient Boosting Machine)都是梯度提升树(Gradient Boosting Trees)的变种,用于解决各种机器学习问题,如分类、回归和排名。它们都基于集成学习的思想,通过组合多个弱学习器(通常是决策树)来构建一个强大的预测模型。作为机器学习经典的算法,常用来解决各种分类、CTR预估等问题,在各大公司的业务场景也有着广泛的使用。
二、面经
1、XGBOOST的思想是什么?
2、XGBOOST如何寻找最优特征,是有放回还是无放回?
3、XGBOOST中使用了并行化计算,XGBOOST是怎么并行的?
4、XGBOOST的树生长时的精确分裂与近似分裂分别是怎么做的?
5、XGBOOST如何计算特征重要度的?
6、XGBOOST如何停止树的循环生成?
7、XGBOOST二阶泰勒展开去逼近的函数是什么?自变量是什么?
8、为什么要二阶泰勒展开,优势在哪里?
9、如果没有二阶导怎么办?
10、XGBoost与GBDT的联系和区别有哪些?
11、XGBOOST和LightGBM的区别?
12、XGBoost缺失值的处理方法是什么?
13、可以介绍一下XGBOOST中的block结构吗?
14、XGBOOST对类别特征采用one-hot编码,那么其弊端是?
15、XGBOOST是如何做二分类和多分类的?
16、XGBOOST为了控制过拟合,做了什么?
17、XGBOOST的正则项是什么?
18、XGBOOST在处理过拟合的时候,有一个gamma参数,是来干嘛的?
19、XGBOOST的近似直方图算法也类似于LightGBM的直方图算法,为什么XGBOOST的直方图算法要慢很多呢?
20、XGBOOST支持哪几种基分类器?
21、XGBOOST每一轮迭代拟合的是什么?
22、LightGBM对类别特征怎么处理的?
23、Light采用的是many vs many的方式,实现类别特征的划分,具体来说是怎么样的?直方图算法?
24、LightGBM的优势?相对XGBOOST来说的优势,改进?
25、LightGBM做了哪方面的并行?
26、Leaf-wise和Level-wise有什么不同
27、LightGBM中能说说histogram(直方图)算法吗?
28、介绍一下LightGBM中单边梯度采样算法(GOSS)?
29、介绍一下LightGBM中互斥特征捆绑算法(EFB)?
30、LightGBM中特征之间如何捆绑?
三、面经参考回答
1、XGBOOST的思想是什么?
参考回答:XGBOOST的思想简而言之就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的score,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数。最后只需要将每棵树对应的分数加起来就是该样本的预测值。
2、XGBOOST如何寻找最优特征,是有放回还是无放回?
参考回答:XGBoost在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性。XGBoost利用梯度优化模型算法, 样本是不放回的(想象一个样本连续重复抽出,梯度来回踏步会不会高兴)。但 XGBoost 支持子采样, 也就是每轮计算可以不使用全部样本。
3、XGBOOST中使用了并行化计算,XGBOOST是怎么并行的?
参考回答:XGBOOST的并行化并不是类似于RF(随机森林)那样树与树之间并行化训练。XGBOOST同BOOSTING方法一样,在树的训练过程中是串行的,它的并行体现主要有两个方面,首先,它对gbdt作了一些改进,加了线性回归分类器而不是只有cart回归树,但默认参数还是cart回归。为了能加快并行,xgb对特征进行了预排序,存成了block结构,可以直接快速获得切分点增益了,这里有两处并行的操作,第一步是遍历节点,树的一层节点可以并行做,因为xgb是按层不加区分的去切分每一个结点,每个结点都会尝试分类,所以构建的是一个非常茂盛的树,既然每个结点都要尝试分裂,就可以对每个结点并行去切分。结点的切分要选择一个特征的一个分裂点切分,这一步可以在特征维度上并行。由于gbdt类基模型相关性,做不把串行树做到并行的,所以并行主要在结点分裂和特征分裂上。不过为了防止过拟合,当分裂的增益小于阈值时,就不分裂了,算是预剪枝了。
4、XGBOOST的树生长时的精确分裂与近似分裂分别是怎么做的?
参考回答:精确分裂也叫作贪心分裂,是遍历所有特征中可能的分裂点位置。当数据量非常大难以被全部加载进内存时或者分布式环境下时,贪心算法将不再合适。近似分裂通过特征的分布,按照分位数确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。分位数的确定考虑了样本点在当前特征下的权重,权重值取损失函数的二阶导数在该样本点下的值。分裂算法有两种,一种是精确的分裂,一种是近似分裂算法,精确分裂算法就是把每个属性的每个取值都当作一次阈值进行遍历,采用的决策树是CART。近似分裂算法是对每个属性的所有取值进行分桶,按照各个桶之间的值作为划分阈值,xgboost提出了一个特殊的分桶策略,一般的分桶策略是每个样本的权重都是相同的,但是xgboost使每个样本的权重为损失函数在该样本点的二阶导。
5、XGBOOST如何计算特征重要度的?
参考回答:一般来说,特征重要性分数,衡量了特征在提升决策树构建中的价值,一个属性越多的被用来在模型中构建决策树,它的重要性就相对越高。特征重要性是通过统计Xgboost所有树中各特征被用于最优分裂的加权计数得到,并进行了排序。在单个决策树中通过属性分裂点改进性能度量来计算属性的重要性,由节点负责加权和记录次数。也就说一个属性对分裂点改进性能度量越大(越靠近根节点),权值越大,被越多提升树所选择,属性越重要。比如说一个属性在一个由两棵树构成的xgboost中,得分是由该属性分别在1,2树中作为最优属性的次数乘以权重后的平均值。最终将一个属性在所有提升树中的结果进行加权求和然后求平均,得到重要性评分。
6、XGBOOST如何停止树的循环生成?
参考回答:这里主要通过三个参数来限制树的一个循环生成。设置树的最大深度、当样本权重和小于设定阈值时停止生长以防止过拟合。具体而言:
- 设定一个阀值:当引入的分裂带来的增益小于设定阀值的时候,我们可以忽略掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思,阈值参数为(即正则项里叶子节点数T的系数)。
- 设置超参数max_depth:当树达到最大深度时则停止建立决策树,避免树太深导致学习局部样本,从而过拟合。
- 设置样本的权重: 样本权重和小于设定阈值时则停止建树。什么意思呢,即涉及到一个超参数:最小的样本权重min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样。大意就是一个叶子节点样本太少了,也终止同样是防止过拟合。
7、XGBOOST二阶泰勒展开去逼近的函数是什么?自变量是什么?
参考回答:自变量是叶子结点的权重,每棵树存到叶子结点下,这个叶子结点就有一个权重,XGBOOST第一要学习的是结构,结构就是每一个结点用什么特征去分裂,以及用哪些特征值。
8、为什么要二阶泰勒展开,优势在哪里?
参考回答:主要有两点原因:1、xgboost是以mse为基础推导出来的,在mse的情况下,xgboost的目标函数展开就是一阶项+二阶项的形式,为了后续推导的统一,所以将目标函数进行二阶泰勒展开,就可以直接自定义损失函数了,只要二阶可导即可,增强了模型的扩展性。2、二阶信息能够让梯度收敛的更快,类似牛顿法比SGD收敛更快。一阶信息描述梯度变化方向,二阶信息可以描述梯度变化方向是如何变化的。
9、如果没有二阶导怎么办?
参考回答:gbdt的目标函数与xgboost区别就是带不带正则项(算法内容上)。gbdt对损失函数的优化是直接使用了损失函数的负梯度,沿着梯度下降的方向来减小损失,其是也就是一阶泰勒展开。而xgboost在这里使用了二阶泰勒展开,因为包含了损失函数的二阶信息,其优化的速度大大加快。但如果loss没有二阶导数,就使用一阶导数优化。
10、XGBoost与GBDT的联系和区别有哪些?
参考回答:XGBoost与GBDT两者的联系和区别如下:
- GBDT是机器学习算法,XGBoost是该算法的工程实现。
- XGBoost工具在训练的时候支持并行,它在每棵树寻找分裂点的时候,是可以进行并行计算的,对于每一个特征,他都需要计算这个特征分裂的时候的方差,然后选择一个方差最小的进行分类,这个过程是可以并行进行的,因为它在计算这个特征的分类方差的时候,并不会影响到其他的特征的计算。所以,XGBOOST将各列分块存储,在进行各列的分裂点计算查找时,可以在多线程,或者多台机器上并行进行。
- 在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,正则项包括树的叶子结点个数,有利于防止过拟合,从而提高模型的泛化能力。
- GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数,训练速度更快。
- 传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器,这个时候相当于带L1和L2正则项的逻辑回归(分类)或者是线性回归(回归)。
- Shrinkage(缩减):相当于学习速率,xgboost在进行完一次迭代后,会将叶子结点的权重乘以该系数,主要是为了削弱每一颗树的影响,让后面有更大的学习空间。
- 列抽样,XGBoost借鉴了随机森林的做法,支持列采样,不仅能降低过拟合,还能减少计算。传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略。
11、XGBOOST和LightGBM的区别?
参考回答:XGBoost与LightGBM两者的联系和区别如下:
- 切分算法(切分点的选取):XGBoost通过对所有特征都按照特征的数值进行预排序选取最
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
林小白的机器学习指南,从本人面试的机器学习算法岗位出发,对机器学习“八股文”做详细的介绍、推导;