【xgboost】XGBoost

news2024/9/25 2:22:48

XGBoost

  • 1. 原理改进及特点
    • 1.1 遵循Boosting算法的基本建模流程
    • 1.2 平衡精确性与复杂度
    • 1.3 降低模型复杂度、提升运行效率
    • 1.4 保留部份GBDT属性
  • 2. sklearn接口(回归)
    • 2.1 导库 & 数据
    • 2.2 sklearn api普通训练
    • 2.3 sklearn api交叉验证
    • 2.4 查看属性接口
  • 3. xgboost原生代码(回归)
    • 3.1 导包
    • 3.2 DMatrix数据 xgboost.DMatrix()
    • 3.3 params参数 params={}
    • 3.4 不交叉验证 xgboost.train()
      • 3.4.1 参数 & 代码
      • 3.4.2 评估指标
    • 3.5 交叉验证 xgboost.cv()
  • 4. xgboost实现分类
    • 4.1 sklearn接口
    • 4.2 xgboost原生代码

1. 原理改进及特点

1.1 遵循Boosting算法的基本建模流程

依据上一个弱评估器f(x)k-1的结果,计算损失函数L;
并使用L自适应地影响下一个弱评估器f(x)k的构建。
集成模型输出的结果,受所有弱评估器f(x)0~f(x)K的影响.

1.2 平衡精确性与复杂度

树模型的学习能力和过拟合风险需要平衡,即预测精确性与模型复杂度之间的平衡,经验风险与结构风险之间的平衡。
一般建立模型后手动剪枝调节复杂度,XGBoost在迭代过程中实现平衡

  • XGBoost为损失函数加入结构风险项
    AdaBoost、GBDT追求损失函数L(y,y^)最小化;
    XGBoost追求目标函数O(y,y^) = L(y,y^) + 结构风险项最小化。
    XGBoost利用结构风险项控制过拟合,其他树模型依赖树结构max_depth,min_impurity_decrease等。
  • XGBoost使用新不纯度衡量指标
    一般算法建CART树,分类使用信息增益,回归使用MSE或弗里德曼MSE;
    XGBoost设定分支指标结构分数,基于结构分数的结构分数增益向整体结构简单的方向建树

1.3 降低模型复杂度、提升运行效率

决策树建树,需要对每一个特征上所有潜在的分支节点进行不纯度计算。XGBoost多种优化技巧优化提升效率:

  • 全新建树流程
    使用估计贪婪算法、平行学习、分位数草图算法等,适用于大数据。
  • 提升硬件运算性能
    使用感知缓存访问技术、核外计算技术。
  • 建树增加随机性
    引入Dropout技术。

1.4 保留部份GBDT属性

  • 弱评估器是回归器,借助sigmoid或softmax实现分类。
  • 拟合负梯度
    GBDT中每次用于建立评估器的是样本X,以及当下集成输出H(xi)与真是标签y之间的伪残差(负梯度)。
    当损失函数是1/2 MSE时,负梯度等同于残差。
    XGBoost同样依赖于拟合残差来影响后续弱评估器建立
  • 抽样思想
    对样本和特征进行抽样增大弱评估器之间的独立性。

2. sklearn接口(回归)

2.1 导库 & 数据

from sklearn.model_selection import KFold, cross_validate
from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor
'''
xgboost提供的sklearn api
    XGBRegressor()    实现xgboost回归
    XGBClassifier()   实现xgboost分类
    XGBRanker()       实现xgboost排序
    XGBRFClassifier() 基于xgboost库实现随机森林分类
    XGBRFRegressor()  基于xgboost库实现随机森林回归
'''
from sklearn.datasets import load_digits

data = load_digits()
X = data.data
y = data.target
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=1412)
print(Xtrain.shape, Xtest.shape)
'''
    (1257, 64) (540, 64)
'''

2.2 sklearn api普通训练

# sklearn普通训练:实例化,fit,score
# booster 使用弱评估器建树,可选gbtree,gbliner,dart
xgb_sk = XGBRegressor(random_state=1412)
xgb_sk.fit(Xtrain, Ytrain)
xgb_sk.score(Xtest, Ytest) # 默认评估指标R^2
'''
    0.831818417176343
'''

2.3 sklearn api交叉验证

