机器学习:集成算法 - xgboost

xgboost(eXtreme Gradient Boosting)

  • 大规模并行 boosting tree 的工具,据说是现在最好用的 boosting 算法,针对传统 GBDT 算法做了很多改进

xgboost 和传统 GBDT 的区别

  • GBDT 基学习器只用 CART 树,而 xgboost 除了用 CART 树,还可以用其他分类器
  • 优化目标函数里,用到了二阶导数信息,能够更快地收敛,而普通的 GBDT 只用到一阶
  • 优化目标函数里,对衡量模型复杂度的正则项进行了改进,GBDT 只对叶子个数做惩罚,而 xgboost 对叶子个数做惩罚的同时,还对叶子节点的权值做惩罚,有效地避免了过拟合
  • 利用优化目标函数的推导作为树的分裂准则
  • 在分割节点、寻找最佳分割点的时候,可以引入并行计算
  • 利用了特征的稀疏性
  • 能处理特征缺失
  • 支持列采样

输出函数

设有样本数据 \(\normalsize (x_{i}, y_{i})_{i=1}^{n}\)

j 棵树记为 \(\normalsize f_{j}(x)\)

则由 m 棵树组成的 xgboost 输出为

??\(\normalsize y_{i} = F_{m}(x_{i}) = F_{m-1}(x_{i}) + f_{m}(x_{i}) = \sum_{j=1}^{m}f_{j}(x_{i})\)

看起来就和 GBDT 一样,但 xgboost 的优化函数不一样

优化目标函数

xgboost 的优化目标函数为

??\(\normalsize Obj = \sum_{i=1}^{n}L(y_{i}, F_{m}(x_{i})) + \Omega(F)\)

??\(\normalsize \Omega(F) = \gamma T +\frac{1}{2}\lambda\sum_{k}^{T}(||w_{k}||^{2})\)

??其中 \(\small T\) 是所有树的叶子节点的总数,\(\small w\) 是每个叶子节点的系数

泰勒展开公式

