博客园:梯度提升树(GBDT)原理小结
博客园:一步一步理解GB、GBDT、xgboost
知乎:机器学习算法中GBDT和XGBOOST的区别有哪些?
介绍下rf,adaboost,gbdt,xgboost的算法原理?(注意adaboost,gbdt,xgboost的区别)
RF的算法原理:
随机森林是有很多随机得决策树构成,它们之间没有关联。得到RF以后,在预测时分别对每一个决策树进行判断,最后使用Bagging的思想进行结果的输出;
**主要步骤: **
现在有N个训练样本,每个样本的特征为M个,需要建K颗树
1)从N个训练样本中有放回的取N个样本作为一组训练集(其余未取到的样本作为预测分类,评估其误差)
2)从M个特征中取m个特征左右子集特征
3)重复上述过程K次
4)行程随机森林,通过投票表决确定分类;Adaboost算法原理:
该算法是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法时的学习方法。Adaboost的训练误差是以指数速率下降的,它具有自适应性,它能自适应弱分类器的训练误差率。另外, Adaboost算法是稳健的,具有robost,调参数没有这么麻烦。一般适用于分类问题,也可用于回归。传统的adaboost算法只能适用于二分类的情况。也可以将adaboost算法调整到适合处理多分类任务的方法。
目标函数只能是:指数函数。
主要步骤:
1) 初始化样本的权值为1/n。
2) 基于样本与权值训练弱分类器;这里的弱分类器就是个二分类器。
3) 根据分类器对样本进行判别,如果判别正确,此样本的权值降低,判别错误,降低样本的权值,同时根据识别率计算出此分类器的权值;
4) 利用改变权值的样本训练下一个分类器;
5) 循环得到N个分类器与其对应的权值;
6) 基于加权的分类器组合成为最终的模型。gbdt的算法原理:
gbdt是一种提升树算法,它每次迭代产生一个弱分类器模型,并且累加到总模型中。但是gbdt每一次迭代中弱分类器的生成都是依据损失函数的梯度方向,也就是用梯度下降的方法来拟合残差。
目标函数:分类(对数似然损失,指数损失(sklearn中,如果函数是指数,则等价于adaboost))
回归(‘LS’均方差, ‘lad’ 绝对误差, Hube损失(鲁棒性回归损失,lad和LS的结合))
gbdt与adaboost的区别(除了目标函数外,其他一样),gbdt将adaboost模型中的所分类器改为回归决策树(如果处理分类问题,是通过设定阈值的方法),目标函数不同,优化过程不同。
主要步骤:
1) 将基本学习器初始化为一个常数;
2) 开始迭代:a.根据给定的误差函数,来计算当前模型的梯度,近似残差(对于最小均方误差来说,梯度就是当前模型的结果和label的残差);b.根据梯度(也叫作伪残差)拟合下一个基学习器。c.根据一维线性搜索来计算步长;d.根据步长和学习率对当前模型进行更新;xgboost的算法原理:
xgboost可以说是一种基于梯度提升的加强版本;GBDT通过梯度来拟合残差,只用到了一阶导数信息。而xgboost对目标函数进行二阶泰勒展开,同时用到了一阶导数和二阶导数信息来拟合残差,得到新的目标函数。同时定义的每棵树的复杂度结构部分q和叶子权重部分w,作为正则项加入到新的目标函数中。然后通过贪心算法获取最优切分点,进行划分直到满足某个阈值或得到纯节点。
除此之外,xgboost还有其他优点:支持线性分类器,列抽样,缺失值的处理,并行计算等;补充LightGBM的特点:
微软出了个LightGBM,号称性能更强劲,速度更快。
性能提升的原因主要是两个:①histogram算法替换了传统的Pre-Sorted,某种意义上是牺牲了精度(但是作者声明实验发现精度影响不大)换取速度,直方图作差构建叶子直方图挺有创造力的。(xgboost的分布式实现也是基于直方图的,利于并行)②带有深度限制的按叶子生长 (leaf-wise) 算法代替了传统的(level-wise) 决策树生长策略,提升精度,同时避免过拟合危险。
GBDT算法和随机森林的区别?
- 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
- 组成随机森林的树可以并行生成;而GBDT只能是串行生成
- 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果加权累加起来
- 随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
- 随机森林对异常值不敏感,GBDT对异常值非常敏感
- 随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
GBDT和XGBOOST的区别?
- 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
- 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
- xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
- Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
- 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
- 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
- xgboost工具支持并行。xgboost的并行是在特征粒度上的。xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
- 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
参数调节
GBDT调节参数?
我们把重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。一般先调框架参数,再调弱学习器的参数;
boosting框架相关的重要参数
- n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
- learning_rate: 即每个弱学习器的权重缩减系数,也称作步长,所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的步长开始调参,默认是1。
- subsample: 样本子采样比例,取值为(0,1]。
- init: 即我们的初始化的时候的弱学习器,常数;一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。
- loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。
对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。
对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。 - alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。
GBDT类库弱学习器参数
- max_features 划分时考虑的最大特征数: 默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑$log_2N$个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑$\sqrt{N}$个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。
- max_depth 决策树最大深度。默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
- min_samples_split 内部节点再划分所需最小样本数,默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
- min_samples_leaf 叶子节点最少样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。如果样本量数量级非常大,则推荐增大这个值。
- min_weight_fraction_leaf 叶子节点最小的样本权重和。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。
- max_leaf_nodes最大叶子节点数: 通过限制最大叶子节点数,可以防止过拟合;
- min_impurity_split 节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。
XGBOOST调节参数?
通用参数
- booster [default=gbtree] 有两中模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,-
- gblinear使用线性模型进行提升计算。缺省值为gbtree;
- silent [default=0] 取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时信息。缺省值为0
- nthread XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数
学习目标参数
- Objective “reg:linear” –线性回归。“reg:logistic” –逻辑回归。“binary:logistic” –二分类的逻辑回归问题,输出为概率。“binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。“count:poisson” –计数问题的poisson回归,输出结果为poisson分布。
- “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)“multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
- eval_metric:rmse 均方根误差,mae 平均绝对误差,logloss 负对数似然函数值error 二分类错误率(阈值为0.5),merror 多分类错误率,mlogloss 多分类,logloss损失函数,auc 曲线下面积;
seed:随机数的种子
Parameter for Tree Booster
- eta [default=0.3] 为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。
- gamma [default=0] 节点分裂所需的最小损失函数下降值,这个参数越大,算法越保密。
- max_depth [default=6] 数的最大深度。缺省值为6取值范围为:[1,∞]
- subsample [default=1] GBM中的subsample参数一样。这个参数控制对于每棵树,随机采样的比例
- colsample_bytree [default=1] 和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。
- min_child_weight [default=1] 孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于-
- min_child_weight则拆分过程结束。
- max_delta_step [default=0] 这参数限制每棵树权重改变的最大步长
Parameter for Linear Booster
- lambda [default=0] L2正则的惩罚系数;
- alpha [default=0] L1正则的惩罚系数;
- lambda_bias 在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)