机器学习实践(1.2)XGBoost回归任务

前言

XGBoost属于Boosting集成学习模型,由华盛顿大学陈天齐博士提出,因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络,XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参、输入数据不变性等优势。本文只做XGBoost分类任务的脚本实现,更多XGBoost内容请查看文末 附加——深入学习XGBoost

机器学习实践(1.1)XGBoost分类任务

❤️ 本文完整脚本点此链接百度网盘链接获取 ❤️

一.轻松实现回归任务

1.1导入第三方库、数据集

"""第三方库导入"""
from xgboost import XGBRegressor
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import r2_score, mean_squared_error
import xgboost as xgb

"""波士顿房价数据集导入"""
data = datasets.load_boston()
# print(data)

"""训练集 验证集构建"""
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2,
                                                    random_state=42)

sklearn的波士顿房价数据集共506个数据样本,8:2切分后,训练集404个数据样本,验证集102个数据样本。数据集中包括 样本特征data(13个特征)、特征名称feature_names样本标签target(MEDV)、以及数据集位置filename(~~~\anaconda\lib\site-packages\sklearn\datasets\data\boston_house_prices.csv)

特征名称和标签解释如下:

- CRIM     per capita crime rate by town\n      # 按城镇划分的犯罪率  
- ZN       proportion of residential land zoned for lots over 25,000 sq.ft.\n  # 划分为25000平方英尺以上地块的住宅用地比例        
- INDUS    proportion of non-retail business acres per town\n     # 每每个城镇的非零售商业用地比例
- CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n        # 靠近查尔斯河,则为1;否则为0
- NOX      nitric oxides concentration (parts per 10 million)\n      # 一氧化氮浓度(百万分之一)
- RM       average number of rooms per dwelling\n  # 每个住宅的平均房间数      
- AGE      proportion of owner-occupied units built prior to 1940\n     # 1940年之前建造的自住单位比例  
- DIS      weighted distances to five Boston employment centres\n     # 到波士顿五个就业中心的加权距离
- RAD      index of accessibility to radial highways\n    # 辐射状公路可达性指数    
- TAX      full-value property-tax rate per $10,000\n   # 每10000美元的全额财产税税率
- PTRATIO  pupil-teacher ratio by town\n    # 按城镇划分的师生比例    
- B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town\n  # 1000(Bk-0.63)^2其中Bk是按城镇划分的黑人比例       
- LSTAT    % lower status of the population\n    # 人口密度   
- MEDV     Median value of owner-occupied homes in $1000's\n # 住房屋的中值(单位:1000美元)

1.2模型训练

"""模型训练"""
model = XGBRegressor()

# model = XGBRegressor(booster='gbtree',  # gblinear
#                      n_estimators=150,  # 迭代次数
#                      learning_rate=0.01,  # 步长
#                      max_depth=10,  # 树的最大深度
#                      min_child_weight=0.5,  # 决定最小叶子节点样本权重和
#                      seed=123,  # 指定随机种子,为了复现结果
#                      )

model.fit(X_train, y_train, verbose=True)

XGBRegressor()是没有指定参数,模型使用默认参数如下。也可以指定参数例如指定booster='gbtree'等。

learning_rate: float = 1.0,
subsample: float = 0.8,
colsample_bynode: float = 0.8,
reg_lambda: float = 1e-5,
**kwargs: Any

1.3模型验证

模型效果的验证,简单直接的可以通过验证集来实现。实际项目中通常将整个数据集按照7:3:1比例划分为训练集、验证集、测试集。本例使用验证集验证模型准确性。
回归任务的评估指标只要有 r2_score 和 mse,其中 r2_score 越趋近于1越好,mse 越小越好。
R2 【注释1】 = 1 - (SSE / TSS),其中,SSE(sum of squared errors 【注释2】)是模型预测值与实际观测值之间差异的平方和,TSS(total sum of squares【注释2】)是所有观测值与其均值差异的平方和。