??\(\normalsize f(x+\Delta x) = \frac{f(x)}{0!} + \frac{f^{'}(x)}{1!}\Delta x + ... + \frac{f^{(n)}(x)}{n!}\Delta x^{n} + R_{n}(x)\)
??
??其中 \(\small R_{n}(x)\)是泰勒公式的余项,是 \(\small \Delta x^{n}\)的高阶无穷小

将优化目标函数按泰勒公式展开,并取前三项目得到近似值

??\(\normalsize Obj = \sum_{i=1}^{n}L(y_{i}, F_{m}(x_{i})) + \Omega(F)\)

???? \(\normalsize = \sum_{i=1}^{n}L(y_{i}, y_{i(m-1)}+f_{m}(x_{i})) + \Omega(F)\)

???? \(\normalsize = \sum_{i=1}^{n}[L(y_{i}, y_{i(m-1)}) +\frac{\partial L(y_{i}, y_{i(m-1)})}{\partial y_{i(m-1)}}f_{m}(x_{i})\)

?????? \(\normalsize + \frac{1}{2}\frac{\partial^{2} L(y_{i}, y_{i(m-1)})}{\partial^{2} y_{i(m-1)}}f^{2}_{m}(x_{i})] + \Omega(F)\)

将一阶导数记为 \(\normalsize g_{i}\) 将二阶导数记为 \(\normalsize h_{i}\) 改写为

??\(\normalsize Obj = \sum_{i=1}^{n}[L(y_{i}, y_{i(m-1)}) +g_{i}f_{m}(x_{i}) + \frac{1}{2}h_{i}f^{2}_{m}(x_{i})] + \Omega(F)\)

由于在计算第 m 棵树的时候,前 m-1 棵树已经确定,所以可以只保留和第 m 棵树有关的项,将优化目标改写为

??\(\normalsize Obj = \sum_{i=1}^{n}[g_{i}f_{m}(x_{i}) + \frac{1}{2}h_{i}f^{2}_{m}(x_{i})] + \Omega(f_{m})\)

设 \(\normalsize f_{m}\) 的每个叶子节点是输出一个固定的值 \(\normalsize w_{j}\)
设 \(\normalsize I_{j}\) 代表所有会被映射到叶子节点 \(\normalsize j\) 的 \(\normalsize x_{i}\) 集合
设 \(\normalsize T\) 代表 \(\normalsize f_{m}\) 的叶子节点数

进一步改写为

??\(\normalsize Obj = \sum_{j=1}^{T}[(\sum_{i\in I_{j}}g_{i})w_{j} + \frac{1}{2}(\sum_{i\in I_{j}}h_{i})w_{j}^{2}] + \gamma T +\frac{1}{2}\lambda\sum_{j=1}^{T}(w_{j}^{2})\)

???? \(\normalsize = \sum_{j=1}^{T}[(\sum_{i\in I_{j}}g_{i})w_{j} + \frac{1}{2}(\sum_{i\in I_{j}}h_{i}+\lambda)w_{j}^{2}] + \gamma T\)

设有

??\(\normalsize G_{j} = \sum_{i\in I_{j}}g_{i}\)
??\(\normalsize H_{j} = \sum_{i\in I_{j}}h_{i}\)

可改写为

??\(\normalsize Obj = \sum_{j=1}^{T}[(G_{j}w_{j} +\frac{1}{2}(H_{j}+\lambda)w_{j}^{2}] + \gamma T\)

对 \(\normalsize w_{j}\) 求导并另导数为 0

??\(\normalsize G_{j}+(H_{j}+\lambda)w_{j} = 0\)

得到最优的
?
??\(\normalsize w_{j} = -\frac{G_{j}}{H_{j} + \lambda}\)
?
??\(\normalsize Obj = -\frac{1}{2}\sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda} + \gamma T\)
?
用于衡量树的优劣的就是 \(\normalsize Obj\),其值越小,树结构越好

分裂叶子节点的依据

假设现在有一个叶子节点,属于这个叶子节点的样本的一阶导数的和为 \(\normalsize G_{M}\),二阶导数的和为 \(\normalsize H_{M}\),如果需要对这个叶子节点分裂成两个节点,那么叶子节点数量就 +1,假设分到左叶子的样本的值为 \(\normalsize G_{L}\) 和 \(\normalsize H_{L}\),分到右叶子的样本的值为 \(\normalsize G_{R}\) 和 \(\normalsize H_{R}\),则有 \(\normalsize G_{L} + G_{R} = G_{M}\) 以及 \(\normalsize G_{L} + G_{R} = H_{M}\),那么 \(\normalsize Obj\) 减小的值为
?
??\(\normalsize Gain = (-\frac{1}{2}\frac{G_{M}^{2}}{H_{M} + \lambda} + \gamma T) - (-\frac{1}{2}\frac{G_{L}^{2}}{H_{L}+\lambda} - \frac{1}{2}\frac{G_{R}^{2}}{H_{R} + \lambda} + \gamma(T+1))\)
?
????? \(\normalsize = \frac{1}{2}[\frac{G_{L}^{2}}{H_{L} + \lambda} + \frac{G_{R}^{2}}{H_{R} + \lambda} - \frac{(G_{L} + G_{R})^{2}}{(H_{L} + H_{R})+\lambda}] - \gamma\)
?
选择使得 \(\normalsize Gain\) 值最大的分割特征和分割点
??
并计算分割后新的叶子节点的系数
??
??\(\normalsize w_{L} = -\frac{G_{L}}{H_{L} + \lambda}\)
??
??\(\normalsize w_{R} = -\frac{G_{R}}{H_{R} + \lambda}\)
??
停止分割的条件
??○?如果最大的 \(\normalsize Gain\) 比 \(\normalsize\gamma\) 还小
??○?树已经达到了最大深度
??○?样本权重和小于某一个阈值

寻找最佳分裂点

  • 精确算法 - 穷举法
    ??遍历所有特征的所有特征值,该方法精度高但计算量大
  • 近似算法 - 分位点分割
    ??每个特征按照样本特征值的百分比选择候选分裂点
    ??近似法又有两种
    ??(1) 全局法:生成树之前就确定候选分裂点,这可以减少计算,但要一次取比较多的点
    ??(2) 局部法:每个节点确定候选分裂点,每次取的点较少,且可不断改善,但计算量大
  • 近似算法 - 二阶导数的分位点分割
    ??同样是按百分比选择候选分裂点,但不是直接用特征值,而是用二阶导数 \(\small h\)

提高计算速度

  • 提前计算和排序
    ?生成树的过程是串行的,在生成第 m 棵树时,第 m-1 棵树已经有了
    ?这样每个样本的一阶和二阶导数是已知的,可提前计算所有样本的 \(\normalsize g\) 和 \(\normalsize h\) 值,并提前排序
    ?如果是近似算法,还可以提前将各个分位点之间的 \(\normalsize g\) 和 \(\normalsize h\) 值进行累加得到 \(\normalsize G\) 和 \(\normalsize H\) 值
  • 并行分裂节点
    ?每个节点的分裂都是独立互不影响的,所以可以并行计算
    ?每个节点的分裂要遍历所有特征,特征计算也可以并行处理
  • 存储优化
    ?采用 Block 结构以稀疏矩阵 CSC 存储特征数据并排序,后续的并行计算可以重复使用 Block
    ?Block 按列存储,方便计算
    ?Block 的特征需要指向对应样本的导数值,会导致非连续内存访问,使用缓存预取来避免
    ?不同的 Block 可以存在不同的机器上,该方法对局部近似法尤其有效
    ?当数据太大无法全写入内存时,需要将 Block 压缩落盘,然后有独立的线程做读取解压

特征评价

xgboost 有三个指标用于对特征进行评价

  • weight - 某个特征被用于分裂的次数
  • gain - 某个特征被用于分裂时得到的平均增益
  • cover - 某个特征在分裂时结点处的平均二阶导数

学习率(Shrinkage)

和 GBDT 一样,xgboost 也使用了学习率做 Shrinkage,在计算出了节点的 \(\normalsize w\) 值后,会乘以一个小于 1 的系数,这能够防止过拟合

列采样

xgboost 支持列抽样,能避免过拟合,同时能减少计算

稀疏数据

xgboost 能学习缺失值的分裂方向,在分裂的过程中,会尝试把所有特征缺失的样本都分入左节点,或是都分入右节点,看是哪边增益大,然后决定其分裂方向

原文地址:https://www.cnblogs.com/moonlight-lin/p/12436668.html

时间: 2024-08-30 12:34:57

机器学习:集成算法 - xgboost的相关文章

随机森林与集成算法

决策树: 使用决策树算法,我们从树根开始,基于可获得最大信息增益(information gain,IG)的特征来对数据进行划分,我们将在下一节详细介绍信息增益的概念. 通过迭代处理,在每个子节点上重复此划分过程,直到叶子节点.这意味着在每一个节点处,所有的样本都属于同一类别. 在实际应用中,这可能会导致生成一棵深度很大且拥有众多节点的树,这样容易产生过拟合问题,由此,我们一般通过对树进行“剪枝”来限定树的最大深度. 最大化信息增益——获知尽可能准确的结果 为了在可获得最大信息增益的特征处进行节

机器学习常见算法分类汇总

机器学习常见算法分类汇总 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里 IT 经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的类似性. 学习方式 根据数据类型的不同,对一个问题的建模有不同的方式.在机器学习或者人工智能领域,人们首先会考虑算法的学习

[Machine Learning] 机器学习常见算法分类汇总

声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.本文为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的分类. 博主根据原创基础上加入了遗

人工智能之机器学习常见算法

摘要 之前一直对机器学习很感兴趣,一直没时间去研究,今天刚好是周末,有时间去各大技术论坛看看,刚好看到一篇关于机器学习不错的文章,在这里就分享给大家了. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里IT经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法

6.集成算法boosting----AdaBoost算法

1.提升算法 提升算法实为将一系列单一算法(如决策树,SVM等)单一算法组合在一起使得模型的准确率更高.这里先介绍两种Bagging(代表算法随机森林),Boosting(代表算法AdaBoost-即本篇核心) Bagging思想:以随机森林为例 假设样本集的总样本量为100个,每个样本有10个特征(也就是维度是10):随机取样的比例一般为(60%-80%) 步骤1 :我们随机从中拿出60个数据(注意这里是有放回的取样)用于建立决策树,这样随机取50次,最终将会形成60棵决策树. 步骤2: 我们

机器学习排序算法:RankNet to LambdaRank to LambdaMART

使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节. 学习过程中细读了两篇不错的博文,推荐给大家: 梯度提升树(GBDT)原理小结 徐博From RankNet to LambdaRank to LambdaMART: An Overview 但经过一番搜寻之后发现,目前网上并没有一篇透彻讲解该算法的文章,所以希望这篇文章能够达到此目的. 本文主要参考微软研究院2010年发表的文章From RankNet to LambdaRank to LambdaMA

机器学习集成学习原理

//2019.08.19#机器学习集成学习1.集成学习是指对于同一个基础数据集使用不同的机器学习算法进行训练,最后结合不同的算法给出的意见进行决策,这个方法兼顾了许多算法的"意见",比较全面,因此在机器学习领域也使用地非常广泛. 集成学习(ensemble learning)本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务.集成学习可以用于分类问题集成,回归问题集成,特征选取集成,异常点检测集成等等,可以说所有的机器学习领域都可以看到集成学习的身影. 生活

机器学习:算法简介

K-近邻算法 作用:分类算法 优点:最简单.不需要训练.容易理解 缺点:计算复杂度高.空间复杂度高 原理:计算新数据与样本集中所有数据的欧式距离,提取距离最近的 K 个样本的标签,取 K 个样本里出现次数最多的标签,作为新数据的分类标签 决策树 - ID3 作用:分类算法 优点:计算复杂度不高.容易理解.可处理不相关特征 缺点:可能会过度匹配.实现较复杂.存在特征值太多的问题 原理: –?首先构建一颗树,每个非叶子节点代表一个特征,每个分叉代表特征的一个值,每个叶子节点代表一个分类,然后从根节点

机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用

摘要: 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计算出其后验概率(即该对象属于某一类的概率),然后选择具有最大后验概率的类作为该对象所属的类.总的来说:当样本特征个数较多或者特征之间相关性较大时,朴素贝叶斯分类效率比不上决策树模型:当各特征相关性较小时,朴素贝叶斯分类性能最为良好.另外朴素贝叶斯的计算过程类条件概率等计算彼此是独立的,因此特别适于分布式计算.本文详述了朴素贝叶斯分类的统计学