本文主要介绍xgboost常见的面试问题,主要回答如下几个问题:
1.GBDT的原理,且介绍与xgboost的区别。
2.决策树节点分裂时如何选择特征。
3.分类树和回归树的区别。
4.与Random Forest作比较,并介绍什么是模型的Bias和Variance。
5.xgboost的参数调优,同时说明xgb的正则化原理。
1.GBDT的原理GBDT是一种基于boosting集成思想的加法模型,训练时采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。
xgboost是基于GBDT的思想上做了一些优化,如下:
1.GBDT以传统CART作为基分类器,而xgboosting支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题);
2.GBDT在优化时只用到一阶导数,xgboost对代价函数做了二阶Talor展开,引入了一阶导数和二阶导数;
3.当样本存在缺失值是,xgboost能自动学习分裂方向;
4.xgboost借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算;
5.xgboost的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合;
6.xgboost在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
7.xgboost工具支持并行,但并不是tree粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,xgBoosting在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行;
8.可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;
2.决策树节点分裂时如何选择特征,写出Gini index和Information Gain的公式并举例说明
1.信息增益(Information Gain)
信息增益用在ID3决策树中。
介绍信息增益,首先要了解什么是熵:
熵:随机变量不确定性大小的度量,熵越大,变量的不确定性就越大。
熵的计算公式为:
条件熵:H(Y|X)表示在随机变量X的条件下随机变量Y的不确定性。Y即是数据集,X是某个特征,即条件熵就是数据集在特征A划分条件下的熵。
条件熵的计算公式为:
信息增益:数据集D的熵H(D)与特征A给定条件下D的条件熵H(D|A)之差。g(D|A)=H(D)-H(D|A)
2.基尼系数(Gini index)
CART树分为回归树和分类树,CART分类树结点选择特征进行分裂时选择特征的方法就是基尼指数, 分类问题中,假设有K个类,样本点属于第k类的概率为pk,则概率分布的基尼指数定义为:
基尼指数Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)表示经A=a分割后集合D的不确定性,基尼指数越大,样本集合的不确定性也就越大,与熵类似。
3.分类树和回归树的区别是什么?
首先,GBDT构建CART树,无论是分类还是回归,都是使用的回归树,因为分类树无法处理连续值,负梯度一般都是连续值,拿二分类举例,比如真实值是1,构建第一棵树预测值也只有1或者0,第一棵树预测为1,1-1=0,结束。。。
那么接下来说区别:
1.CART里分类节点分裂时特征选择用gini, 回归用均方差mse,度量目标是对于划分特征A,对应划分点s两边的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小。
2.对于决策树建立后做预测的方式,CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。回归树输出不是类别,采用叶子节点的均值或者中位数来预测输出结果。
4.与Random Forest作比较,并介绍什么是模型的Bias和Variance
1.构建随即森林的树可以为分类树或者回归树;GBDT只能是回归树,累加只能为回归树。
2.随即森林的树可以并行生成,GBDT智能串行,即使是xgboost的并行,也并非是并行构建树。
3.随机森林采用多数投票或简单平均等;而GBDT则是将所有结果累加起来,或者加权累加起来,可通过学习率来调整每棵树的影响。
4.随机森林对异常值不敏感,GBDT对异常值非常敏感。
5.随机森林支持有放回采样+列采样。
5.随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成。
6.随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能,偏差太大容易欠拟合,方差太大容易过拟合。但是xgb引入了正则项和列采样等等正则化手段之后,可以在少量增加偏差的情况下大幅度缩减模型的方差。
可以参考如下回答 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?
5.XGBoost的参数调优有哪些经验?
首先我把我常用的参数整体的介绍一下,然后再介绍一下我调参时候的经验:
其实调参数主要就是调过拟合和欠拟合,下面我分别来说一下:
1.欠拟合
欠拟合的一般都是初始调参的时候,参数首先调的是树的深度和棵数,根据经验可以先给个默认值,棵数我一般习惯给100棵,但是深度一定不太深,一般5-7就行,因为对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。如果还是欠拟合,就调小学习率eta,eta区间一般为[0.8,1.0],减少每棵树的影响,然后增加树的棵树。
2.过拟合
过拟合我理解主要是调损失函数的参数,其他参数都是辅助
1)xgboost的损失函数如下:其中第一部分便是这个
损失函数。第二部分是
正则化函数 正则化函数函数如下:
这里主要有三个参数:
gamma( ), alpha( ),lambda( ) gamma( ):作为T的正则化参数,作用是让T尽可能小,gamma越大,算法越保守,所以gamma调的是树的叶节点进一步分裂所需要最小损失减少量,这个参数我一般都是0。
而xgboost分裂节点的策略是左右两个字节点的目标函数值之和比父节点小则分裂。这里就会用到一个差值,两个子节点的目标函数减去父节点的目标函数值要大于0。这里gamma算是一个常数,则有:
上述共识是目标函数的差,基本上是由损失函数的减少量贡献的。
alpha( ):没有关于alpha在数学公式里面的描述。但是它作为l1正则化参数确实有意义并且存在,这个参数我一般是1-2之间
lambda( ):lambda如上述公式所示,为l2正则化参数,这个参数一般是1-2之间
2)其他常用参数:下面这种比例的参数,我一般都设置在[0.8,1.0],用网格搜索找寻最佳比例
colsample_bytree :每次生成树的时候随机选取列数的比例。
colsample_bylevel:这个就相比于前一个更加细致了,它指的是每棵树每次节点分裂的时候列采样的比例。
subsample:每次训练的时候随机采样的比例,我觉得这应该指的是行采样吧。
base_score:初始化预测分数,正常都是0.5,但是如果我们正负样本过于不均衡的时候,需要对这个参数进行适当调整。