# sklearn交叉验证:实例化,交叉验证,结果求平均
xgb_sk = XGBRegressor(random_state=1412)
cv = KFold(n_splits=5, shuffle=True, random_state=1412)
result_xgb_sk = cross_validate(xgb_sk
                              ,X,y
                              ,scoring='neg_root_mean_squared_error' #-RMSE
                              ,return_train_score=True
                              ,verbose=True
                              ,n_jobs=-1
                              )
result_xgb_sk
'''
    {'fit_time': array([1.49709201, 1.51305127, 1.5214994 , 1.52006483, 1.49009109]),
     'score_time': array([0.00797772, 0.0069809 , 0.02449441, 0.00797725, 0.01301908]),
     'test_score': array([-1.3107202 , -1.3926962 , -1.34945876, -1.18663263, -1.49893354]),
     'train_score': array([-0.0196779 , -0.02156499, -0.0167526 , -0.01670659, -0.02254371])}
'''
def RMSE(result, name):
    return abs(result[name].mean())

RMSE(result_xgb_sk, 'train_score')
'''
    0.019449156665978885
'''
RMSE(result_xgb_sk, 'test_score')
'''
    1.347688263452443
'''

2.4 查看属性接口

# sklearn查看属性接口
xgb_sk = XGBRegressor(max_depth=5).fit(X,y)
xgb_sk.feature_importances_ # 特征重要性
'''
    array([0.        , 0.00225333, 0.00230321, 0.00326973, 0.00863725,
           0.00895859, 0.00746422, 0.00157759, 0.        , 0.00096148,
           0.00569782, 0.00173326, 0.02128937, 0.00525403, 0.00283347,
           0.00028462, 0.00450659, 0.00130977, 0.01772124, 0.00536137,
           0.04007934, 0.06141694, 0.00869896, 0.00226618, 0.        ,
           0.00413993, 0.01785861, 0.03045771, 0.0369929 , 0.03439412,
           0.04346734, 0.00481802, 0.        , 0.04838382, 0.01810016,
           0.03241276, 0.06217332, 0.00609181, 0.00342981, 0.        ,
           0.        , 0.00546112, 0.04138443, 0.00643031, 0.00676051,
           0.00443247, 0.00591809, 0.        , 0.        , 0.00230393,
           0.00367385, 0.02346367, 0.0843313 , 0.01382598, 0.00216754,
           0.00023067, 0.        , 0.00051113, 0.01587264, 0.00686751,
           0.01672259, 0.01588235, 0.00281848, 0.18434276], dtype=float32)
'''
# 调出单独的树
xgb_sk.get_booster()[1] 
'''
    <xgboost.core.Booster at 0x1f23889a550>
'''
# 一共建立树数量,n_estimators取值
xgb_sk.get_num_boosting_rounds() 
'''
    100
'''
# 获取参数取值
xgb_sk.get_params()
'''
    {'objective': 'reg:squarederror',
     'base_score': 0.5,
     'booster': 'gbtree',
     'callbacks': None,
     'colsample_bylevel': 1,
     'colsample_bynode': 1,
     'colsample_bytree': 1,
     'early_stopping_rounds': None,
     'enable_categorical': False,
     'eval_metric': None,
     'gamma': 0,
     'gpu_id': -1,
     'grow_policy': 'depthwise',
     'importance_type': None,
     'interaction_constraints': '',
     'learning_rate': 0.300000012,
     'max_bin': 256,
     'max_cat_to_onehot': 4,
     'max_delta_step': 0,
     'max_depth': 5,
     'max_leaves': 0,
     'min_child_weight': 1,
     'missing': nan,
     'monotone_constraints': '()',
     'n_estimators': 100,
     'n_jobs': 0,
     'num_parallel_tree': 1,
     'predictor': 'auto',
     'random_state': 0,
     'reg_alpha': 0,
     'reg_lambda': 1,
     'sampling_method': 'uniform',
     'scale_pos_weight': 1,
     'subsample': 1,
     'tree_method': 'exact',
     'validate_parameters': 1,
     'verbosity': None}
'''

3. xgboost原生代码(回归)

3.1 导包

from sklearn.datasets import load_digits
import xgboost # 原生代码只需导入xgboost

data = load_digits()
X = data.data
y = data.target
print(X.shape,y.shape)
'''
    (1797, 64) (1797,)
'''

