目录
1.XGB
2.CART树
3.损失函数
4.分裂结点算法
5.正则化
6.算法(怎么学习)
7.对缺失值处理
8.优缺点
9.应用场景
10.sklearn参数
XGBoost(eXtreme Gradient Boosting)是一种tree boosting的可扩展机器学习系统。这个系统可以作为开源的软件包使用。
XGBoost是一个优化的分布式梯度增强库,旨在实现高效,灵活和便携。 它在Gradient Boosting框架下实现机器学习算法。 XGBoost提供了并行树提升(也称为GBDT,GBM),可以快速准确地解决许多数据科学问题。 相同的代码在主要的分布式环境(Hadoop,SGE,MPI)上运行,并且可以解决超过数十亿个样例的问题。
分类与回归树(Classification and Regression Trees, CART)是由四人帮Leo Breiman, Jerome Friedman, Richard Olshen与Charles Stone于1984年提出,既可用于分类也可用于回归。不同于C4.5,CART本质是对特征空间进行二元划分(即CART生成的决策树是一棵二叉树),并能够对标量属性(nominal attribute)与连续属性(continuous attribute)进行分裂。
CART算法流程:
学习策略或者学习目标。
如下:
第一项为训练误差,第二项为正则化项,用来刻画模型的复杂程度。具体形式将在(5.正则化)中介绍。
XGBoost度损失函数进行了二阶泰勒展开:
从损失函数中我们能够看出,我们希望得到一个预测性好的简单模型。预测性好的模型偏差较小,简单模型方差较小。
对于每一个叶子节点,尝试进行分裂,分裂前后目标函数的差值为:
第一项为左子节点的得分,第二项为右子节点的得分,第三项为增加一个额外节点复杂度的损失。
采用贪心算法寻找最优分裂点:对每个特征,对它的可能取值进行排序,并通过线性扫描从中找到该特征的最优分裂点,之后找到所有特征中的最优分裂点。
论文中的方法:
1)贪心算法
2)近似算法:针对数据太大,不能直接进行计算
通过特征的分布,按照分布式加权直方图算法确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。
在寻找split point的时候,不会枚举所有的特征值,而会对特征值进行聚合统计,然后形成若干个bucket(桶),只将bucket边界上的特征值作为split point的候选,从而获得性能提升。
定义了一种模型复杂度(不唯一):
T表示叶子节点的数量,第二项表示叶子节点得分的L2范数。
这里出现了γ和λ,这是xgboost自己定义的,在使用xgboost时,可以设定它们的值,显然,γ越大,表示越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大。λ越大也是越希望获得结构简单的树。
左边第二项是我们需要新添加的树。
所以新添加的树应该是的红圈中的部分最小。
当考虑平方损失时,可以得到:
考虑更一般的情况,将目标函数第一项泰勒展开,略去高次得到如下形式:
去除常数项之后我们的找新的目标函数:
假设树的结构是定的,可以得到叶子节点的最优得分以及对应的目标函数的值:
但是树的可能的结构有无穷多个,不能进行枚举。
(1)单节点树
(2)节点分裂算法(见4.分裂节点算法)
(3)怎样找到最优分裂?
对每个特征,对它的可能取值进行排序,并通过线性扫描从中找到该特征的最优分裂点,之后找到所有特征中的最优分裂点。
(1)每轮添加一颗新树
(2)在每一轮中:
XGB训练数据的时候,它使用没有缺失的数据去进行节点分支。然后我们将特征上缺失的数据尝试放左右节点上,看缺失值应当分到那个分支节点上。我们把缺失值分配到的分支称为默认分支。这能大大提升算法的效率。
与GBDT相比,xgBoosting有以下进步:
1)GBDT以传统CART作为基分类器,而xgBoosting支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题);
2)GBDT在优化时只用到一阶导数,xgBoosting对代价函数做了二阶Talor展开,引入了一阶导数和二阶导数;
3)当样本存在缺失值是,xgBoosting能自动学习分裂方向;
4)xgBoosting借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算;
5)xgBoosting的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合;
6)xgBoosting在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
7)xgBoosting工具支持并行,但并不是tree粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,xgBoosting在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行;
8)可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;
与LightGBM相比,又表现出了明显的不足:
1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时,LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低;
2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;LightGBM采用深度优化,leaf-wise生长策略,每次从当前叶子中选择增益最大的结点进行分裂,循环迭代,但会生长出更深的决策树,产生过拟合,因此引入了一个阈值进行限制,防止过拟合.
参考:https://blog.csdn.net/u013363120/article/details/80195471
可以用于分类和回归问题。在数据挖掘等相关竞赛以及实际工程中都有应用。
定义学习任务及相应的学习目标,可选的目标函数如下:
“reg:linear” –线性回归。
“reg:logistic” –逻辑回归。
“binary:logistic” –二分类的逻辑回归问题,输出为概率。
“binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。
“count:poisson” –计数问题的poisson回归,输出结果为poisson分布。 在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)
“multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
“multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。
“rmse”: 均方根误差
“logloss”: 负对数似然函数值
“error”: 二分类错误率(阈值为0.5)
“merror”: 多分类错误率
“mlogloss”: 多分类logloss损失函数
“auc”: ROC曲线下面积
"mae":平均绝对误差
L2 正则的惩罚系数
L1 正则的惩罚系数
在偏置上的L2正则。缺省值为0
为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3 。取值范围为:[0,1]
数的最大深度。缺省值为6 ,取值范围为:[1,∞]
孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越conservative 。取值范围为: [0,∞]
可选 {‘auto’, ‘exact’, ‘approx’} 贪心算法(小数据集)/近似算法(大数据集)
参考:https://www.cnblogs.com/harvey888/p/7203256.html