ccc-sklearn-16-XGBoost(2)

news2024/9/20 8:53:06

文章目录

        • XGBoost的其他参数

XGBoost的其他参数

选择弱评估器:参数booster

XGB中除了树模型还可以选择线性模型等其他模型

xgb.train() & paramsxgb.XGBRegressor()
xgb_modelbooster
使用哪种弱评估器。可以输入gbtree,gblinear或dart。输入的评估器不同,使用的params参数也不同,每种评估器都有自己的params列表。评估器必须于param参数相匹配,否则报错。使用哪种弱评估器。可以输入gbtree,gblinear或dartgbtree代表梯度提升树,dart是Dropouts meet MultipleAdditive Regression Trees,可译为抛弃提升树,在建树的过程中会抛弃一部分树,比梯度提升树有更好的防过拟合功能。输入gblinear使用线性模型

不同弱评估器在波士顿房价数据集的表现:

for booster in ["gbtree","gblinear","dart"]:
    reg = XGBR(n_estimators=180,
              learning_rate=0.1,
              random_state=420,
              booster=booster).fit(Xtrain,Ytrain)
    print(booster)
    print(reg.score(Xtest,Ytest))

在这里插入图片描述
符合该数据集不是线性关系的预期

XGB的目标函数:参数objective

XGB的目标函数写作:
O b j = ∑ i = 1 m l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k ) Obj=\sum_{i=1}^{m}l(y_i,\hat y_i)+\sum_{k=1}^{K}\Omega(f_k) Obj=i=1ml(yi,y^i)+k=1KΩ(fk)
其中i表示数据集中的第i个样本,m表示导入第k棵树的数据总量,K代表建立的所有树。l为损失函数,通常是RMSE,调节后的均方误差。第二项代表模型的复杂度,使用树模型的某种变换。迭代每一颗树过程中,都最小化Obj来获取最优的 y ^ \hat y y^,同时最小化模型的错误率和复杂度。
在这里插入图片描述
方差是模型在不同数据集上表现出来的稳定性,偏差是模型预测的准确度。XGBoost的损失函数中自带限制方差变大的部分,不会轻易落到图像的右上方。下面是实际应用的选择:

xgb.train()xgb.XGBRegressor()xgb.XGBClassifier()
obj:默认binary:logisticobjective:默认reg:linearobjective:默认binary:logistic

常用选择:

输入选用的损失函数
reg:linear使用线性回归的损失函数,均方误差,回归时使用
binary:logistic使用逻辑回归的损失函数,对数损失log_loss,二分类时使用
binary:hinge使用支持向量机的损失函数,Hinge Loss,二分类时使用
multi:softmax使用softmax损失函数,多分类时使用
-还可以自己定义损失函数

xgboost库与sklearn对比

#sklearn
reg = XGBR(n_estimators=180,random_state=420).fit(Xtrain,Ytrain)
reg.score(Xtest,Ytest)
MSE(Ytest,reg.predict(Xtest))
#XGboost库
import xgboost as xgb
dtrain = xgb.DMatrix(Xtrain,Ytrain)
dtest = xgb.DMatrix(Xtest,Ytest)
dtrain
#无法打开查看,通常先pandas读再放到DMatrix中
param = {'verbosity':0,    #最新的xgboost已经移除了silent 替换成verbosity
         'objective':'reg:linear',
         'eta':0.1}
num_round = 180
bst = xgb.train(param,dtrain,num_round)
from sklearn.metrics import r2_score
r2_score(Ytest,bst.predict(dtest))
MSE(Ytest,bst.predict(dtest))

在这里插入图片描述
可以看到,从 R 2 R^2 R2还是MSE的角度,都是xgb库本身表现更加优秀。这与其作者陈天奇的论文结论也是相符的,差异可能与底层代码编写有关

XGB目标函数的求解

求解的目的是将目标函数转化成更简单的,与树的结构直接相关的写法。建立树的结构与模型的效果之间的直接联系。转换过程如下:
在这里插入图片描述
g i g_i gi h i h_i hi分别是损失函数求导的一阶导和二阶导,统称为每个样本的梯度统计量。当有许多树的时候,目标函数转换成:
O b j = ∑ i = 1 m [ f t ( x i ) g i + 1 2 ( f t ( x i ) ) 2 h i ] + Ω ( f t ) Obj=\sum_{i=1}^{m}[f_t(x_i)g_i+\frac{1}{2}(f_t(x_i))^2h_i]+\Omega(f_t) Obj=i=1m[ft(xi)gi+21ft(xi))2hi]+Ω(ft)
g i g_i gi h i h_i hi只与传统损失函数相关,核心是需要决定的 f t f_t ft,也是下一个参数的研究对象

