梯度提升树(GBDT)与房价预测案例

文章目录

    • 什么是梯度提升树(GBDT)?
      • 核心思想
      • GBDT 的特点
    • 梯度提升树的应用案例:房价预测
      • 场景描述
      • 步骤详解
      • 代码详情
    • 详细代码讲解
      • 1. 导入必要的库
      • 2. 设置中文字体支持
      • 3. 可视化真实值与预测值
      • 4. 可视化预测误差分布
      • 5. 代码的运行效果
      • 可视化结果分析
        • 1.模型表现:
        • 2.优化建议:
    • 总结

在这里插入图片描述

什么是梯度提升树(GBDT)?

梯度提升树(Gradient Boosting Decision Tree, GBDT)是一种集成学习算法,它结合多个弱学习器(通常是决策树),通过迭代优化的方式提升模型性能。GBDT 在分类和回归任务中表现优异,是解决复杂非线性问题的重要工具。

核心思想

GBDT 的核心在于:将新的决策树用于拟合当前模型的残差(误差),从而逐步降低误差,提高预测精度。整个过程可以理解为通过梯度下降法优化目标函数。

  1. 初始化模型:
    模型从一个简单的常数值开始(比如回归问题中是目标变量的均值):
    在这里插入图片描述

  2. 计算残差:
    对于每一轮迭代,计算目标函数的负梯度作为伪残差:
    在这里插入图片描述

    残差表示当前模型预测值与真实值之间的差异。

  3. 拟合决策树:
    用一个新的决策树 hm(x) 来拟合这些残差。

  4. 更新模型:
    通过学习率 η 控制每次更新的幅度:
    在这里插入图片描述

经过多轮迭代后,GBDT 会生成一个强大的预测模型。


GBDT 的特点

  • 强大的非线性处理能力: 能够自动捕捉特征间的非线性关系。
  • 鲁棒性高: 对缺失值和异常值有较高的容忍度。
  • 灵活性强: 支持分类和回归任务,广泛用于信用评分、房价预测等场景。

梯度提升树的应用案例:房价预测

场景描述

假设我们需要预测某地区的房价,数据集包含以下特征:

  • 房屋面积(area): 房屋的实际面积大小;
  • 房间数量(rooms): 房屋的卧室和客厅数量;
  • 地理位置(location): 用编号表示的房屋所在地区;
  • 建成年份(year_built): 房屋的建造年份。

目标是通过这些特征预测房价,构建一个回归模型。


步骤详解

房价预测的数据集,您可以通过以下链接下载:

下载房价数据集
在这里插入图片描述
如果下载不了,三连私聊我。免费为大家提供。。。。。。

数据集包含以下特征:

  • area:房屋面积(50-300平米)
  • rooms:房间数量(1-6个房间)
  • location:地理位置编号(1-10)
  • year_built:房屋建造年份(1970-2020)
  • price:房价(元)

代码详情

import matplotlib.pyplot as plt
import matplotlib# 设置字体以支持中文显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
matplotlib.rcParams['axes.unicode_minus'] = False   # 正常显示负号# 加载生成的数据集
file_path = '/mnt/data/housing_data.csv'
data = pd.read_csv(file_path)# 特征与目标变量
X = data[['area', 'rooms', 'location', 'year_built']]
y = data['price']# 数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化并训练 GBDT 模型
gbdt_model = GradientBoostingRegressor(n_estimators=200,       # 决策树的数量learning_rate=0.05,     # 学习率max_depth=5,            # 决策树的最大深度random_state=42         # 保证结果可重复性
)# 模型训练
gbdt_model.fit(X_train, y_train)# 对测试集进行预测
y_pred = gbdt_model.predict(X_test)# 计算均方误差和均方根误差
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"均方误差 (MSE): {mse:.2f}")
print(f"均方根误差 (RMSE): {rmse:.2f}")# 可视化真实值与预测值的对比
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.6, color='b', label='预测值')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', label='理想预测线')
plt.xlabel('真实房价')
plt.ylabel('预测房价')
plt.title('真实房价 vs 预测房价')
plt.legend()
plt.grid(True)
plt.show()# 误差分布可视化
errors = y_test - y_pred
plt.figure(figsize=(10, 6))
plt.hist(errors, bins=30, color='gray', edgecolor='black', alpha=0.7)
plt.axvline(0, color='r', linestyle='--', label='无误差线')
plt.xlabel('误差 (真实值 - 预测值)')
plt.ylabel('样本数量')
plt.title('预测误差分布')
plt.legend()
plt.grid(True)
plt.show()

详细代码讲解

代码中的可视化通过 Matplotlib 库完成,以下是关键步骤和详细解释:


1. 导入必要的库

import matplotlib.pyplot as plt
import matplotlib
  • matplotlib.pyplot:提供绘图功能。
  • matplotlib:用于设置全局字体和样式。

2. 设置中文字体支持

为了使中文能够正常显示,添加以下代码:

matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为黑体
matplotlib.rcParams['axes.unicode_minus'] = False   # 确保负号正常显示
  • font.sans-serif:指定使用的字体。
  • axes.unicode_minus:防止负号显示为方块。

3. 可视化真实值与预测值

plt.figure(figsize=(10, 6))  # 创建一个大小为10x6的画布
plt.scatter(y_test, y_pred, alpha=0.6, color='b', label='预测值')  # 绘制散点图
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', label='理想预测线')  # 理想线
plt.xlabel('真实房价')  # 设置X轴标签
plt.ylabel('预测房价')  # 设置Y轴标签
plt.title('真实房价 vs 预测房价')  # 设置图表标题
plt.legend()  # 显示图例
plt.grid(True)  # 显示网格
plt.show()  # 显示图表
  • scatter:绘制散点图,展示预测值与真实值的分布。
  • plot:绘制红色虚线(理想预测线),用于对比模型性能。
  • xlabel / ylabel / title:设置坐标轴标签和图表标题。
  • legend:为图表添加图例。
  • grid:启用网格,使图表更清晰。

4. 可视化预测误差分布

errors = y_test - y_pred  # 计算预测误差
plt.figure(figsize=(10, 6))  # 创建一个大小为10x6的画布
plt.hist(errors, bins=30, color='gray', edgecolor='black', alpha=0.7)  # 绘制误差分布直方图
plt.axvline(0, color='r', linestyle='--', label='无误差线')  # 添加误差为0的参考线
plt.xlabel('误差 (真实值 - 预测值)')  # 设置X轴标签
plt.ylabel('样本数量')  # 设置Y轴标签
plt.title('预测误差分布')  # 设置图表标题
plt.legend()  # 显示图例
plt.grid(True)  # 显示网格
plt.show()  # 显示图表
  • hist:绘制直方图,展示误差的分布情况。
  • axvline:绘制红色虚线,标注误差为0的位置。
  • bins:设置直方图的分箱数量,影响柱状条的宽度。

5. 代码的运行效果

运行代码后,将生成两个图表:

  1. 真实房价 vs 预测房价

    • 直观展示模型预测值与真实值的相关性。
    • 理想情况下,所有点应分布在红色虚线上。
      在这里插入图片描述
  2. 预测误差分布

    • 展示误差的范围和分布情况。
    • 判断误差是否集中在0附近,以及是否存在较大的偏差。

---

通过以上可视化分析,可以直观评估模型的预测效果,并发现可能需要改进的地方(例如误差较大的样本或整体分布偏差)。

可视化结果分析

1.模型表现:
  • 模型总体预测性能较好,尤其是中低价区间的房价预测。
  • 高价房的预测精度需要进一步优化。
  • 误差集中在 -50,000 到 50,000 范围内,表明模型在大部分样本上的误差较小。
2.优化建议:
  • 对高房价样本进行数据增强或特征优化。
  • 采用更高级的模型(如 XGBoost 或 LightGBM),进一步降低误差。
  • 进行超参数调优,增强模型在复杂数据上的表现。

总结

梯度提升树(GBDT)通过逐步拟合残差,在回归问题中表现优异。在房价预测任务中,GBDT 能够自动捕捉复杂的特征关系,提供准确的预测结果,同时特征重要性分析为业务决策提供支持。

GBDT 的优点包括性能优越、易解释性强,但在大规模数据集上可能面临训练速度较慢的挑战。通过合理调整超参数(如树的数量、学习率等),可以进一步优化模型效果,适应不同场景的需求。

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

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

相关文章

VMware详细安装教程

1.获取安装包 官网下载地址: https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 2.安装过程 双击安装包进行安装 接受许可协议 选择安装路径(c 盘空间大的话,建议保持默认) 用户体验设置&…

STM32 软件模拟I2C 操作时序图

m24c02芯片手册可以查看时序图 起始和停止信号 写一个字节: 主发送起始-》 CPU 芯片内部的I2C 控制器(片上外设主设备)-》发送起始信号-》发送设备地址-》EEPROM(从设备)返回回应信号-》主发字节起始地址-》从回应-》…

2024年软件测试面试题(800道)【附带答案】持续更新...

新的一年又到了立flag的时候,今年你的目标是拿下大厂offer?还是多少万年薪?其实这些都离不开日积月累的过程。 为此我特意整理出一份(超详细笔记/面试题)它几乎涵盖了所有的测试开发技术栈,非常珍贵&#…

jdk1.7 发送post请求

所需依赖为 引入依赖为 import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod;特别说明 tmpString为json对象 System.out.println("tmpString " tmpString);// 处理发送https 错误问题SSLContext context …

鸿蒙音乐播放器(超详细)

基于API9的音乐播放器,可播放,暂停,上,下一首歌曲切换等功能 文章目录 1.效果展示 2.首页 3.播放页 注:需要使用模拟器或真机调试运行 一、效果展示 1.首页样式: 2.播放样式: 二、首页功能代码…

基于SQL数据库的酒店管理系统

一、数据库设计 1.需求分析 客房的预定:可以通过网络进行预定,预定修改,取消预订。 客房管理:预定管理、客房查询、设置房态、开房、换房、续住、退房等管理。 员工管理: 员工修改信息、人员调配。 账务管理&…

绿色智能:AI机器学习在环境保护中的深度应用与实践案例

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

2.vue常用指令

2.vue常用指令 目录 1. vue的基础语法结构2. 插值语法3. vue常用指令 3.1 v-html语法结构3.2 v-text3.3 v-bind 绑定动态属性3.4 v-on 添加事件 语法格式3.4.1事件绑定3.4.2 获取event对象3.4.3 动态事件缩写3.4.5 事件绑定的修饰符 3.5 v-if v-else-if v-else5.6 v-show5.7 …

《Solana 中文开发教程》学习笔记(Part 1~4)

Part 1 :Solana介绍 2017年11月,Anatoly Yakovenko发表了一篇白皮书,介绍了“Proof of History”这一技术 Part 2 :Solana介绍 Account 在Solana中,"Everythin is an Account" 类似Linux世界里面把所有的…

基于触觉感知的目标识别技术在智能机器人抓取中的应用综述

引言在智能机器人抓取任务中,目标识别是一个核心问题。机器人不仅需要识别物体,还需根据物体的形状、纹理、硬度等信息来规划抓取策略。传统的目标识别方法通常依赖于视觉信息,但在许多复杂环境中,单一视觉信息往往不能提供足够的…

huggingface 中模型如何查找和使用?

在 Models - Hugging Face模型中找使用方法 https://hf-mirror.com/ 一:如何找到统一使用方法 对于文字处理AutoTokenizer是一样的,模型名可能不一样。具体操作如下: 1. 先在模型下面找到你需要的模型点开 2. 点开最右边的Use in Transfor…

AgentLego:组装大模型智能体“乐高”

1 AgentLego 1.1 AgentLego 是什么 AgentLego 是一个提供了多种开源工具 API 的多模态工具包,旨在像是乐高积木一样,让用户可以快速简便地拓展自定义工具,从而组装出自己的智能体。通过 AgentLego 算法库,不仅可以直接使用多种工…

w071基于springboot的图书进销存管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件&#xff0…

手撕单例的 5 种写法!

单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。当然,它也是面试中的常客,尤其是某手面试中经常要求应聘者手撕,所以今天咱们就来盘盘它。 单例模式的实现方式有很多&…

制作Windows11个人iso镜像的方法

一、前期准备 1.光盘刻录软件AnyBurn 2.对应Windows11版本的iso基础镜像(一定要对应,不然封装的iso镜像无法使用) Windows11最新版本24H2的iso镜像下载地址下载 Windows 11 此前版本下载地址官方网站不再提供,需要自行搜索下载 笔…

timesnet+timemixer时间序列预测模型

1.timesnet 原论文源码:https://github.com/thuml/Time-Series-Library?tabreadme-ov-file 时间序列分析被广泛应用于众多领域中,如天气预报中预测气象要素的未来变化、数据质控时填补缺失值、工业生产中监控设备状态、医疗诊断时分析心跳曲线等。 不…

Linux 35.6 + JetPack v5.1.4之RTP实时视频Python框架

Linux 35.6 JetPack v5.1.4之RTP实时视频Python框架 1. 源由2. 思路3. 方法论3.1 扩展思考 - 慎谋而后定3.2 扩展思考 - 拒绝拖延或犹豫3.3 扩展思考 - 哲学思考3.4 逻辑实操 - 方法论 4 准备5. 分析5.1 gst-launch-1.05.1.1 xvimagesink5.1.2 nv3dsink5.1.3 nv3dsink sync05…

异或和公式

前缀异或和公式 前缀异或和的概念与前缀和类似,但它使用的是异或(XOR)操作而不是加法。异或操作有一些独特的性质,使得前缀异或和在处理某些问题时非常有用。下面是前缀异或和的推导原理: • 异或操作的性质&#xf…

【Unity】 HTFramework框架(五十三)使用 Addressables 可寻址系统

更新日期:2024年7月25日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 Addressables 可寻址系统使用 Addressables 可寻址系统一、导入 Addressables二、切换到 Addressables 加载模式三、切换资源加载助手四、加载资源五、注…

Spring Cache简单使用

Spring Cache是一个框架,实现了基于注解的缓存功能。只需要简单地加一个注解,就能实现缓存功能 Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如: 1.EHCahce 2.Chffeine 3.Redis 需要导入的maven坐标 …