常见面试题汇总:RF、GBDT、XGBoost
1:RF与GBDT之间的区别
(1)相同点
- 都是由多棵树组成
- 最终的结果都是由多棵树一起决定
(2)不同点
- 组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成
- 组成随机森林的树可以并行生成,而GBDT是串行生成
- 随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和
- 随机森林对异常值不敏感,而GBDT对异常值比较敏感
- 随机森林是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的
- 随机森林不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化
2:分类树和回归树的区别
(1)传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的
(2)传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。为什么xgboost要用泰勒展开,优势在哪里?xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
(3)Xgboost在代价函数里加入了正则项,用于控制模型的复杂度,降低了过拟合的可能性。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和
(4)Xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行
5:N问GBDT
(1)怎样设置单棵树的停止生长条件?
答:A. 节点分裂时的最小样本数
B. 最大深度
C. 最多叶子节点数
D. loss满足约束条件
(2)如何评估特征的权重大小?
答:a. 通过计算每个特征在训练集下的信息增益,最后计算每个特征信息增益与所有特征信息增益之和的比例为权重值。
b. 借鉴投票机制。用相同的gbdt参数对w每个特征训练出一个模型,然后在该模型下计算每个特征正确分类的个数,最后计算每个特征正确分类的个数与所有正确分类个数之和的比例为权重值。
(3)当增加样本数量时,训练时长是线性增加吗?
答:不是。因为生成单棵决策树时,对于损失函数极小值
与样本数量N不是线性相关
(4)当增加树的棵树时,训练时长是线性增加吗?
答:不是。因为每棵树的生成的时间复杂度不一样。
(5)当增加一个棵树叶子节点数目时,训练时长是线性增加吗?
答:不是。叶子节点数和每棵树的生成的时间复杂度不成正比。
(6)每个节点上都保存什么信息?
答:中间节点保存某个特征的分割值,叶结点保存预测是某个类别的概率。
(7)如何防止过拟合?
答:a. 增加样本(data bias or small data的缘故),移除噪声。
b. 减少特征,保留重要的特征(可以用PCA等对特征进行降维)。
c. 对样本进行采样(类似bagging)。就是建树的时候,不是把所有的样本都作为输入,而是选择一个子集。
d. 对特征进行采样。类似样本采样一样, 每次建树的时候,只对部分的特征进行切分。
(8) gbdt在训练和预测的时候都用到了步长,这两个步长一样么?都有什么用,如果不一样,为什么?怎么设步长的大小?(太小?太大?)在预测时,设太大对排序结果有什么影响?跟shrinking里面的步长一样么这两个步长一样么?
答:训练跟预测时,两个步长是一样的,也就是预测时的步长为训练时的步长,从训练的过程可以得知(更新当前迭代模型的时候)。
都有什么用,如果不一样,为什么?答:它的作用就是使得每次更新模型的时候,使得loss能够平稳地沿着负梯度的方向下降,不至于发生震荡。