3.2 DMatrix数据 xgboost.DMatrix()

  • 必须使用xgboost自定义的数据结构DMatrix
'''
返回专用的DMatrix对象
不能索引和循环读取, 即不可查看和修改
不分X,y,特征和标签同时打包,训练时作为dtrain的输入
'''
data_xgb = xgboost.DMatrix(X,y)
print(data_xgb)
'''
若需划分训练测试集,需提前划分再转换类型
'''
from sklearn.model_selection import train_test_split

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=1412)
dtrain = xgboost.DMatrix(Xtrain, Ytrain)
dtest = xgboost.DMatrix(Xtest, Ytest)
print(dtrain, dtest)
'''
    <xgboost.core.DMatrix object at 0x000001F237D29DC0>
    <xgboost.core.DMatrix object at 0x000001F237D293A0> <xgboost.core.DMatrix object at 0x000001F237E36370>
'''

3.3 params参数 params={}

'''
定义参数
参数名称会与sklearn有区别,seed随机数种子
这里的seed是boosting过程的随机数种子
'''
params = {'max_depth':5, 'seed':1412}

3.4 不交叉验证 xgboost.train()

3.4.1 参数 & 代码

'''
xgboost.train()
    包含了实例化和训练过程,返回实例
    训练时没区分回归分类,默认执行回归算法
    
.train()中,params外
    num_boost_round 控制建树数量(迭代次数)
    提前停止
    一般来说除了上述两个参数,其余参数设置在params中
params中
    xgb_model 指定弱评估器,可选gbtree,gbliner,dart评估器有不同的params列表
    eta boosting算法中的学习率
    objective 用于优化的损失函数,分类使用
    base_score 初始化预测结果H0的值
    max_delta_step 一次迭代中允许的最大迭代值

    目标函数参数 https://www.bilibili.com/video/BV1Au411B7bC
    gamma,lambda,alpha 放大可控制过拟合
'''
reg = xgboost.train(params, data_xgb, num_boost_round=100)
y_pred = reg.predict(data_xgb)
y_pred
'''
    array([-0.10801424,  0.84069467,  2.083782  , ...,  8.143546  ,
            8.9779825 ,  8.03064   ], dtype=float32)
'''

3.4.2 评估指标

# 评估指标
# 借用sklearn.metrics
from sklearn.metrics import mean_squared_error as MSE

# squared=False 使用RMSE
MSE(y, y_pred, squared=False)
'''
    0.10822869258896699
'''
# 特征重要性
from xgboost import plot_importance
plot_importance(reg)
'''
    <AxesSubplot:title={'center':'Feature importance'}, xlabel='F score', ylabel='Features'>
'''

在这里插入图片描述

3.5 交叉验证 xgboost.cv()

'''
不会返回模型,train()可以返回模型
返回评估指标和数值
'''
result = xgboost.cv(params, data_xgb, num_boost_round=100
                   ,nfold=5 # 5折
                   # 交叉验证的随机数种子
                   # params中seed是建树的随机数种子
                   ,seed=1412
                   )
'''
返回DataFrame
100行代表num_boost_round定义迭代100次
每一次迭代都会进行5折交叉验证,显示结果为5次的平均
4列,训练集/测试集 上的 均值/标准差
很适合用来绘制图像
'''
result
train-rmse-meantrain-rmse-stdtest-rmse-meantest-rmse-std
03.6381850.0396323.6777300.202608
12.7634500.0287392.8781120.173517
22.1282770.0208192.3033250.152110
31.6775890.0277721.9110490.117346
41.3735730.0346421.6579490.097172
...............
950.0946390.0044661.0766970.055437
960.0925240.0041421.0764980.055798
970.0910610.0039361.0764790.055860
980.0897550.0038741.0764140.055971
990.0885330.0036731.0765860.056002

100 rows × 4 columns

import matplotlib.pyplot as plt

# dpi=300分辨率,figsize=[,]画布大小
plt.figure()
plt.plot(result['train-rmse-mean'])
plt.plot(result['test-rmse-mean'])
plt.legend(['train', 'test'])
plt.title('xgboost 5fold cv')

在这里插入图片描述

4. xgboost实现分类

4.1 sklearn接口

from xgboost import XGBClassifier

4.2 xgboost原生代码