y_pred = model.predict(X_test)
# print(y_pred)

for m, n in zip(y_pred, y_test):
    if m / n - 1 > 0.2:
        print('预测值为{0}, 真是结果为{1}, 预测结果偏差大于20%'.format(m, n))


def metrics_sklearn(y_valid, y_pred_):
    """模型效果评估"""
    r2 = r2_score(y_valid, y_pred_)
    print('r2_score:{0}'.format(r2))

    mse = mean_squared_error(y_valid, y_pred_)
    print('mse:{0}'.format(mse))


"""模型效果评估"""
metrics_sklearn(y_test, y_pred)

结果中仅打印了预测误差在20%以上的预测数据。
在这里插入图片描述

二.模型调参

def adj_params():
    """模型调参"""
    params = {
              'booster': ['gbtree', 'gblinear'],
              # 'n_estimators': [20, 50, 100, 150, 200],
              'n_estimators': [75, 125, 200, 250, 300],
              'learning_rate': [0.01, 0.03, 0.05, 0.1],
              'max_depth': [5, 8, 10, 12]
              }

    # model_adj = XGBRegressor()

    other_params = {'subsample': 0.8, 'colsample_bytree': 0.8, 'seed': 123}
    model_adj = XGBRegressor(**other_params)

    # sklearn提供的调参工具,训练集k折交叉验证(消除数据切分产生数据分布不均匀的影响)
    optimized_param = GridSearchCV(estimator=model_adj, param_grid=params, scoring='r2', cv=5, verbose=1)
    # 模型训练
    optimized_param.fit(X_train, y_train)

    # 对应参数的k折交叉验证平均得分
    means = optimized_param.cv_results_['mean_test_score']
    params = optimized_param.cv_results_['params']
    for mean, param in zip(means, params):
        print("mean_score: %f,  params: %r" % (mean, param))
    # 最佳模型参数
    print('参数的最佳取值:{0}'.format(optimized_param.best_params_))
    # 最佳参数模型得分
    print('最佳模型得分:{0}'.format(optimized_param.best_score_))


adj_params()

2.1调参过程

第1次调参,选择'booster': ['gbtree', 'gblinear']'n_estimators': [75, 125, 200, 250, 300],params如下:

params = {
        'booster': ['gbtree', 'gblinear'],
        # 'n_estimators': [20, 50, 100, 150, 200],
        'n_estimators': [75, 125, 200, 250, 300],
        # 'learning_rate': [0.01, 0.03, 0.05, 0.1],
        # 'max_depth': [5, 8, 10, 12]
    }

other_params = {'seed': 123}

由结果可以显著判断,booster='gbtree'的结果显著高于booster='gblinear'
在这里插入图片描述
第2次调参,选择'n_estimators': [75, 125, 200, 250, 300]'learning_rate': [0.01, 0.03, 0.05, 0.1],params如下:

params = {
        # 'booster': ['gbtree', 'gblinear'],
        # 'n_estimators': [20, 50, 100, 150, 200],
        'n_estimators': [75, 125, 200, 250, 300],
        'learning_rate': [0.01, 0.03, 0.05, 0.1],
        # 'max_depth': [5, 8, 10, 12]
    }

    # model_adj = XGBRegressor()

    other_params = {'booster': 'gbtree', 'seed': 123}

由结果可以显著判断,learning_rate学习率0.01时模型效果最差,0.03~0.1之间差异不大。n_estimators迭代次数增加模型效果会明显变好。
在这里插入图片描述第3次调参,…
第4次调参,…

调参是个无穷无尽的过程,适可而止,切误沉溺其中本末倒置,真正决定模型效果上限的还是数据质量

2.2调参结果入模

model = XGBRegressor(booster='gbtree',  # gblinear
                     n_estimators=300,  # 迭代次数
                     learning_rate=0.03,  # 步长
                     # max_depth=10,  # 树的最大深度
                     # min_child_weight=0.5,  # 决定最小叶子节点样本权重和
                     seed=123,  # 指定随机种子,为了复现结果
                     )

model.fit(X_train, y_train, verbose=True)

基础模型booster='gbtree',学习率learning_rate=0.03, 迭代次数n_estimators=300 参数入模,fit()训练带参的模型,模型的参数和评估见下方(三.模型保存、加载、调用预测)

三.模型保存、加载、调用预测

"""模型保存"""
model.save_model('xgb_regressor_boston.model')

"""模型加载"""
clf = XGBRegressor()
clf.load_model('xgb_regressor_boston.model')

"""模型参数打印"""
bst = xgb.Booster(model_file='xgb_regressor_boston.model')

# print(bst.attributes())
print('模型参数值-开始'.center(20, '='))
for attr_name, attr_value in bst.attributes().items():
    # scikit_learn 的参数逐一解析
    if attr_name == 'scikit_learn':
        import json

        dict_attr = json.loads(attr_value)
        # 打印 模型 scikit_learn 参数
        for sl_name, sl_value in dict_attr.items():
            if sl_value is not None:
                print(f"{sl_name}:{sl_value}")
    else:
        print(f"{attr_name}:{attr_value}")
print('模型参数值-结束'.center(20, '='))

"""预测验证数据"""
y_pred = clf.predict(X_test)

"""模型效果评估"""
metrics_sklearn(y_test, y_pred)

模型参数打印和预测评估结果如图,不再赘述。
在这里插入图片描述


内容解释:

【注释1】R-squared(R2)分数是回归模型性能的一种常见评估指标。它测量模型对观测数据的拟合程度。该分数介于0和1之间,越接近1表示模型对数据的拟合越好。具体来说,R2分数是观测数据和回归模型之间差异的比率。这个比率由1减去误差平方和(SSE)和总偏差平方和(TSS)之比得到。

计算公式为:

R2 = 1 - (SSE / TSS)

其中,SSE(sum of squared errors)是模型预测值与实际观测值之间差异的平方和,TSS(total sum of squares)是所有观测值与其均值差异的平方和。

【注释2】SSE和TSS是回归分析中常用的两个指标,分别代表回归模型的误差平方和和总偏差平方和。
SSE(Sum of Squared Errors)是指在回归分析中,对于给定的自变量,在模型中计算出的因变量值与实际观察值之间的误差,即模型拟合的不准确程度。SSE等于所有误差的平方和,可以通过对每个数据点的误差(预测值与实际值之差)的平方求和得到。SSE越小,代表回归模型与实际观察值的拟合程度越好。
TSS(Total Sum of Squares)是指将每个数据点的实际观察值和所有观察值的平均值之差的平方求和,这个值代表了数据的总方差,即数据中每个点偏离数据的平均值的程度。TSS用于评估模型的预测能力,因为它反映了实际观察值的变化范围。TSS越小,代表数据相对于它的平均值离散程度越小。

计算公式如下:

SSE = sum((y_true - y_pred) ** 2)

TSS = sum((y_true - np.mean(y_true)) ** 2)

其中,y_true为真实观察值,y_pred为模型预测值,np.mean(y_true)为真实观察值的均值。

附加——深入学习XGBoost

附加1.模型调参、训练、保存、评估和预测

见《XGBoost模型调参、训练、评估、保存和预测》 ,包含模型脚本文件

附加2.算法原理

见《XGBoost算法原理及基础知识》 ,包括集成学习方法,XGBoost模型、目标函数、算法,公式推导等

附加3.分类任务的评估指标值详解

见《分类任务评估1——推导sklearn分类任务评估指标》,其中包含了详细的推理过程;
见《分类任务评估2——推导ROC曲线、P-R曲线和K-S曲线》,其中包含ROC曲线、P-R曲线和K-S曲线的推导与绘制;

附加4.模型中树的绘制和模型理解

见《Graphviz绘制模型树1——软件配置与XGBoost树的绘制》,包含Graphviz软件的安装和配置,以及to_graphviz()和plot_trees()两个画图函数的部分使用细节;
见《Graphviz绘制模型树2——XGBoost模型的可解释性》,从模型中的树着手解释XGBoost模型,并用EXCEL构建出模型。

附加5.XGBoost实践

见机器学习实践(1.1)XGBoost分类任务,包含二分类、多分类任务以及多分类的评估方法。

❤️ 机器学习内容持续更新中… ❤️


声明:本文所载信息不保证准确性和完整性。文中所述内容和意见仅供参考,不构成实际商业建议,可收藏可转发但请勿转载,如有雷同纯属巧合。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud微服务(二)网关GateWay、Docker、Dockerfile、Linux操作超详细

目录 统一网关GateWay 搭建网关服务的步骤 1、引入依赖 2、编写路由配置及nacos地址 路由断言工厂Route Oredicate Factory 路由过滤器配置 全局过滤器GlobalFilter 过滤器执行顺序 跨域问题处理 Docker ​编辑 Docker与虚拟机 镜像和容器 Docker的安装 启动docke…

MSP432学习笔记11:定时器A的结构\基地址\函数汇总理解

今日得以继续我的电赛MSP432学习之路:所用开发板MSP432P401R 定时器是任何单片机开发板十分重要的模块,在几日的学习使用过程中,本人也对其使用原理等产生过许多疑问,他究竟是怎么存储计数值、捕获值的?一个定时器四个…

8.2 电压比较器(1)

