XGboost部分细节补充

news2024/11/15 6:56:35

XGBoost算法原理详解与参数详解

R语言XGBoost参数详解

XGBoost部分细节补充

  • 1. XGBoost线性模型的实现
  • 2.XGBoost对二分类和多分类的处理方法

1. XGBoost线性模型的实现

前面文章中已经详细的介绍了XGBoost基于决策树的实现,今天我们主要介绍XGBoost基于线性模型的实现。
我们主要介绍简单的三种线性模型:Lasso、Ridge、弹性网
Lasso:采用了L1正则化的惩罚,目标函数为 J ( ω ) = ∑ i = 1 m ( y i − ω T X i ) 2 + λ ∑ j = 1 n ω j 2 \mathcal{J}(\omega)=\sum_{i=1}^{m}(y_{i}-\omega^{T}X_{i})^{2}+\lambda\sum_{j=1}^{n}\omega_{j}^{2} J(ω)=i=1m(yiωTXi)2+λj=1nωj2.
Ridge:采用了L2正则化的惩罚,目标函数为 J ( ω ) = ∑ i = 1 m ( y i − ω T X i ) 2 + λ ∑ j = 1 n ∣ ω j ∣ \mathcal{J}(\omega)=\sum_{i=1}^{m}(y_{i}-\omega^{T}X_{i})^{2}+\lambda\sum_{j=1}^{n}\left|\omega_{j}\right| J(ω)=i=1m(yiωTXi)2+λj=1nωj.
弹性网:结合了L1L2正则项的惩罚,目标函数为 J ( ω ) = ∑ i = 1 m ( y i − ω T X i ) 2 + λ 1 ∑ j = 1 n ω j 2 + λ 2 ∑ j = 1 n ∣ ω j ∣ \mathcal{J}(\omega)=\sum_{i=1}^{m}(y_{i}-\omega^{T}X_{i})^{2}+\lambda_{1}\sum_{j=1}^{n}\omega_{j}^{2}+\lambda_{2}\sum_{j=1}^{n}\left|\omega_{j}\right| J(ω)=i=1m(yiωTXi)2+λ1j=1nωj2+λ2j=1nωj.

线性模型通过学习特征的线性组合进行预测,即: y = ω T X + β , ω T = ( ω 1 , ω 2 , ω 3 , . . . , ω m ) y=\omega^{T}X+\beta,\omega^{T}=(\omega_{1},\omega_{2},\omega_{3},...,\omega_{m}) y=ωTX+β,ωT=(ω1,ω2,ω3,...,ωm)
m m m为特征的数量,模型的训练即为确定参数 ω \omega ω β \beta β.
XGBoost线性模型的目标函数定义为:
O b j ( s ) = 1 n ∑ i = 1 n L ( y i , y ^ i ( s ) ) + Ω ( ω , β ) Obj^{(s)}=\frac{1}{n}\sum_{i=1}^{n}L(y_{i},\hat{y}_{i}^{(s)})+\Omega(\omega,\beta) Obj(s)=n1i=1nL(yi,y^i(s))+Ω(ω,β).
其中 y ^ i ( s ) \hat{y}_{i}^{(s)} y^i(s)为第 i i i个样本在模型 s s s轮时得到的预测值; y i y_{i} yi为第 i i i个样本的真实值; L L L为损失函数; Ω \Omega Ω为正则化项。

这里的正则化项 Ω \Omega Ω采用了弹性网的惩罚方式: Ω ( ω , β ) = 1 2 λ ∑ j = 1 m ω j 2 + 1 2 λ β β 2 + α ∑ j = 1 m ∣ ω j ∣ \Omega(\omega,\beta)=\frac{1}{2}\lambda\sum_{j=1}^{m}\omega_{j}^{2}+\frac{1}{2}\lambda_{\beta}\beta^{2}+\alpha\sum_{j=1}^{m}\left|\omega_{j}\right| Ω(ω,β)=21λj=1mωj2+21λββ2+αj=1mωj.
由于向量乘积满足分配律,所以对于线性模型的参数进行如下的改写:
ω s T X + β s = ( ω s − 1 T + Δ ω T ) X + β s − 1 + Δ β \omega_{s}^{T}X+\beta_{s}=(\omega_{s-1}^{T}+\Delta\omega^{T})X+\beta_{s-1}+\Delta\beta ωsTX+βs=(ωs1T+ΔωT)X+βs1+Δβ
其中 ω s T \omega_{s}^{T} ωsT为第 s s s轮训练时的参数; ω s − 1 T \omega_{s-1}^{T} ωs1T s − 1 s-1 s1轮的参数; Δ ω \Delta\omega Δω为先后两轮训练中 ω \omega ω的变化; β s \beta_{s} βs β s − 1 \beta_{s-1} βs1为前后两轮训练中的截距项; Δ β \Delta\beta Δβ为两轮训练下截距项的变化。所以目标函数可写为:
O b j ( s ) = 1 n ∑ i = 1 n L ( y i , y ^ i ( s − 1 ) + Δ ω T x i + Δ β ) + Ω ( ω , β ) Obj^{(s)}=\frac{1}{n}\sum_{i=1}^{n}L(y_{i},\hat{y}_{i}^{(s-1)}+\Delta\omega^{T}x_{i}+\Delta\beta)+\Omega(\omega,\beta) Obj(s)=n1i=1nL(yi,y^i(s1)+ΔωTxi+Δβ)+Ω(ω,β).
O b j ( s ) = 1 n ∑ i = 1 n L ( y i , y ^ i ( s − 1 ) + Δ ω T x i + Δ β ) + Ω ( ω , β ) ≈ 1 n ∑ j = 1 m ∑ i = 1 n [ L ( y i , y ^ ( s − 1 ) + Δ β ) + g i ( Δ ω j x i j ) + 1 2 h i ( Δ ω j x i j ) 2 ] + 1 2 λ ∑ j = 1 m ( ω ( s − 1 ) j + Δ ω j ) 2 + 1 2 λ β β 2 + α ∑ j = 1 m ∣ ω ( s − 1 ) j + Δ ω j ∣ \begin{align} Obj^{(s)}&=\frac{1}{n}\sum_{i=1}^{n}L(y_{i},\hat{y}_{i}^{(s-1)}+\Delta\omega^{T}x_{i}+\Delta\beta)+\Omega(\omega,\beta) \\ & \approx \frac{1}{n} \sum_{j=1}^{m}\sum_{i=1}^{n}[L(y_{i},\hat{y}^{(s-1)}+\Delta\beta)+g_{i}(\Delta\omega_{j}x_{ij})+\frac{1}{2}h_{i}(\Delta\omega_{j}x_{ij})^{2}] + \frac{1}{2} \lambda \sum_{j=1}^{m}(\omega_{(s-1)j}+\Delta \omega_{j})^{2} + \frac{1}{2} \lambda_{\beta} \beta^{2} + \alpha \sum_{j=1}^{m}\left| \omega_{(s-1)j} + \Delta\omega_{j} \right| \end{align} Obj(s)=n1i=1nL(yi,y^i(s1)+ΔωTxi+Δβ)+Ω(ω,β)n1j=1mi=1n[L(yi,y^(s1)+Δβ)+gi(Δωjxij)+21hi(Δωjxij)2]+21λj=1m(ω(s1)j+Δωj)2+21λββ2+αj=1m ω(s1)j+Δωj

上式和XGBoostCART的优化方式相同:二阶泰勒展开。
此时上述的目标函数相当于一个以 Δ ω j \Delta\omega_{j} Δωj为自变量的一元二次函数,判读 ω ( s − 1 ) j + Δ ω j \omega_{(s-1)j}+\Delta\omega_{j} ω(s1)j+Δωj 0 0 0的大小关系,再根据一元二次函数最值公式求出 Δ ω j \Delta\omega_{j} Δωj的最优值。

ω ( s − 1 ) j + Δ ω j ≥ 0 \omega_{(s-1)j}+\Delta\omega_{j}\geq0 ω(s1)j+Δωj0, Δ ω j = max ⁡ ( − ∑ i = 1 n g i x i j + λ ω ( s − 1 ) j + α ∑ i = 1 n h i x i j 2 + λ , − ω ( s − 1 ) j ) \Delta\omega_{j}=\max(-\frac{\sum_{i=1}^{n}g_{i}x_{ij}+\lambda\omega_{(s-1)j}+\alpha}{\sum_{i=1}^{n}h_{i}x_{ij}^{2}+\lambda},-\omega_{(s-1)j}) Δωj=max(i=1nhixij2+λi=1ngixij+λω(s1)j+α,ω(s1)j).
ω ( s − 1 ) j + Δ ω j < 0 \omega_{(s-1)j}+\Delta\omega_{j}<0 ω(s1)j+Δωj<0, Δ ω j = min ⁡ ( − ∑ i = 1 n g i x i j + λ ω ( s − 1 ) j − α ∑ i = 1 n h i x i j 2 + λ , − ω ( s − 1 ) j ) \Delta\omega_{j}=\min(-\frac{\sum_{i=1}^{n}g_{i}x_{ij}+\lambda\omega_{(s-1)j}-\alpha}{\sum_{i=1}^{n}h_{i}x_{ij}^{2}+\lambda},-\omega_{(s-1)j}) Δωj=min(i=1nhixij2+λi=1ngixij+λω(s1)jα,ω(s1)j).
对于截距项 β \beta β采用上述方法求解得到:
Δ β = − ∑ i = 1 n g i + λ β β ( s − 1 ) ∑ i = 1 n h i + λ β \Delta\beta=-\frac{\sum_{i=1}^{n}g_{i}+\lambda_{\beta}\beta_{(s-1)}}{\sum_{i=1}^{n}h_{i}+\lambda_{\beta}} Δβ=i=1nhi+λβi=1ngi+λββ(s1).

以上就是XGBoost线性模型实现的步骤以及参数的优化求解。

2.XGBoost对二分类和多分类的处理方法

问题:

我想关于XGBoost算法的原理以及理论证明大家在论文、书籍以及相关的博客上应该都可以看懂,可能对XGBoost如何解决分类等问题不是很清楚,比如二分类问题下XGBoost的输出概率值是如何做到的?这个问题如果理解了大家对XGBoost解决问题的逻辑就会十分明了。

R语言自带的数据集agaricus为例进行二分类.

> library(xgboost)
> data(agaricus.train, package='xgboost')
> 
> bst <- xgboost(data = agaricus.train$data, label = agaricus.train$label, max_depth = 3,
+                eta = 1, nthread = 2, nrounds = 2,objective = "binary:logistic")
[1]     train-logloss:0.161178 
[2]     train-logloss:0.064728 
> 
> 
> xgb.plot.tree(model = bst) # 可视化xgboost生成的树模型

在这里插入图片描述
以上图片对于agaricus数据集生成了两颗树模型,XGboost在预测测试集的输出概率时会把测试集的样本按照树模型的划分规则分别使其落入Tree0Tree1的叶节点上. 比如测试集中的样本1Tree0Tree1的叶节点上的value进行相加,然后通过Sigmoid激活函数转换为测试集中正类标签的预测概率.
以下为上述的验证部分:通过对Tree0Tree1的叶子节点的值进行排列后求和,然后通过Sigmoid激活函数转为概率输出值;另一部分对测试集进行了概率预测. 自然而然地对测试集进行了概率预测应该是上述过程的子集.

> print(xgb.dump(bst, with_stats = TRUE))
 [1] "booster[0]"                                                                    
 [2] "0:[f28<-9.53674316e-07] yes=1,no=2,missing=1,gain=4000.53101,cover=1628.25"    
 [3] "1:[f55<-9.53674316e-07] yes=3,no=4,missing=3,gain=1158.21204,cover=924.5"      
 [4] "3:[f59<-9.53674316e-07] yes=7,no=8,missing=7,gain=568.215576,cover=812"        
 [5] "7:leaf=1.90174532,cover=772.5"                                                 
 [6] "8:leaf=-1.95061731,cover=39.5"                                                 
 [7] "4:[f20<-9.53674316e-07] yes=9,no=10,missing=9,gain=114.297333,cover=112.5"     
 [8] "9:leaf=1.77777779,cover=8"                                                     
 [9] "10:leaf=-1.98104262,cover=104.5"                                               
[10] "2:[f108<-9.53674316e-07] yes=5,no=6,missing=5,gain=198.173828,cover=703.75"    
[11] "5:[f66<-9.53674316e-07] yes=11,no=12,missing=11,gain=86.3969727,cover=690.5"   
[12] "11:leaf=-1.98531032,cover=679.75"                                              
[13] "12:leaf=0.808510661,cover=10.75"                                               
[14] "6:leaf=1.85964918,cover=13.25"                                                 
[15] "booster[1]"                                                                    
[16] "0:[f28<-9.53674316e-07] yes=1,no=2,missing=1,gain=480.158417,cover=719.00769"  
[17] "1:[f20<-9.53674316e-07] yes=3,no=4,missing=3,gain=276.744751,cover=414.977539" 
[18] "3:leaf=1.14570117,cover=296.038025"                                            
[19] "4:[f35<-9.53674316e-07] yes=7,no=8,missing=7,gain=392.998077,cover=118.939491" 
[20] "7:leaf=-6.8755784,cover=8.36453247"                                            
[21] "8:leaf=-0.127376497,cover=110.574959"                                          
[22] "2:[f108<-9.53674316e-07] yes=5,no=6,missing=5,gain=28.7784424,cover=304.030151"
[23] "5:[f38<-9.53674316e-07] yes=9,no=10,missing=9,gain=26.1188354,cover=297.850983"
[24] "9:leaf=-0.0386054367,cover=22.8540649"                                         
[25] "10:leaf=-1.15275192,cover=274.996918"                                          
[26] "6:leaf=0.994743764,cover=6.17916679" 
> tree0 = c(1.90174532, -1.95061731, 1.77777779, -1.98104262, -1.98531032, 0.808510661,
+           1.85964918)
> 
> tree1 = c(1.14570117, -6.8755784, -0.127376497, -0.0386054367, -1.15275192, 0.994743764)
> 
> 
> df = expand.grid(tree0,tree1)
> 
> 
> f = function(x)  1 / (1 + exp(-sum(x)))  
> 
> pred1 = round(apply(df, 1, f),4)
> 
> data(agaricus.test, package='xgboost')
> pred2 = round(predict(bst, agaricus.test$data),4)
> length(unique(pred2))
[1] 11
> 
> all(unique(pred2) %in% unique(pred1)) # 成立
[1] TRUE
 

以上就是XGBoost个人想到的一些细节补充,本片内容到此为止.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模式识别 —— 第二章 参数估计

模式识别 —— 第二章 参数估计 文章目录模式识别 —— 第二章 参数估计最大似然估计&#xff08;MLE&#xff09;最大后验概率估计&#xff08;MAP&#xff09;贝叶斯估计最大似然估计&#xff08;MLE&#xff09; 在语言上&#xff1a; 似然&#xff08;likelihood&#xf…

【Git】P1 Git 基础

Git 基础Git 基本概念集中式版本控制工具 与 分布式版本控制工具Git 下载与安装Bash 初始设置创建本地仓库Git 三区概念一个简单的提交流程更改文件后再次提交git 实现版本切换查看提交日志设置 git 快捷键版本切换&#xff08;一&#xff09;版本切换&#xff08;二&#xff0…

华为OD机试题,用 Java 解【数据分类】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

0104路径搜索和单点路径-无向图-数据结构和算法(Java)

文章目录2 单点路径2.1 API2.2 算法实现后记2 单点路径 单点路径。给定一幅图和一个起点s&#xff0c;回答“从s到给定的目的顶点v是否存在一条路径&#xff1f;如果有&#xff0c;找出这条路径。”等类似问题。 2.1 API 单点路径问题在图的处理邻域中十分重要。根据标准设计…

PHP, Python和Java的区别

PHP, Python和Java是广泛使用的编程语言。每种编程语言都有其独特的优点和缺点。在本文中&#xff0c;我们将对这些编程语言进行分析&#xff0c;并探讨它们在不同应用场景中的最佳用途。一、PHPPHP是一种广泛使用的Web编程语言&#xff0c;它可以在服务器上运行&#xff0c;并…

程设 | week2:STL

&#x1f4da;回顾C &#x1f407;struct和class 从功能上说&#xff0c;struct和class几乎没什么区别在不显式声明的情况下&#xff0c;struct成员默认为public&#xff0c;class默认为private和c语言的struct不同&#xff0c;c的struct可以定义成员函数&#xff0c;重载运算…

G6绘制树形图(自定义节点、自定义边、自定义布局)

目录1 设计节点1.1 定义节点和文本1.2 增加节点1.3 自定义节点样式2 树图配置2.1 允许使用自定义dom节点2.2 内置行为自定义边layout布局demo1 设计节点 在 registerNode 中定义所有的节点 G6.registerNode(tree-node, {drawShape: function drawShape(cfg, group) {定义图中…

aws appconfig 理解和使用appconfig对应用程序进行动态配置

参考资料 Automating Feature Release using AWS AppConfig Integration with AWS CodepipelineDeploying application configuration to serverless: Introducing the AWS AppConfig Lambda extensionCreate a pipeline that uses Amazon AppConfig as a deployment provider…

秒懂算法 | 搜索基础

本篇介绍了BFS和DFS的概念、性质、模板代码。 01、搜索简介 搜索,就是查找解空间,它是“暴力法”算法思想的具体实现。 暴力法(Brute force,又译为蛮力法):把所有可能的情况都罗列出来,然后逐一检查,从中找到答案。这种方法简单、直接,不玩花样,利用了计算机强大的…

JavaScript 中的 String 类型 模板字面量定义字符串

ECMAScript 6新增了使用模板字面量定义字符串的能力。与使用单引号或双引号不同&#xff0c;模板字面量保留换行字符&#xff0c;可以跨行定义字符串&#xff1a; let str1 早起的年轻人\n喜欢经常跳步;let str2 早起的年轻人喜欢经常跳步;console.log(str1);// 早起的年轻人…

【游戏逆向】游戏玩家技能冷却分析

技能冷却对于不同的游戏有不同的存放方式,而技能冷却的遍历也大多不会和技能的普通属性放在一起,在《在**明月刀》这款游戏中,技能的冷却判断格外重要,因为技能的连贯性对打怪的效率影响很大。 我们需要找一个冷却相对较长的技能用来进行扫描和过滤,一般选择几十秒即可,…

【本周特惠课程】基于GAN的图像增强理论与实践(涵盖图像降噪、色调映射、去模糊、超分辨、修复等方向)...

前言欢迎大家关注有三AI的视频课程系列&#xff0c;我们的视频课程系列共分为5层境界&#xff0c;内容和学习路线图如下&#xff1a;第1层&#xff1a;掌握学习算法必要的预备知识&#xff0c;包括Python编程&#xff0c;深度学习基础&#xff0c;数据使用&#xff0c;框架使用…

Windows扫描工具RunScanner使用实验(21)

实验目的 掌握利用Runscanner扫描和分析电脑&#xff1b;预备知识 RunScanner是一个完全免费的Windows系统工具,您可以用它轻松地将隐藏在您系统中的autostart程序,spyware,adware,主页劫持,未经认证的驱动揪出来,并可以导入和导出报告以帮助别人或获取帮助.目前它可以…

华为OD机试题,用 Java 解【素数之积】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

C++中的利器——模板

前文本文主要是讲解一下C中的利器——模板&#xff0c;相信铁子们在学完这一节后&#xff0c;写代码会更加的得心应手&#xff0c;更加的顺畅。一&#xff0c;泛型编程想要学习模板&#xff0c;我们要先了解为什么需要模板&#xff0c;我们可以看看下面这个程序。int add(int&a…

MDK Keil5 创建Stm32工程-理论篇(这里以Stm32F103Zet6为例)

一、文件夹创建与文件说明整个工程可以粗略的划分为几个文件夹&#xff1a;BSP底层驱动比如GPIO\Timer等驱动文件CMSIS内核相关的文件Firmware生成的固件下载文件Mycode用户编写的相关文件&#xff0c;主要编写的文件都在这个文件夹里Project工程文件startup芯片启动文件STM32F…

1.C#与.NET简介

目录 一、C#语言及其特点 二、C#与.NET Framework/.NET Core关系 三、C#应用开发 四、案例展示 五、学习环境 一、C#语言及其特点 C#是美国微软公司发布的一种面向对象的&#xff0c;运行于 .NET Framework 和 .NET Core &#xff08;完全开源&#xff0c;跨平台&#xff…

什么是LSM-Tree

前言 十多年前&#xff0c;谷歌发布了大名鼎鼎的"三驾马车"的论文&#xff0c;分别是GFS(2003年)&#xff0c;MapReduce&#xff08;2004年&#xff09;&#xff0c;BigTable&#xff08;2006年&#xff09;&#xff0c;为开源界在大数据领域带来了无数的灵感&#…

unity的安装配置和第一个游戏-unity开学第一课

许多的小伙伴学编程语言其实是因为玩游戏&#xff0c;玩着玩着就想写游戏了&#xff0c;于是开始学习c学习C#学习java&#xff0c;但相比之下C#的操作会更加容易&#xff0c;所以就开始学习unity来编游戏了。这里就就算是unity开学第一课啦-unity的安装配置和第一个游戏。 文章…

Maven项目的创建

目录 1.创建java项目 1.1 新建项目​编辑 2 创建web项目 2.1 新建项目 2.2 启动项目 2.2.1 修改jdk的版本 2.2.2 设置单元测试的版本 2.2.3 删除pluginManagement标签 2.2.4添加web部署插件 2.2.5 启动项目 1.创建java项目 1.1 新建项目 创建resources目录 利用maven…