'''
objective:
“reg:linear” 线性回归.
“reg:logistic" 逻辑回归.
“binary:logistic” 二分类的逻辑回归问题,输出为概率.
“binary:logitraw” 二分类的逻辑回归问题,输出的为wTx.
“count:poisson” 计数问题的poisson回归,输出结果为poisson分布.max_delta_step默认为0.7.(used to safeguard optimization)
“multi:softmax” softmax处理多分类问题,同时需要设置参数num_class(类别个数).
“multi:softprob” 输出各个分类概率,ndata*nclass向量,表示样本所属于每个类别的概率.
“rank:pairwise” set XGBoost to do ranking task by minimizing the pairwise loss.
'''
params = {'learning_rate':0.1
         ,'max_depth':5
         ,'objective':'multi:softmax'
         # ,'objective':'multi:softprob'
         ,'num_class':10
         ,'random_state':1412
         , 'eta':0.8 # boosting算法中的学学习率
         }
model = xgboost.train(params, data_xgb, num_boost_round=10)
y_pred = model.predict(data_xgb)
y_pred
'''
    array([0., 1., 2., ..., 8., 9., 8.], dtype=float32)
'''

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

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

相关文章

Redis数据持久化方案

作为集中式缓存的优秀代表&#xff0c;Redis可以帮助我们在项目中完成很多特定的功能。Redis准确的说是一个非关系型数据库&#xff0c;但是由于其超高的并发处理性能&#xff0c;及其对于缓存场景所提供的一系列能力构建&#xff0c;使其成为了分布式系统中的集中缓存的绝佳选…

深入学习Vue.js(十)异步组件和函数式组件

文章目录异步组件需要解决的问题异步组件实现原理1.封装defineAsyncComponent函数2.超时与error3.延迟和Loading组件函数式组件异步组件需要解决的问题 允许用户指定加载出错时要渲染的组件允许用户指定Loading组件&#xff0c;以及展示该组件的延迟时间允许用户设置加载组件的…

8. R语言绘图系统介绍、高级绘图与低级绘图、【绘图参数】、绘图函数包

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff0c;有点废话&#xff09;&…

筑基一层 —— 高质量C编程建议、详解猜数字游戏

目录 一.修炼必备 二.高质量C编程 2.1 高质量C编程的思维导图&#xff08;需要思维导图的加qq:972606225获取) 2.2 文件结构 2.3 程序的形式 2.4 命名规则 三.猜数字游戏详解 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff1a;Visual S…

torch_geometric -- Pooling Layers

torch_geometric – Pooling Layers global_add_pool 通过在节点维度上添加节点特征来返回批量图级输出&#xff0c;因此对于单个图 它的输出由下式计算 from torch_geometric.nn import global_mean_pool, global_max_pool, global_add_pool import torch as thf [[1,2,3,4…

Wider Face+YOLOV8人脸检测

YOLO系列的算法更新实在太快了&#xff0c;前些天刚学习完YOLOV7&#xff0c;YOLOV8就出来了。今天先理解模型的训练过程&#xff0c;后续再学习V8的网络结构等细节。YOLOV8源码链接&#xff1a;https://github.com/ultralytics/ultralytics1 数据格式转换Wider Face数据格式转…

java -- 14 多态、内部类、常用API

自动类型转换&#xff1a;多态下引用数据类型的类型转换强制类型转换案例&#xff1a;定义usb接口&#xff1a;定义鼠标和键盘的usb实现类&#xff0c;并有自己特有的方法&#xff0c;重写usb接口的方法&#xff0c;里面穿插了多态创建电脑类&#xff0c;把usb接口揉和进去&…

如何改变视频的MD5值?一分钟让你学会操作

肯定很多不是从事自媒体的朋友对MD5不是很熟悉&#xff0c;但其实它类似于人的身份证&#xff0c;只不过我们的身份证是一串数字&#xff0c;而它则是视频的后台编码&#xff0c;所以这也是一些平台用MD5来判断视频是否重复的依据。那么有人会问了&#xff0c;既然MD5这么特殊&…

Java实战:使用Hutool中的MailUtil实现邮件的发送

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️荣誉&#xff1a; CSDN博客专家、数据库优质创作者&#x1f3c6;&…

EasyExcel的导入导出使用

1、说明 EasyExcel是阿里出的一款基于Java的、快速、简洁、解决大文件内存溢出的处理Excel的开源工具&#xff0c;本文主要是使用这个工具对Excel导入导出进行讲解。 官网&#xff1a; https://easyexcel.opensource.alibaba.com/github&#xff1a; https://github.com/alib…

达梦主备之备库失联后在线恢复加入集群

一、主库故障重启&#xff08;备库接管前重启&#xff09; 主库故障后立即重启&#xff0c;此时主库的守护进程变成 Startup 状态&#xff0c;重新进入守护进程的 启动流程&#xff0c;将数据一致的备库归档设置为有效状态&#xff0c;其余备库归档设置成无效状态&#xff0c;并…

一些工具软件的使用

文章目录010 Editor设置16进制编辑时每行显示的字节数使用列模式编辑VS Code基础操作定义快捷键配置导出/导入列模式将文件中的tab键转换为空格关闭插件自动更新博文链接Beyond Compare文件内容相同依然显示差异过滤文件或文件夹Excel使用组合&#xff0c;进行行、列的折叠使用…

【DX-BT24蓝牙模块-AT命令与手机透传教程】

【DX-BT24蓝牙模块-AT命令与手机透传教程】1. 前言1.1.串口基本参数1.2.AT命令模式和透传模式1.3.模块数据吞吐量2. 接线2.1 模块线序定义2.2 相关AT命令详解2.2.1 命令格式说明2.2.2 回应格式说明2.2.3 AT命令举例说明3. AT命令详解3.1 基础指令3.2 AT指令测试3.3 手机测试4. …

英华特在创业板提交注册:拟募资约5亿元,股权结构较为分散

近日&#xff0c;苏州英华特涡旋技术股份有限公司&#xff08;下称“英华特”&#xff09;在上海证券交易所递交注册。据贝多财经了解&#xff0c;英华特的上市申请于2021年6月30日获得受理&#xff0c;2022年8月25日获得创业板上市委会议通过。 本次冲刺上市&#xff0c;英华特…

智合同丨你还在为填写合同台账犯愁吗?

最近有朋友问我有没有什么智能化手段处理合同台账问题&#xff1f;对方表示合同台账管理实在是太麻烦了&#xff0c;工作量大&#xff0c;占用时间多。答案肯定是有的&#xff0c;那么首先我们来了解下合同台账。合同台账一般指合同台帐&#xff0c;包括合同登记台帐、合同检查…

Solidity 中的数学(第 1 部分:数字)

本文开启了一系列关于在 Solidity 中进行数学运算的文章。第一个要讨论的话题是&#xff1a;数字。 介绍 以太坊是一个可编程的区块链&#xff0c;其功能可以通过将称为智能合约的可执行代码片段发布到区块链本身来扩展。这将以太坊与第一代区块链区分开来&#xff0c;在第一代…

PointNet.pytorch点云三维深度学习论文与代码复现

PointNet.pytorch1. 概要1.1 文章1.2 点云和三维深度学习&#xff0c;PointNet 网络结构1.3 复现说明2. 代码2.1 代码逻辑2.2 思路详解3. 解析组会2023.1.18远程arcivdailyonedb1. 概要 1.1 文章 链接: 论文 1.2 点云和三维深度学习&#xff0c;PointNet 网络结构 链接: 三…

程序员必备素质:代码整洁之道

本次分享的内容是《代码整洁之道》&#xff0c;书中是以现实案例&#xff0c;以讲故事形式来总结归纳问题&#xff0c;并给出解决方案&#xff0c;很容易与我们产生共鸣。文中会有大量书中内容摘抄&#xff0c;都是个人认为很值得分享的内容。当然&#xff0c;也会有个人感悟&a…

【C++】从0到1入门C++编程学习笔记 - 基础入门篇:C++初识

文章目录一、第一个C程序1.1 创建项目1.2 创建文件1.3 编写代码1.4 运行程序二、注释三、变量四、常量五、关键字六、标识符命名规则一、第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1.1 创建项目 Visual Studio是我们用来编写C程序的主要…

【C语言课程设计】通讯录(2.0版本)

前言 在前面的博客中&#xff0c;我们已经了解了通讯录的基本写法。当然那个通讯录是不够完善的。我们本小节对前面的通讯录做一次小升级&#xff0c;添加动态增容模块与利用枚举来优化选择语句 【C语言课程设计】通讯录&#xff08;1.0版本&#xff09;_青色_忘川的博客-CSDN博…