电压比较器是对输入信号进行鉴幅与比较的电路,是组成非正弦波发生电路的基本单元电路,在测量和控制中有着相当广泛的应用。 一、概述 1、电压比较器的电压传输特性 电压比较器的输出电压 u O u_{\scriptscriptstyle O} uO​ 与输入电压 u I u_{\scr…

网络层:虚拟专用网VPN和网络地址转换NAT

1.网络层:虚拟专用网VPN和网络地址转换NAT 笔记来源: 湖科大教书匠:虚拟专用网VPN和网络地址转换NAT 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 1.1 虚拟专用网VPN 专用网和公用网的特点 专用网络&#xff…

Springboot集成magic-api

目录 1、前言 2、springboot集成magic-api 2.1、添加maven依赖 2.2、application.yml配置 2.3、编写测试接口 2.4、启动程序,访问接口 2.5、magic-api脚本 3、magic-api其他语法 4、注意事项 1、前言 今天项目中遇到一个问题,springboot后端项目…

探索ChatGPT:了解语言模型在对话系统中的应用

第一章:引言 在当今数字化时代,人工智能技术的迅猛发展使得对话系统成为一个备受关注的领域。随着语言模型的进步,像ChatGPT这样的模型正在改变我们与计算机进行交流的方式。本文将探索ChatGPT作为一种语言模型在对话系统中的应用&#xff0…

简化 Hello World:Java 新写法要来了

OpenJDK 的 JEP 445 提案正在努力简化 Java 的入门难度。 这个提案主要是引入 “灵活的 Main 方法和匿名 Main 类” ,希望 Java 的学习过程能更平滑,让学生和初学者能更好地接受 Java 。 提案的作者 Ron Pressler 解释:现在的 Java 语言非常…

Flutter 笔记 | Flutter 核心原理(三)布局(Layout )过程

布局过程 Layout(布局)过程主要是确定每一个组件的布局信息(大小和位置),Flutter 的布局过程如下: 父节点向子节点传递约束(constraints)信息,限制子节点的最大和最小宽…

【实战与杂谈】本地搭建自己的游戏王卡片生成器

声明: 1.游戏王卡片制作器本身就是由【kooriookami】开发的,用于DIY卡片因此我只是原有功能再现并不会追加新功能 2.其次数据和卡图均来源于网络,因此我也只提供网络能获取该内容的途径,并不会预先准备好 最近一直没有时间看回复…

SpringBoot的配置环境属性

SpringBoot的配置环境属性 在本文中,我们将讨论SpringBoot的配置环境属性。我们将了解如何使用这些属性来配置我们的应用程序,以便在不同的环境中运行。我们还将了解如何使用SpringBoot的配置文件来管理这些属性。最后,我们将介绍一些最佳实…

激活函数ReLU和SiLU的区别

文章目录 前言ReLU(Rectified Linear Unit)Leaky ReLUFReLU(Flatten ReLU)SiLU(Sigmoid Linear Unit)总结 前言 在这里,我就简单写一下两个激活函数的概念以及区别,详细的过程可以看…

【C++详解】——红黑树

目录 红黑树的概念 红黑树的性质 红黑树节点的定义 红黑树的结构 红黑树的插入操作 情况一 情况二 情况三 红黑树的验证 红黑树的查找 红黑树与AVL树的比较 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示…

校园网WiFi IPv6免流上网

ipv6的介绍 IPv6是国际协议的最新版本,用它来取代IPv4主要是为了解决IPv4网络地址枯竭的问题,也在其他很多方面对IPv4有所改进,比如网络的速度和安全性。 IPv4是一个32位的地址,随着用户的增加在2011年国家报道说IPv4的网络地址即…

SpringBoot整合模板引擎Thymeleaf(2)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 概述 Thymeleaf十分类似于JSP中使用的EL表达式。整体而言,Thymeleaf简洁、优雅、高效;非常适合小型项目的快速开发。 Thymeleaf常用标签简述 在此…

Socket安全(一)

文章目录 1. 安全Socket2. 保护通信3. 创建安全客户端Socket4. 选择密码组5. 事件处理器6. 会话管理 1. 安全Socket 前面介绍了Socket的基本使用,这里开始介绍Socket的安全问题,作为一个Internet用户,你确实有一些保护手段可以保护自己的隐私…

【MongoDB】四、MongoDB副本集的部署

【MongoDB】四、MongoDB副本集的部署 实验目的实验内容实验步骤实验小结 实验目的 能够通过部署副本集理解副本集机制,从而解决大数据项目中数据丢失的问题 实验内容 环境准备:根据表中的信息完成3台MongoDB服务器的部署(XXX是姓名拼音首字母…

Linux下使用Samba做域控

AI画妹子的工作先暂告一段落。毕竟戗行也是要有门槛的。 企业中使用Windows Server使用活动目录集中管理PC、服务器是很成熟的方案。突然想到,如果有一天出于某种原因不再使用微软方案了,AD该如何替代?问了一下chatGPT,它说&…

简易MFC的成绩管理系统

意义 掌握MFC控件的基本使用,结合了面向对象和Window消息机制的知识。 选择做简单的成绩管理系统,该项目切合大学生实际情况。易于更好理解。 项目实现了成绩的增加、修改、删除、存储(文件读写操作)的功能。 创建项目 打开软件…

浅谈企业能源监测管理系统的设计与应用

安科瑞 华楠 摘要: 针对企业目前能源监测现状, 结合企业信息化建设情况和发展需要, 介绍了能源监测管理信息系统, 提出了企业能源监测管理系统建设建议。 关键词:管理系统; 能源监测; 企业信息化 0 引言 节能降耗是缓解中国资源约束的根本出路, 也是提高企业自主创新能力的…

Vault从入门到精通系列之二:启动Vault服务器

Vault从入门到精通系列之二:启动Vault服务器 一、启动开发服务器二、设置环境变量三、验证服务器正在运行四、vault命令汇总 Vault 作为客户端-服务器应用程序运行。Vault 服务器是唯一与数据存储和后端交互的 Vault 架构。通过 Vault CLI 完成的所有操作都通过 TLS…