参数化决策树 f t f_t ft:参数alpha,lambda

XGB中每个叶子结点上都有一个预测分数,也被称为叶子权重
在这里插入图片描述
叶子权重就是所有在叶子结点上样本的回归取值,多棵树时集成模型的回归结果就是所有树的预测分数之和。整个模型在样本i上给出的预测结果为:
y ^ i ( k ) = ∑ k K f k ( x i ) \hat y_i^{(k)}=\sum_{k}^{K}f_k(x_i) y^i(k)=kKfk(xi)
K表示模型中共有K颗树, f k ( x i ) f_k(x_i) fk(xi)表示叶子,形象表示如下:
在这里插入图片描述
某颗树的某个叶子结点上的所有样本对应叶子权重相同,设一棵树上包含T个叶子结点,叶子结点的索引为j,结点上样本权重 w j w_j wj。可以定义模型复杂度为:
Ω ( f ) = γ T + R e g u l a r i z a t i o n \Omega(f)=\gamma T+Regularization Ω(f)=γT+Regularization
使用L2正则项:
由于XGboost中所有树都是二叉树,所以可以使用T来判断树的结构。参数 α \alpha α λ \lambda λ用于控制正则化强度,都为0时表示普通梯度提升树的目标函数。对应参数如下:

参数含义xgb.train()xgb.XGBRegressor()
L1正则项的参数alpha,默认0,取值范围[0, +∞]reg_alpha,默认0,取值范围[0, +∞]
L2正则项的参数lambda,默认1,取值范围[0, +∞]reg_lambda,默认1,取值范围[0, +∞]

对于树模型,剪枝参数的地位更高,参数alpha和lambda一般使用用网格搜索调整即可

寻找最佳树结构:求解w和T

假设第t棵树已确定为q,可以将树的结构代入损失函数,继续转化目标函数。使用默认的L2正则化可以推导如下:
在这里插入图片描述
文字框转化过程如下:
在这里插入图片描述
对于最终的式子,定义:
G j = ∑ i ∈ I j g i , H j = ∑ i ∈ I j h i G_j=\sum_{i\in I_j}g_i,H_j=\sum_{i\in I_j}h_i Gj=iIjgi,Hj=iIjhi
可以得到:
O b j ( t ) = ∑ j = 1 T [ w j G j + 1 2 w j 2 ( H j + λ ) ] + γ T Obj^{(t)}=\sum_{j=1}^{T}[w_jG_j+\frac{1}{2}w_j^2(H_j+\lambda)]+\gamma T Obj(t)=j=1T[wjGj+21wj2(Hj+λ)]+γT
每个j取值下都当作第一项为一个二次函数 F ∗ F^* F,目标是追求Obj最小,只要单独的每一个叶子j取值下的二次函数都最小即可。于是对其求导可得:
∂ F ∗ ( w j ) ∂ w j = G j + w j ( H j + λ ) w j = − G j H j + λ \frac{\partial F^*(w_j)}{\partial w_j}=G_j+w_j(H_j+\lambda) \\ w_j=-\frac{G_j}{H_j+\lambda} wjF(wj)=Gj+wj(Hj+λ)wj=Hj+λGj
将公式代入目标函数有:
在这里插入图片描述
此时目标函数可以称作结构分数,分数越低则树整体结构越好,形象表示如下:
在这里插入图片描述
O b j = − ( g 1 2 h 1 + λ + g 4 2 h 4 + λ + ( g 2 + g 3 + g 5 ) 2 h 2 + h 3 + h 5 + λ + 3 γ ) Obj=-(\frac{g_1^2}{h_1+\lambda}+\frac{g_4^2}{h_4+\lambda}+\frac{(g_2+g_3+g_5)^2}{h_2+h_3+h_5+\lambda}+3\gamma) Obj=(h1+λg12+h4+λg42+h2+h3+h5+λ(g2+g3+g5)2+3γ)
求解Obj的其实就是求解树的结构(T)。可以通过枚举所有可能的树结构q,然后一个个计算Obj来选定最佳树结构完成迭代。此时将使用贪婪算法寻找最佳结构

寻找最佳分枝:结构分数之差

