| |
|
开发:
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学习笔记 |
概念XGBoost即Extreme Gredient Boosting,是一种基于CART决策树的boosting算法 相比GBDT来说优化迭代的方式不同。GBDT使用损失函数的负梯度近似残差来训练下一棵树; 原理优化方式设XGBoost模型为 y ^ i = ∑ k = 1 K f k ( x i ) \hat y_i=\sum_{k=1}^Kf_k(x_i) y^?i?=∑k=1K?fk?(xi?) 则第 t t t 次优化的损失函数为 L = ∑ i = 1 n L ( y i , F t ? 1 ( x i ) + f t ( x i ) ) + ∑ k = 1 K ( γ T k + 1 2 λ ∣ ∣ w k ∣ ∣ 2 ) L=\sum_{i=1}^nL(y_i,F_{t-1}(x_i)+f_t(x_i))+\sum_{k=1}^K(\gamma T_k+\frac{1}{2}\lambda||w_k||^2) L=∑i=1n?L(yi?,Ft?1?(xi?)+ft?(xi?))+∑k=1K?(γTk?+21?λ∣∣wk?∣∣2) 第二项为正则项, T k T_k Tk?表示第 k k k棵树的叶节点个数, w k w_k wk?表示该树各个叶节点的输出值的向量。 根据前向加法算法,此时需找到 f t ( x ) f_t(x) ft?(x),使 L L L最小。此时正则项也只表示第 t t t棵树的复杂度。 采用二项泰勒展开式可得 L ( y i , F t ? 1 ( x i ) + f t ( x i ) ) = L ( y i , F t ? 1 ( x i ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) L(y_i,F_{t-1}(x_i)+f_t(x_i))=L(y_i,F_{t-1}(x_i))+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i) L(yi?,Ft?1?(xi?)+ft?(xi?))=L(yi?,Ft?1?(xi?))+gi?ft?(xi?)+21?hi?ft2?(xi?) g i = ? L ( y i , F t ? 1 ( x ) ) ? F t ? 1 ( x ) ∣ F t ? 1 ( x i ) g_i=\frac{\partial L(y_i, F_{t-1}(x))}{\partial F_{t-1}(x)}|_{F_{t-1}(x_i)} gi?=?Ft?1?(x)?L(yi?,Ft?1?(x))?∣Ft?1?(xi?)?为一阶偏导 h i = ? 2 L ( y i , F t ? 1 ( x ) ) ( ? F t ? 1 ( x ) ) 2 ∣ F t ? 1 ( x i ) h_i=\frac{\partial^2 L(y_i, F_{t-1}(x))}{(\partial F_{t-1}(x))^2}|_{F_{t-1}(x_i)} hi?=(?Ft?1?(x))2?2L(yi?,Ft?1?(x))?∣Ft?1?(xi?)?为二阶偏导 代入得 L = ∑ i = 1 n [ L ( y i , F t ? 1 ( x i ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + γ T + 1 2 λ ∑ j = 1 T w j 2 L=\sum_{i=1}^n[L(y_i,F_{t-1}(x_i))+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 L=∑i=1n?[L(yi?,Ft?1?(xi?))+gi?ft?(xi?)+21?hi?ft2?(xi?)]+γT+21?λ∑j=1T?wj2? L ( y i , F t ? 1 ( x i ) ) L(y_i,F_{t-1}(x_i)) L(yi?,Ft?1?(xi?))是定值,所以只需最小化 L ′ = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + γ T + 1 2 λ ∑ j = 1 T w j 2 L'=\sum_{i=1}^n[g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 L′=∑i=1n?[gi?ft?(xi?)+21?hi?ft2?(xi?)]+γT+21?λ∑j=1T?wj2? 关于样本 n n n的连加可以转化为叶节点的输出值的连加,即同一结点下样本的输出值都一样 f t ( x i ) = w j f_t(x_i)=w_j ft?(xi?)=wj? ( x i 属 于 j 结 点 ) (x_i属于j结点) (xi?属于j结点) 即 L ′ = ∑ j = 1 T [ w j ∑ g i + 1 2 w j 2 ∑ h i ] + γ T + 1 2 λ ∑ j = 1 T w j 2 L'=\sum_{j=1}^T[w_j\sum g_i+\frac{1}{2}w_j^2\sum h_i]+\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 L′=∑j=1T?[wj?∑gi?+21?wj2?∑hi?]+γT+21?λ∑j=1T?wj2? = ∑ j = 1 T [ w j ( ∑ g i ) + 1 2 ( ∑ h i + λ ) w j 2 ] + γ T =\sum_{j=1}^T[w_j(\sum g_i)+\frac{1}{2}(\sum h_i+\lambda)w_j^2]+\gamma T =∑j=1T?[wj?(∑gi?)+21?(∑hi?+λ)wj2?]+γT 其中 ∑ g i \sum g_i ∑gi?表示该结点下所有样本的一阶梯度值, ∑ h i \sum h_i ∑hi?同理 令 G j = ∑ g i G_j=\sum g_i Gj?=∑gi?, H j = ∑ h i H_j=\sum h_i Hj?=∑hi? 则 L ′ = ∑ j = 1 T [ w j G j + 1 2 ( H j + λ ) w j 2 ] + γ T L'=\sum_{j=1}^T[w_jG_j+\frac{1}{2}(H_j+\lambda)w_j^2]+\gamma T L′=∑j=1T?[wj?Gj?+21?(Hj?+λ)wj2?]+γT 假设树的结构已经固定,即那些样本属于哪个叶节点已固定,则求叶节点的输出 w j w_j wj?使损失函数 L L L最小 关于 w j w_j wj?求导得到 w j = ? G j H j + λ w_j=-\frac{G_j}{H_j+\lambda} wj?=?Hj?+λGj?? 代入得, L ′ = ? ∑ j = 1 T 1 2 G j 2 H j + λ + γ T L'=-\sum_{j=1}^T\frac{1}{2} \frac{G_j^2}{H_j+\lambda}+\gamma T L′=?∑j=1T?21?Hj?+λGj2??+γT L ′ L' L′代表这棵树的整体损失,越小越好 树的生成接下来需要确定树的结构,即在树的结点处确定特征和对应的划分点。采用 L ′ L' L′作为衡量标准。则当一个结点被划分为两个叶节点后,切分前后的损失变化为 切分前 o b j = ? 1 2 G 0 2 H 0 + λ + γ = ? 1 2 ( G L + G R ) 2 H L + H R + λ + γ obj=-\frac{1}{2}\frac{G_0^2}{H_0+\lambda}+\gamma=-\frac{1}{2}\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}+\gamma obj=?21?H0?+λG02??+γ=?21?HL?+HR?+λ(GL?+GR?)2?+γ 切分后 左+右 为 o b j = ? 1 2 G L 2 H L + λ + γ ? 1 2 G R 2 H R + λ + γ obj=-\frac{1}{2}\frac{G_L^2}{H_L+\lambda}+\gamma-\frac{1}{2}\frac{G_R^2}{H_R+\lambda}+\gamma obj=?21?HL?+λGL2??+γ?21?HR?+λGR2??+γ 前后损失变化为 L s p l i t = 1 2 ( G L 2 H L + λ + G R 2 H R + λ ? ( G L + G R ) 2 H L + H R + λ ) ? γ L_{split}=\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 Lsplit?=21?(HL?+λGL2??+HR?+λGR2???HL?+HR?+λ(GL?+GR?)2?)?γ 要找到特征以及对应的划分点,使上式值最大。
特征查找方式基本精确的贪心算法(Basic Exact Greedy Algorithm)为了找到节点最好的划分,该算法的原理是在所有特征上枚举所有的可能的划分,我们称这个算法为Basic Exact Greedy Algorithm。大多数已存在的单台机器上的树提升算法库都是用这种方法实现的,例如scikit-learn,R’s gbm 以及 XGBoost的单机版本都支持这种算法。该算法要求为连续特征枚举所有可能的切分,这对计算机的要求很高,所以该算法为了有效的做到这一点,首先根据特征值排序数据并且按照顺序访问数据,以累积方程(6)中结构分数的梯度统计量。该算法如下: 近似算法Basic Exact Greedy Algorithm是一个非常精确的算法,因为它枚举的所有可能的切分点。但是,当数据不能完全的加载到内存时,它可能不是特别有效地。同样的问题也出现在分布式的设置中。为了有效的支持在这两种设置中的有效的梯度提升,一个近似算法需要被使用。该算法首先根据特征分布的百分位数提出n个候选切分节点,然后,算法将位于相邻分位点之间的样本分在一个桶中,在遍历该特征的时候,只需要遍历各个分位点,从而计算最优划分。注意到上面算法流程中表明有全局的近似(global)和局部(local)的近似,所谓全局就是在新生成一棵树之前就对各个特征计算分位点并划分样本,之后在每次分裂过程中都采用近似划分,而局部就是在具体的某一次分裂节点的过程中采用近似算法。该算法如下所示: 特点与GBDT相比:算法上:
运行效率上:
与LightGBM相比:
XGBoost的巧妙之处机器学习就是模型对数据的拟合。对于一组数据,使用过于复杂的模型去拟合,往往会发生过拟合,这时就需要引入正则化项来限制模型复杂度,然而正则化项的选取、正则化系数的设定都是比较随意的,也比较难做到最佳。而如果使用过于简单的模型,由于模型能力有限,很难把握数据中蕴含的规律,导致效果不佳。 Boosting算法比较巧妙,首先使用简单的模型去拟合数据,得到一个比较一般的结果,然后不断向模型中添加简单模型(多数情况下为层数较浅决策树),随着树的增多,整个boosting模型的复杂度逐渐变高,直到接近数据本身的复杂度,此时训练达到最佳水平。 因此,**boosting算法要取得良好效果,要求每棵树都足够“弱”,**使得每次增加的复杂度都不大,同时树的总数目要足够多。XGBoost中,对每棵树的叶子节点数做了惩罚,从而限制了叶子节点的增长,使得每棵树都是“弱”的,同时还引入了学习速率,进一步降低了每棵树的影响。这样做的代价是,数的总数目会多一些,但从其取得的效果上看,这样做是值得的。 为什么XGBoost运行这么快连续型特征的处理决策树在训练时需要进行分叉,对于连续型特征,枚举所有可能分叉点将会十分耗时。一种近似方法是只枚举若干个分位点,例如将所有样本根据此特征进行排序,然后均分10份,两份之间断开的数值即为分位点,枚举所有9个分位点后,使用降低损失最多的那个作为分叉点。 利用数据稀疏性数据稀疏有三个原因:缺失数据;某些特征本身就含有大量的0;对离散特征做了one-hot处理。无论是哪种,都会导致样本中出现大量的0。通常,利用稀疏性可以提高运算效率。**XGBoost的方法是,每次分叉时,都指定一条默认分支,如果样本的这个特征为0,就走这个默认分支。这样,训练时不必考虑这些0元素,大大提高了运算速度。**陈天奇的实验表明,此方法在稀疏数据上可以提高50倍。 数据的预排序和分块存储分叉的时候为了判断分叉点,需要对每个特征进行排序。这个步骤是要重复多次的,因此XGBoost在训练之前预先对数据进行每一列做了排序,并按列存储到内存中。在分布式环境下,可以进行分块存储。 减少读写相关,提高Cache命中率由于预排序的数据是按列存储的,但训练时并不总是按列读取和写回,在需要按行读写的时候,将需要的行预先收集到一块连续内存上,再进行计算。这样由于是连续内存地址,可以提高Cache命中率,从而提高了运算速度。 数据量大时,提高硬盘吞吐率当数据量很大,不能装入内存时,需要将一部分数据放在硬盘里。然而硬盘读写速度慢,会严重影响计算效率。XGBoost使用了两种方法提高吞吐率,一个是对存储的内容进行压缩,读取时再进行解压,这相当于在读取代价和解压代价之间做了一个权衡。另一个方法是做数据分片,即在多块硬盘上存储数据,然后同时读写,从而提高读写速度。 参考文献https://blog.csdn.net/qq_24519677/article/details/81809157 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年12日历 | -2024/12/22 10:14:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |