深入理解XGBoost(何龙 著)学习笔记(五)

本文接上一篇,内容为线性回归,介绍三部分,首先介绍了"模型评估”,然后分别提供了线性回归的模型代码:scikit-learn的LinearRegression 和 xgboost的gblinear 。

本文主要给出两种线性相关的python代码,初学者可以对照代码理解一下两种方法的差异。至此,线性相关的内容更新完毕~

3.2.2 🚜模型评估

模型评估是机器学习中的重要一环,用于评价模型是否具有实际应用价值。模型评估有很多种评估指标,分别适用于不同的机器学习任务,如分类、回归、排序等。很多评估指标同时适用于多种机器学习问题,如准确率、召回率,既可用于分类问题,也可用于 排序问题。线性回归主要用于解决回归问题,回归问题中常用的评估指标有MSE、RMSE、MAE等。本节主要介绍MSE,其他评估指标会在第7章中详细介绍。MSE(Mean Squared Error,均方误差)是指预测值和真实值差值平方的期望值,定义如下:

其中,N为样本数量;yᵢ 表示第i个样本的真实值;Pᵢ 表示第i个样本的预测值。MSE是衡量“平均误差”一种较方便的方法,可以反映数据的变化程度。MSE值越小,表示预测模型的准确性越高。

f582d962-3221-456e-9edb-95b5a60c3b95.png

3.2.3 通过线性回归预测波士顿房价

1)数据样本以及特征说明如下:

🚜:Number of Instances: 506(样本506个)

🚜:Number of Attributes: 13 continuous attributes, 1 binary-valued attribute.(13个连续属性,1个二值属性)

🚜:Attribute Information:

▶ CRIM::::>>>per capita crime rate by town(城镇人均犯罪率)

▶ ZN::::>>>proportion of residential land zoned for lots over 25,000 sq.ft.(住宅用地超过25000平方尺的比例)

▶ INDUS::::>>>proportion of non-retail business acres per town(城镇非零售商业用地比例)

▶ CHAS::::>>>Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)(查尔斯河(如果边界是河流,则为1,否则为0))

▶ NOX::::>>>nitric oxides concentration (parts per 10 million)(一氧化碳浓度)

▶ RM::::>>>average number of rooms per dwelling(住宅的平均房间数量)

▶ AGE::::>>>proportion of owner-occupied units built prior to 1940(1940年以前建成的自住单位比例)

▶ DIS::::>>>weighted distances to five Boston employment centres(到波士顿五个就业中心的加权距离)

▶ RAD::::>>>index of accessibility to radial highways(放射状高速公路可达性指数)

▶ TAX::::>>>full-value property-tax rate per $10,000;(每1万美元房产的全额财产税率)

▶ PTRATIO::::>>>pupil-teacher ratio by town(城镇的学生-教师比例)

▶ B::::>>>1000( - 0.63)^2 where ** is the proportion of 某类 by town(城镇中**居民的占比,的转换值:1000×(Bk - 0.63)²)

▶ LSTAT::::>>>%lower status of the population(低收入阶层人口百分比)

▶ MEDV::::>>>Median value of owner-occupied homes in $1000's)(自住房屋的中位数价值(单位:千美元),这一属性为因变量,其他都是自变量)

本部分提供两种线性回归方法的模型代码展示:scikit-learn的LinearRegression 和 xgboost的gblinear

样本数据示例如下:

d959e094-6f83-4b7a-a34c-4974aa678d4f.png

2)线性回归模型(scikit-learn的LinearRegression)

##以下为代码
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split  
from sklearn.linear_model import LinearRegression  
from sklearn.model_selection import cross_val_score   
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score, mean_squared_error
#读取数据(此处修改成自己的路径)
datafile = "D:/&%%&……/Boston Housing Dataset/Boston Housing/housing.data"
dataFrame = pd.read_csv(datafile,header=None,sep='\t')dataArray = np.zeros((len(dataFrame), 13))  # 创建dataframe存储 13 个特征
dataOutput = np.zeros((len(dataFrame), 1))  # 创建dataframe存储目标变量(房价)column_names = ["CRIM","ZN","INDUS","CHAS","NOX","RM","AGE","DIS","RAD","TAX","PTRATIO","B","LSTAT","MEDV"]#把自变量(特征)和因变量放入dataframe
for i in range(len(dataFrame)):  feature_string = dataFrame.iloc[i][0]feature_list = feature_string.split()  # 按空格分割字符串for j in range(len(feature_list)): if j != len(feature_list)-1:dataArray[i][j] = float(feature_list[j])  # 前 13 列是特征else:dataOutput[i] = float(feature_list[j])  # 最后一列是目标变量(房价 MEDV)#划分训练集和测试集    
X_train, X_test, y_train, y_test = train_test_split(dataArray, dataOutput ,test_size = 1/5.,random_state = 8)      # 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 1. 训练线性模型 # 
lr = LinearRegression()   
lr = LinearRegression()
lr.fit(X_train, y_train)# 2. 预测测试集
y_pred = lr.predict(X_test)# 用均方误差评估预测效果  
mse = mean_squared_error(y_test, y_pred)  
print("MSE: " + repr(mse))   # 3. 可视化预测效果
plt.figure(figsize=(12, 5))# 子图1:真实值 vs 预测值散点图
plt.subplot(1, 2, 1)
plt.scatter(y_test, y_pred, alpha=0.6, color='blue')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)  # 红色对角线
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title(f'真实值 vs 预测值 (R²={r2_score(y_test, y_pred):.2f})')
plt.grid(True)# 子图2:残差图
plt.subplot(1, 2, 2)
residuals = y_test - y_pred
plt.scatter(y_pred, residuals, alpha=0.6, color='green')
plt.axhline(y=0, color='r', linestyle='--')  # 零基准线
plt.xlabel('预测值')
plt.ylabel('残差')
plt.title(f'残差图 (MSE={mean_squared_error(y_test, y_pred):.2f})')
plt.grid(True)plt.tight_layout()
plt.show()# 打印模型系数
print("\n=== 模型系数 ===")# 处理截距项
if isinstance(lr.intercept_, (np.ndarray, list)):print("截距项:\n", np.array2string(lr.intercept_, formatter={'float_kind': lambda x: "%.4f" % x}))
else:print(f"截距项: {lr.intercept_:.4f}")# 处理系数(支持多维情况)
print("\n特征系数:")
if len(lr.coef_.shape) == 1:  # 单输出for i, coef in enumerate(lr.coef_):print(f"特征 {i}: {coef:.4f}")
else:  # 多输出for target_idx in range(lr.coef_.shape[0]):print(f"\n目标变量 {target_idx}:")for feat_idx, coef in enumerate(lr.coef_[target_idx]):print(f"特征 {feat_idx}: {coef:.4f}")
MSE: 21.638234406478805

图片

图片

3)线性回归模型(xgboost的gblinear)

​
import pandas as pd
import xgboost as xgb
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error#线性回归模型(xgboost的gblinear)
# 数据转换
train_xgb = xgb.DMatrix(X_train, y_train)
test_xgb = xgb.DMatrix(X_test, y_test)  # 参数设置(修正后)
# 参数设置
params = {"objective": "reg:squarederror","booster": "gblinear","eval_metric": "rmse",  # 评估指标"verbosity": 1          # 显示训练过程
}# 训练与验证(添加验证集监控)
evals_result = {}  # 用于存储评估结果
model = xgb.train(params=params,dtrain=train_xgb,num_boost_round=100,  # 迭代次数evals=[(train_xgb, "train"), (test_xgb, "test")],  # 监控数据集evals_result=evals_result,  # 记录评估结果verbose_eval=10  # 每10轮打印一次日志
)# 绘制训练曲线
plt.figure(figsize=(10, 6))
plt.plot(evals_result["train"]["rmse"], label="训练集RMSE")
plt.plot(evals_result["test"]["rmse"], label="测试集RMSE")
plt.xlabel("迭代次数")
plt.ylabel("RMSE值")
plt.title("XGBoost训练过程监控")
plt.legend()
plt.grid()
plt.show()# 训练与预测
y_pred = model.predict(xgb.DMatrix(X_test))# 用均方误差评估预测效果  
mse = mean_squared_error(y_test, y_pred)  
print("MSE: " + repr(mse))   # 计算R平方
from sklearn.metrics import r2_score
r2 = r2_score(y_test, y_pred)
print(f"R²分数: {r2:.4f}")# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题# 绘制散点图
plt.scatter(y_test, y_pred, alpha=0.5)  # alpha设置点透明度
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.title("预测效果散点图")# 添加参考线(理想情况下点应分布在这条线附近)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')plt.grid(True)  # 显示网格线
plt.show()​

MSE: 25.3748356194846 R²分数: 0.6575

小贴士1:xgboost的gblinear 和 scikit-learn的LinearRegression的区别是什么?

图片

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业级MySQL基准测试专家指南

工业级MySQL基准测试专家指南 一、深度风险识别增强版 风险类型典型表现进阶检测方案K8s存储性能抖动PVC卷IOPS骤降50%使用kubestone进行CSI驱动压力测试HTAP读写冲突OLAP查询导致OLTP事务超时用TPCH+Sysbench混合负载测试冷热数据分层失效压缩表查询耗时激增10倍监控INNODB_C…

Spring WebFlux和Spring MVC的对比

原文网址:Spring WebFlux和Spring MVC的对比-CSDN博客 简介 本文介绍Spring WebFlux和Spring MVC的区别。 Webflux:是异步非阻塞的(IO多路复用),基于Netty。适合网络转发类的应用,比如:网关。…

解析401 Token过期自动刷新机制:Kotlin全栈实现指南

在现代Web应用中,Token过期导致的401错误是影响用户体验的关键问题。本文将手把手实现一套完整的Token自动刷新机制,覆盖从原理到实战的全过程。 一、为什么需要Token自动刷新? 当用户使用应用时,会遇到两种典型场景:…

《解构线性数据结构的核心骨架:从存储模型到操作范式的深度解析》

线性数据结构概述 线性数据结构是数据元素按线性顺序排列的集合,每个元素有唯一的前驱和后继(除首尾元素)。常见类型包括数组、队列、链表和栈,每种结构在存储和操作上具有独特特性。 线性表:顾名思义,线性表就是数据排成像一条线的结构。每个线性表上的数据最多只有前和后…

HW蓝队工作流程

HW蓝队工作流程 由多领域安全专家组成攻击队,在保障业务系统安全的前提下,直接在真实网络环境开展对抗,对参演单位目标系进行可控、可审计的网络安全实战攻击,通过攻防演习检验参演单位的安全防护和应急处置能力,提高…

语音相关-浏览器的自动播放策略研究和websocket研究

策略详情 媒体参与度 AudioContext音频API的实现 new Audio音频API的实现 相关实践 网页端 使用new Audio创建的音频对象进行音频播放的时候,如果用户没有与页面进行交互,那么会报错如下: 使用AudioContext创建的对象播放音频,…

Linux操作系统网络服务模块一DHCP服务概述

前言: 在Linux网络服务体系架构中,​DHCP(Dynamic Host Configuration Protocol)​​ 作为核心服务之一,承担着局域网内主机网络参数动态分配的关键任务。其设计初衷是解决传统手动配置IP地址的效率瓶颈与错误风…

FPGA基础 -- Verilog语言要素之变量类型

Verilog 变量类型(Variable Types) 一、什么是变量类型? 在 Verilog 中,变量类型用于保存过程赋值结果(由 always 或 initial 块赋值),通常用于建模寄存器、状态、计数器等“带记忆”的硬件行为…

使用Haporxy搭建Web群集

目录 一、案例分析 1.案例概述 2.案例前置知识点 2.1 HTTP请求 2.2 负载均衡常用调度算法 2.3常见的Web群集调度器 3.案例环境 3.1本案例环境 二、案例实施 1.搭建两台web服务器 2.安装Haproxy 3.haproxy服务器配置 修改haproxy的配置文件 4.测试web群集 5.haproxy的日…

pikachu靶场通关笔记38 目录遍历(路径遍历)

目录 一、目录遍历 二、源码分析 三、目录遍历与文件包含 四、实战渗透 1、进入靶场 2、目录遍历 (1)访问ace.min.css (2)访问fileinclude.php 本系列为《pikachu靶场通关笔记》渗透实战,本文通过对目录遍历源…

现代C++:std::string全方位碾压C字符串

在 C 中引入的 std::string 是对 C 语言中 char* 和 const char* 的一种现代化封装和增强。它不仅解决了 C 字符串的许多缺陷(如安全性、内存管理、易用性等),还提供了丰富的 API 来简化字符串操作。本文将从多个维度详细对比 std::string 与…

20250619周四:Atlassian

今天主要把conference上的A xxx的所有资料大体看了一遍,花了两个多小时。 公司的这个conference系统,共实就是一个大型的可多人在线编辑的文件系统。差不多所有的资料都共享在上面。这对于多人参与的项目管理,还是相当方便的。 Atlassian最特…

通过CDH安装Spark的详细指南

通过CDH安装Spark的详细指南 简介 Cloudera Distribution of Hadoop (CDH) 是一个企业级的大数据平台,它集成了多个开源组件,包括Hadoop、Spark、Hive等。本文将详细介绍如何通过CDH安装和配置Spark。 前提条件 在开始安装之前,请确保满足以下条件: 已安装CDH集群具有管…

GitLab CVE-2025-5121 安全漏洞解决方案

本分分享极狐GitLab 补丁版本 18.0.2, 17.11.4, 17.10.8 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任…

【八股消消乐】Elasticsearch优化—检索Labubu

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

如何实现基于场景的接口自动化测试用例?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码&…

FreeRTOS 任务管理学习笔记

FreeRTOS 任务管理学习笔记 引言 本文档旨在通过在STM32微控制器上使用FreeRTOS来理解和实现任务管理。实验的重点是创建和管理多个任务、处理任务同步以及通过简单的硬件接口控制任务状态。 实验概述 实验涉及创建三个任务: LED1_Task: 每300毫秒切换一次LED。…

c++set和pair的使用

set是C中的一种关联容器,具有以下特点: 存储唯一元素(不允许重复) 元素自动排序(默认升序) 基于红黑树实现(平衡二叉搜索树) 插入、删除和查找的时间复杂度为O(log n) 前言 在C…

终端命令行执行具体的方法名测试用例

你可以使用如下命令单独执行 test_mutation_login_by_email 方法:python3 manage.py test apps.login.test_client.LoginTestCase.test_mutation_login_by_email 注意事项: 路径 apps.login.test_client 要与你项目实际的 Python 包路径一致(即 test_client.py 文件所在的包…

20250620在Ubuntu20.04.6下编译KickPi的K7的Android14系统

【处理SDK】 rootrootrootroot-X99-Turbo:~/Android14$ tar zxvf rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android14$ ll rootrootrootroot-X99-Turbo:~/Android14$ rm rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android1…