贪婪算法值控制局部最优来达到全局最优, 类似于决策树生长过程,XGBoost中生成树结构如下:
在这里插入图片描述
举个例子:
在这里插入图片描述
对于中间的叶子结点,计算分枝后的分数之差为:
G a i n = S c o r e s i s + S c o r e b r o − S c o r e m i d d l e = − 1 2 g 4 2 h 4 + λ + γ − 1 2 g 1 2 h 1 + λ + γ + 1 2 G 2 H + λ − γ = − 1 2 [ g 4 2 h 4 + λ + g 1 2 h 1 + λ − ( g 1 + g 4 ) 2 h 1 + h 4 + λ ] + γ Gain = Score_{sis}+Score_{bro}-Score_{middle} \\=-\frac{1}{2}\frac{g_4^2}{h_4+\lambda}+\gamma-\frac{1}{2}\frac{g_1^2}{h_1+\lambda}+\gamma+\frac{1}{2}\frac{G^2}{H+\lambda}-\gamma\\=-\frac{1}{2}[\frac{g_4^2}{h_4+\lambda}+\frac{g_1^2}{h_1+\lambda}-\frac{(g_1+g_4)2}{h_1+h_4+\lambda}]+\gamma Gain=Scoresis+ScorebroScoremiddle=21h4+λg42+γ21h1+λg12+γ+21H+λG2γ=21[h4+λg42+h1+λg12h1+h4+λ(g1+g4)2]+γ
由于CART树都是二叉树,进行推广可以总结出分枝结构差:
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ Gain=\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 Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ
这个公式可以对任意分枝计算,而且实践证明它比原始梯度下降速度更快,表现也不错

让树停止生长:重要参数gamma

XGB中规定,只要结构分数之差Gain大于0,即只要目标函数还能减小就允许继续分枝。表示如下:
1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] > γ \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 21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]>γ

gamma这里定义为进一步分枝所需要的最小目标函数的减少量,在决策树。设置越大算法就越保守,树的叶子数量就越少,模型复杂度就越低:

参数含义xgb.train()xgb.XGBRegressor()
复杂度的惩罚项 γ \gamma γgamma,默认0,取值范围[0, +∞]gamma,默认0,取值范围[0, +∞]

学习曲线绘制体现gamma作用

axisx = np.arange(0,5,0.05)
rs = []
var = []
ge = []
for i in axisx:
    reg = XGBR(n_estimators=180,random_state=420,gamma=i)
    result = CVS(reg,Xtrain,Ytrain,cv=cv)
    rs.append(result.mean())
    var.append(result.var())
    ge.append((1-result.mean())**2+result.var())
print(axisx[rs.index(max(rs))].max(rs),var[rs.index(max(rs))])
print(axisx[var.index(min(var))],rs[var.index(min(var))],min(var))
print(axisx[ge.index(min(ge))],rs[ge.index(min(ge))],var[ge.index(min(ge))],min(ge))
rs = np.array(rs)
var = np.array(var)*0.1
plt.figure(figsize=(20,5))
plt.plot(axisx,rs,c="black",label="XGB")
plt.plot(axisx,rs+var,c="red",linestyle='-.')
plt.plot(axisx,rs-var,c="red",linestyle='-.')
plt.legend()
plt.show()

在这里插入图片描述
遗憾的是,这个图像似乎没有什么可靠的规律。这是由于sklearn中XGBoost不稳定,一般调整gamma可以选择xgboost库中的cv
在这里插入图片描述

import xgboost as xgb
dfull = xgb.DMatrix(X,y)
param1 = {'silent':True,'obj':'reg:linear',"gamma":0}
num_round = 180
n_fold=5
time0 = time()
cvresult1 = xgb.cv(param1,dfull,num_round,n_fold)
print(datetime.datetime.fromtimestamp(time()-time0,pytz.timezone('UTC')).strftime("%M:%S:%f"))

在这里插入图片描述

plt.figure(figsize=(20,5))
plt.grid()
plt.plot(range(1,181),cvresult1.iloc[:,0],c="red",label="train,gamma=0")
plt.plot(range(1,181),cvresult1.iloc[:,2],c="orange",label="test,gamma=0")
plt.legend()
plt.show()

在这里插入图片描述
上面回归模型评估指标默认是rmse,其他常用评估指标如下:

指标含义
rmse回归用,调整后的均方误差
mae回归用,绝对平均误差
logloss二分类用,对数损失
mlogloss多分类用,对数损失
error分类用,分类误差,等于1-准确率
auc分类用,AUC面积

回归案例使用绝对平均误差

