| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 推荐算法 之 XGBoost -> 正文阅读 |
|
[人工智能]推荐算法 之 XGBoost |
? ? ? ? 在之前提到的GBDT+LR的文章中,我们提到了加法模型(文章在这),同理XGBoost也是一个加法模型,由K个基模型组成的一个加法模型:(加法是指树的结果都累加在一起) ????????? ? ? ????????其中??就是第k个模型,?是第i个样本的预测值。于是我们就可以定义损失函数了: ? ? ? ? 然后一个重点来了,GBDT呀,AdaBoost呀都是建树的时候猛地造,后面再去做剪枝,到那时XGBoost这里就很聪明了,在建树阶段就加入了正则项来防止过拟合。 ? ? ? ? 于是,Lossfunction就有新的表现形式了: ? ? ? ? 之前我们就提到了Boosting也是一个加法模型(前向加法),所以我们可以根据对于第i个样本的第t-1棵树来写出第t棵树的预测: ? ? ? ? 这就立马套路起来了,开始改写! ? ? ? ? 然后我们观察这个式子:里面就只有一个?是未知的,其余都是已知的,但这个恰恰是最难求的,于是我们用比较迂回的方法去求解这个复杂的函数。 ????????我们采用泰勒展开去逼近这个函数,用二阶泰勒展开: ? ? ? ? 然后把?视为x,把?视为delta x,于是按照二阶展开的模版继续改写! ???????? ? ? ? ? 因为我们定义的是?是?,所以后面都是loss的一阶导和二阶导,然后定义了x是,所以我们是对这个?进行求导的。 ? ? ? ? 由于我们现在已经在第t棵树了,就是第t步了,所以我们的loss里面的f(x)其实是一个常数项,于是我们可以继续化简: ???????? ????????于是我们只需要求出每一步(对于当前样本的每一棵树)模型的一阶导和二阶导的值,就可以得到每一步的f(x)了,然后用加法模型,就可以得到一个整体模型了。 ? ? ? ? 但是但是!其实还可以继续化简的! ? ? ? ? 我们继续沿用上面提到的?,然后将决策树定义为这个: ?????????就代表了这样本会被分到哪一个叶子上,w就是这个叶子的取值,所以?就是代表这个样本的分到哪个叶子结点对应这个叶子结点的取值了。 ? ? ? ? 而决策树的复杂度在XGBoost里面是这么定义的: ? ? ? ? 其中,T代表了树的叶子数,其实可以自己转化成深度的意思,因为XGBoost是一个二叉树,所以值越小就代表着越不容易过拟合。再看隔壁的,就代表每一个叶子的权重了(下面提到T的求和都是叶子数目了) ? ? ? ? 所以一句话总的来说就是XGBoost的正则项是叶子数和叶子对应权重 两个东西去衡量的 ? ? ? ? 于是,再代入!? (这里的??就是loss‘ (一阶导),?就是loss'' (二阶导)) ? ? ? ? ?第二步到第三步其实就是换了个角度来看这个公公式了,第二个还是对样本x求和求loss,第三步就马上是对叶子数T求和,怎么理解呢?第一第二步的求和应该是大N才对。 ? ? ? ? 因为不管怎么输入是什么,最终都会落在这么多棵树,总共T个叶子结点上的,所以我们干脆就让他先落下去,然后直接对叶子结点求loss。 ? ? ? ? 因为一个叶子不是对应一个样本,一个叶子可能会对应多个样本,所以有了这两项: ?和.? ? ? ? ? 这两个东西就是代表每一个叶子结点都计算里面 样本的 loss‘ 和 loss'',然后求和加起来乘上对应叶子结点的输出。 ? ? ? ? 然后还有按照大佬的想法,再继续简化:令: ?和? ? ? ? ? 于是整个式子就变成了: ? ? ? ? 我们继续看刚新换上了G和H,欢了这么多次这个不要忘记了究竟是什么东西了那是关于第t-1棵的所有叶子结点的的loss一阶导和二阶导,所以其实相对于第t棵的数目来说,这个G和H其实是一个常数了(因为已经发生了),所以剩下一个??不知道了。 ? ? ? ? 于是我们对它进行求导等于0,得出每一个叶子结点对应的权值: ? ? ? ? 再代入到obj里面: ????????如此一来,在重新审阅了后面的正则化后,我们求得新的更新函数,还是一个道理,求每个叶子结点每个样本的一阶导数和二阶导数后,根据上面的公式就可以得到第t棵树是怎么样的了。 ????????下面就是要说怎么选择树了,因为树的划分有很多情况一个非常关键的问题是如何找到叶子的节点的最优切分点,,所以我们要万里挑一!Xgboost 支持两种分裂节点的方法——贪心算法和近似算法。 ? ? ? ? 贪心算法: ? ? ? ? 贪心算法的计算收益过程: ? ? ? ? 其实这个和GBDT里面的计算几乎一样的,只是衡量收益的公式发生变化了,例如回归树里面用三个min的衡量。并且在做划分的时候,公式里面就已经带了?了,这个说明了切分的时候就考虑树的复杂度,防止过拟合 ? ? ? ? 但是这计算,当特征数目多起来,计算就会非常缓慢,所以有一个新的算法去做这个划分,叫做近似算法?Weight Quantile Sketch,这一部分强哥写得非常棒!文章在这,直接看贡献度那个图。 ? ? ? ? 0. 要明白算法的核心思想是想尽可能分桶的时候都做到两边的loss分布均匀。 ? ? ? ? 1. 要明白贡献度?是什么:其实就是二阶导数(loss'' ) ? ? ? ? 2. 要明白这个贡献度为啥能称为降低loss的贡献度:要将二阶泰勒展开后的式子进行变形,变形出带有残差的影子,就可以解释XGBoost其实也是在拟合残差,然后看系数项就是代表了每个样本对拟合残差的贡献程度了 ? ? ? ? 3. 要明白分箱是怎么分的:?控制每个桶中样本贡献度比例的大小,就是贡献度的分位点。 ? ? ? ? 4. 所以XGBoost在选择切分点上,是对候选点做处理,而不是对所有可能点都做计算,这就会非常快了,比GBDT快了不少。而且因为特征之间是独立的,所以可以直接做并行计算 ? ? ? ? ????????再往下就是树的合成了,XGBoost这里有点特殊,就是他不是一股脑地一直做树的累加,而是得先让每棵树都削弱一下,这里就提到一个叫 shrinkage的东西。
? ? ? ? 所以总的来说,XGBoost是一个很多基(弱)分类器的集成,核心思想是减少残差,通过泰勒二阶展开去逼近函数,来引入一阶二阶导数。从而使得XGBoost可以更加精准地知道哪个样本是对降低loss是有重要作用的,接着把目标函数转换成叶子结点的遍历形式,得到最终的目标函数。在建树的过程中,用到贪心的策略并进行了优化。然后一棵一棵树在收缩率的影响下做累加,从而达到最终的模型。 ? ???????????????? ????????? ? ? ?? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 23:24:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |