梯度提升树(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.rhkb.cn/news/484531.html

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

相关文章

Rust : 生成日历管理markdown文件的小工具

需求: 拟生成以下markdown管理小工具,这也是我日常工作日程表。 可以输入任意时间段,运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…

Linux网络:代理 穿透 打洞

Linux网络:代理 & 穿透 代理正向代理反向代理 内网穿透frp 内网打洞 代理 正向代理 正向代理是一种常见的网络代理方式,它位于客户端与目标服务器之间,代表客户端向服务器发送请求,接收响应。 如图,客户端发送的…

给el-table表头添加icon图标,以及鼠标移入icon时显示el-tooltip提示内容

在你的代码中,你已经正确地使用了 el-tooltip 组件来实现鼠标划过加号时显示提示信息。el-tooltip 组件的 content 属性设置了提示信息的内容,placement 属性设置了提示信息的位置。 你需要确保 el-tooltip 组件的 content 属性和 placement 属性设置正…

游戏引擎学习第30天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始&#xff0c…

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word(1)打开文档(2)添加标题(3)添加段落(4)添加文字块(5)添加图片(6&#xf…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据,笔者在今年10月写了文章,怎么使用配置化实现kafka的装载:springboot kafka多数据源,通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中,kafka broker是加密的&#xff0c…

Jupyter Lab打印日志

有时候在 jupyter 中执行运行时间较长的程序,且需要一直信息,但是程序执行到某些时候就不再打印了。 可以开启 日志控制台,将日志信息记录在控制台中。 参考:https://www.autodl.com/docs/jupyterlab/

EtherCAT转ProfiNet网关实现西门子1200PLC与伺服电机连接的通讯案例

一. 案例背景 西门子1200PLC通过捷米特JM-ECTM-PN(EtherCAT转ProfiNet)网关将松下伺服电机(包括不限于型号MHMFO22D1U2M)或EtherCAT协议的其它设备或连接到ProfiNetPLC上,并在正常运行中支持EtherCAT协议。本产品可作为EtherCAT主站,做为西门子S7-1200系…

Redis 基础、Redis 应用

Redis 基础 什么是 Redis? Redis (REmote DIctionary Server)是一个基于 C 语言开发的开源 NoSQL 数据库(BSD 许可)。与传统数据库不同的是,Redis 的数据是保存在内存中的(内存数据库&#xf…

Vue 组件通信全面解析

Vue 组件通信全面解析:方式、原理、优缺点及最佳实践 在 Vue 开发中,组件通信是一个重要的核心问题。随着应用复杂度的增加,如何在组件之间有效传递数据、触发事件,直接影响代码的可维护性和可扩展性。Vue 提供了多种组件通信方式…

Python-链表数据结构学习(1)

一、什么是链表数据? 链表是一种通过指针串联在一起的数据结构,每个节点由2部分组成,一个是数据域,一个是指针域(存放下一个节点的指针)。最后一个节点的指针域指向null(空指针的意思&#xff0…

电脑插入耳机和音响,只显示一个播放设备

1. 控制面板-硬件和声音-Realtek高清音频-扬声器-设备高级设置-播放设备里选择使用前部和后部输出设备同时播放两种不同的音频流 在声音设置中就可以看到耳机播放选项

ISAAC SIM踩坑记录--添加第三方3D场景

ISAAC SIM仿真首先就是要有合适的3D场景,官方提供了一些场景,如果不能满足要求,那就只能自己建。 对于我这种不会3D建模的菜鸟,只能到网上下载了,sketchfab就是一个不错的平台,有不少免费资源可以下载。 …

CentOS 9 配置静态IP

文章目录 1_问题原因2_nmcli 配置静态IP3_使用配置文件固定IP4_重启后存在的问题5_nmcli 补充 1_问题原因 CentOS 7 于 2014年6月发布,基于 RHEL 7,并在 2024年6月30日 结束维护。 CentOS 9 作为目前的最新版本,今天闲来闲来无事下载下来后…

C++趣味编程玩转物联网:基于树莓派Pico控制无源蜂鸣器-实现音符与旋律的结合

无源蜂鸣器是一种多功能的声音输出设备,与有源蜂鸣器相比,它能够通过不同频率的方波生成丰富多样的音调。本项目使用树莓派Pico开发板,通过编程控制无源蜂鸣器播放经典旋律《归来有风》。本文将详细介绍项目实现中的硬件连接、C++代码解析,以及无源蜂鸣器的工作原理。 一、…

【AI模型对比】Kimi与ChatGPT的差距:真实对比它们在六大题型中的全面表现!

文章目录 Moss前沿AI语义理解文学知识数学计算天文学知识物理学知识英语阅读理解详细对比列表总结与建议 Moss前沿AI 【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!! 【VScode】VSCode中的智能AI-G…

Runway 技术浅析(六):文本到视频(Text-to-Video)

1. 核心组件与工作原理 1.1 自然语言处理(NLP) 1.1.1 文本解析与语义理解 文本到视频的第一步是将用户输入的自然语言文本解析为机器可理解的语义信息。Runway 使用预训练的 NLP 模型,如 GPT-3 和 BERT,这些模型通过大规模文本数…

【C++】双温度转换与并联电阻计算的编程题分析与优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯从华氏温度到摄氏温度的转换题目背景与华氏温度与摄氏温度的转换初始代码与验证通过的解法代码分析特点与优缺点 老师的代码:结合 C 与 C 的风格代码分析与对比…

【采样率、采样定理、同步和异步采样】

内容来源:【数据采集卡的【采样率】【采样定理】【同步采样】【异步采样】的相关说明】 此篇文章仅作笔记分享。 前言 模拟信号需要通过采样、储存、量化、编码这几个步骤转换成数字信号,本篇文章将会对采样进行一个更详细的说明。 采样 采样就是将一…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能,无论是数据传输、充电还是外接设备,都离不开它。然而,当USB接口突然没有反应时,这无疑会给我们的工作和学习带来不小的困扰。下面,我们就来探讨一下笔记本USB接…