param1 = {'silent':True,'obj':'reg:linear',"gamma":0,"eval_metric":"mae"}
cvresult1 = xgb.cv(param1, dfull, num_round,n_fold)
plt.figure(figsize=(20,5))
plt.grid()
plt.plot(range(1,181),cvresult1.iloc[:,0],c="red",label="train,gamma=0")
plt.plot(range(1,181),cvresult1.iloc[:,2],c="orange",label="test,gamma=0")
plt.legend()
plt.show()

在这里插入图片描述
调整gamma

param1 = {'silent':True,'obj':'reg:linear',"gamma":0}
param2 = {'silent':True,'obj':'reg:linear',"gamma":20}
num_round = 180
n_fold=5
cvresult1 = xgb.cv(param1, dfull, num_round,n_fold)
cvresult2 = xgb.cv(param2, dfull, num_round,n_fold)
plt.figure(figsize=(20,5))
plt.grid()
plt.plot(range(1,181),cvresult1.iloc[:,0],c="red",label="train,gamma=0")
plt.plot(range(1,181),cvresult1.iloc[:,2],c="orange",label="test,gamma=0")
plt.plot(range(1,181),cvresult2.iloc[:,0],c="green",label="train,gamma=20")
plt.plot(range(1,181),cvresult2.iloc[:,2],c="blue",label="test,gamma=20")
plt.legend()
plt.show()

在这里插入图片描述
增大gamma在测试集效果相同的情况下削弱了测试集效果,减少过拟合现象
分类例子:

from sklearn.datasets import load_breast_cancer
data2 = load_breast_cancer()
x2 = data2.data
y2 = data2.target
dfull2 = xgb.DMatrix(x2,y2)
param1 = {'silent':True,'obj':'binary:logistic',"gamma":0,"nfold":5}
param2 = {'silent':True,'obj':'binary:logistic',"gamma":2,"nfold":5}
num_round = 100

cvresult1 = xgb.cv(param1, dfull2, num_round,metrics=("error"))
cvresult2 = xgb.cv(param2, dfull2, num_round,metrics=("error")) 
plt.figure(figsize=(20,5))
plt.grid()
plt.plot(range(1,101),cvresult1.iloc[:,0],c="red",label="train,gamma=0")
plt.plot(range(1,101),cvresult1.iloc[:,2],c="orange",label="test,gamma=0")
plt.plot(range(1,101),cvresult2.iloc[:,0],c="green",label="train,gamma=2")
plt.plot(range(1,101),cvresult2.iloc[:,2],c="blue",label="test,gamma=2")
plt.legend()
plt.show()

在这里插入图片描述
这个图像说明不管是测试集和训练集的准确度都被削弱了,所以gamma需要进一步调整。

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

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

相关文章

C++ 函数重载:女友说的话到底是什么意思?

👑专栏内容:C学习笔记⛪个人主页:子夜的星的主页💕座右铭:日拱一卒,功不唐捐 目录一、前言二、函数重载1、函数重载概念2、函数重载的分类Ⅰ、参数类型不同Ⅱ、参数个数不同Ⅲ、参数类型顺序不同3、函数重载…

vs code,platform下载Arduino程序到ESP8266,并传送文件到flash

参考视频:https://www.bilibili.com/video/BV1yR4y1X72D/ 首先要知道 存储空间中有程序的存储地址和文件存储地址,可以对单独一个部分的写入不影响另一部分内容。 vs code 的platformIO插件进行程序和文件的上传 基本创建工程和程序可以参考&#x…

启明欣欣STM32开发板移植FreeRTOS

承接这篇文章,本篇讲述如何把FreeRTOS移植到启明欣欣STM32开发板里,比较简单,网上也有各种教程,本文也是参考其它文章,这里再记录一下。 一 搭建基础工程 启明欣欣STM32开发板上的MCU是STM32F407ZGT6,根据…

智能电视机安装App

每年的12月18日是世界电视机日,电视机诞生于1925年,最初是电子机械式电视机;到了1933年,诞生CRT电视,即黑白电视,它只有黑色或白色,看任何物品都是黑色或者白色。又过了20年,1953年彩…

Java之collection集合、常见数据结构、List和泛型

目录集合概述总结Collection集合的体系特点总结Collection集合常用APICollection集合的遍历方式方式一:迭代器总结方式二:foreach/增强for循环方式三:lambda表达式Collection集合存储自定义类型的对象总结常见数据结构数据结构概述、栈、队列…

【C++初阶】C++基础(一)

C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助,本文主要目标:1. 补充C语言语法的不足,以及C是如何对C语言设计不合理…

尚医通-首页显示-前端数据整合(二十六)

目录: (1)前台用户系统-首页显示-整合静态页面 (2)前台用户系统-首页显示-数据接口开发 (3)前端用户系统-首页显示-前端整合 (1)前台用户系统-首页显示-整合静态页面 …

代码随想录第七天(541、剑指05)

文章目录541. 反转字符串 II发现了三个基础知识的问题看答案改进剑指 Offer 05. 替换空格答案方法1答案方法2知识点一、二、三、总结541. 反转字符串 II 发现了三个基础知识的问题 第一个 这个题目发现了一个非常大的问题,有点不知道自己的Java基础到底有多少窟窿…

C++ 20 新特性 ranges 精讲

C 20 新特性 ranges 精讲 C20 中的 ranges 库使得使用 STL 更加舒适和强大。ranges 库中的算法是惰性的,可以直接在容器上工作,并且可以很容易地组合。简而言之,ranges 库的舒适性和强大性都源于它的函数思想。 在深入细节之前,…

程序员的7个被动收入途径——我如何每月赚 5万

每个人都想过时间和财富自由的生活,世界上有70亿人,但只有不到18000人能做到这一点,大多数人一生都在为钱工作。 研究表明,全世界65.8万富人至少有三种收入来源,而且都是被动收入。换句话说,大多数富人知道…

Create Realtime-chat app

Tech:React,Node.js,Socket.io,MongoDB styled-component ​​​​​​​ 目录 Base setup Register funcitonality Login funcitonality set Avatar/profile picture Chat container setup useEffect basic hook ChatHeader ChatInput ChatMessage Set socket an…

I.MX6ULL裸机开发笔记2:镜像文件

目录 一、boot ROM程序 二、镜像文件五要素 三、芯片手册 四、芯片手册数据解读 1、空偏移 2、IVT表 3、DCD表 一、boot ROM程序 选择内部启动方式,启动boot ROM程序 初始化时钟,外部DDR3从外部存储介质加载代码 boot ROM程序是芯片厂…

十五天学会Autodesk Inventor,看完这一系列就够了(十一),放样和螺旋扫掠(绘弹簧)

众所周知,Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad,所以再学习Inventor&…

Redis缓存数据 | 黑马点评

目录 一、什么是缓存 二、添加Redis缓存操作 三、缓存更新策略 缓存的更新策略 ​编辑 业务场景 主动更新策略 案例 四、缓存穿透 1、是什么 2、解决方案 (1)缓存空对象 (2)布隆过滤器 (3)其…

【春节安全保障有我们】安全狗春节放假值班通知

兔年纳福 辛勤拼搏了一年 终于迎来了福兔吉祥年 众人沉浸于准备过年的氛围中 却有些人为春节期间的网络安全担忧 因为春节也是不法分子们 伺机而动、“搞事情”的“好时机” 2023 NEW YEAR 不得不防的安全风险 1、主机安全遭受威胁 (云)主机系统…

Rust语言基础

安装 Rust 官网:https://www.rust-lang.org/Linux or Mac: curl https://rustup.rs -sSf | sh Windows: 按官网指示操作 Windows Subsystem for Linux: curl --proto ‘https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh 查看是否安装成功 rustc --version 更…

【openEuler】x2openEuler工具使用

文章目录一、关于x2openEuler二、工具准备三、前期准备1、安装CentOS72、下载x2openEuler3、安装x2openEuler4、执行bash5、访问上述网站6、安装x2openEuler-client(1)在CentOS-7.6Evetything1上找到x2openEuler-client(2)把x2ope…

Android Studio 支持手机投屏电脑

有时当我们在线上做技术分享或者功能演示时,希望共享连接中的手机屏幕,此时我们会求助 ApowerMirror,LetsView,Vysor,Scrcpy 等工具。如果你是一个 Android Developer,那么现在你有了更好的选择。 Android…

蓝桥杯--快排+队列+尺取法

😃这只松鼠如约而至 - 许嵩 - 单曲 - 网易云音乐 😃你买菜吗玫瑰 - 要不要买菜 - 单曲 - 网易云音乐 😃一起玩吧这世界那么多人(电影《我要我们在一起》主题曲) - 莫文蔚 - 单曲 - 网易云音乐 前言 这是我在CSD…

一文讲透单点登录架构思想(SSO)

目录什么是单点登录?非单点登录架构单点登录架构什么是CAS单点登录SSO演进1.同域2.同父域3.跨域CASCAS术语CAS场景单点登录优缺点优点缺点什么是单点登录? 单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份…