当前位置: 首页 > news >正文

【python】多种回归算法对比气温预测

目录

引言

决策树回归(Decision Tree Regression)

线性回归(Linear Regression)

随机森林回归(Random Forest Regression)

气温预测对比实例

数据集

预测值与实际值对比图

模型评价指标

代码实现


引言

决策树回归(Decision Tree Regression)

定义与原理

  • 决策树回归是一种非参数监督学习方法,它使用树形结构来对目标变量进行预测。与线性回归模型不同,决策树回归不需要预先假设数据的分布形式,因此能够很好地处理非线性和高维数据。
  • 决策树回归通过递归地将数据集划分为更小的子集,并在每个子集上构建简单的预测模型。树中的每个节点表示一个特征,节点的分裂则是根据该特征的某个阈值将数据集分成两部分。树的叶子节点包含目标变量的预测值。

构建过程

  1. 选择最优分裂点:选择一个特征及其相应的分裂点,使得数据集在该特征上的分裂能最大程度地减少目标变量的方差(或均方误差)。
  2. 递归分裂:在每个分裂的子集上重复上述过程,直到满足停止条件(如达到最大深度或叶节点样本数量小于某个阈值)。
  3. 生成叶子节点:停止分裂后,叶子节点的值设为该子集上目标变量的均值。

优缺点

  • 优点
    • 简单易理解,可视化效果好。
    • 对数据预处理要求较低(无需归一化或标准化)。
    • 能处理多种数据类型(数值型、分类型)。
    • 适用于处理非线性关系。
  • 缺点
    • 容易过拟合,特别是树的深度较大时。
    • 对小数据集敏感,容易产生较大波动。
    • 在某些情况下,结果不稳定(对噪声数据敏感)。

应用场景

决策树回归在金融、医疗、零售等领域都有广泛的应用,如预测股票价格、货币汇率、疾病风险、药物反应、销量预测等。

线性回归(Linear Regression)

定义

  • 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x + e,其中e为误差项,服从均值为0的正态分布。

类型

  • 如果回归分析中只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。
  • 如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

方法

  • 线性回归模型经常用最小二乘逼近来拟合,即找到一条直线,使得所有观测点到这条直线的垂直距离的平方和最小。

优缺点

  • 优点
    • 模型简单,易于理解和解释。
    • 计算简便,适合大规模数据处理。
    • 适用于线性关系明显的数据。
  • 缺点
    • 无法处理非线性关系。
    • 对异常值较为敏感。
    • 需要预先假设数据的线性关系。

应用场景

线性回归在金融、经济学、流行病学等领域有广泛应用,如预测消费支出、固定投资支出、股票价格趋势等。

随机森林回归(Random Forest Regression)

定义与原理

  • 随机森林回归是一种集成学习方法,通过构建多个决策树并将它们的预测结果进行平均,来提高模型的稳定性和预测准确性。它通过引入随机性来增强模型的泛化能力,有效减轻了单棵决策树容易过拟合的问题。

构建过程

  1. 随机采样:从原始训练数据集中有放回地随机抽样,生成多个子数据集(Bootstrap样本)。
  2. 决策树构建:对每个子数据集构建一棵决策树。在每个节点分裂时,随机选择特征的一个子集,并在其中选择最佳特征进行分裂。
  3. 集成预测:对于新的输入数据,通过所有决策树进行预测,然后对结果进行平均(对于回归问题)或投票(对于分类问题)。

优缺点

  • 优点
    • 高精度:通过集成多个决策树,通常能取得比单棵决策树更高的预测精度。
    • 抗过拟合:由于多个决策树的结果是平均的,可以有效减轻过拟合现象。
    • 鲁棒性:对数据中的噪声和缺失值具有较强的鲁棒性。
    • 处理高维数据:能够处理大量特征,并能评估特征的重要性。
  • 缺点
    • 计算开销大:构建多个决策树的计算开销较大。
    • 模型解释性差:由于结果是多个决策树的平均,难以解释具体的决策路径。

应用场景

随机森林回归在金融、医疗、生物信息学等领域有广泛应用,如预测股票价格、疾病风险、基因表达等。

气温预测对比实例

数据集

预测值与实际值对比图

模型评价指标

  • MSE(均方误差):衡量模型预测值与真实值之间差异的平方的平均值。MSE越小,表示模型预测越准确。
  • MAE(平均绝对误差):衡量模型预测值与真实值之间差异的平均值的绝对值。MAE同样越小越好。
  • R²分数(R² score):表示模型对数据的拟合程度。R²分数的值范围从负无穷大到1,其中1表示完美预测,0表示模型的表现与简单预测(如平均值)相同,而负值则表示模型表现比简单预测还差。

代码实现

import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np# 加载数据集  
data = pd.read_csv("气温.csv")# 数据预处理  
data['date'] = pd.to_datetime(data[['year', 'month', 'day']])# 根据日期划分数据集  
train_mask = (data['date'] >= '2020-01-01') & (data['date'] <= '2022-11-30')
val_mask = (data['date'] >= '2022-12-01') & (data['date'] <= '2022-12-31')
test_mask = (data['date'] >= '2023-01-01') & (data['date'] <= '2023-12-31')train_data = data[train_mask]  # 训练集
val_data = data[val_mask]  # 验证集
test_data = data[test_mask]  # 测试集# 特征工程:将年份、月份、日期作为特征,实际气温为目标变量 
X_train = train_data[['year', 'month', 'day']]
y_train = train_data['average']
X_val = val_data[['year', 'month', 'day']]
y_val = val_data['average']
X_test = test_data[['year', 'month', 'day']]
y_test = test_data['average']#决策树回归
dtr = DecisionTreeRegressor(random_state=42)
dtr.fit(X_train, y_train)
y_pred_dtr = dtr.predict(X_test)# 线性回归  
lr = LinearRegression()
lr.fit(X_train, y_train)
y_pred_lr = lr.predict(X_test)# 随机森林回归  
rfr = RandomForestRegressor(n_estimators=100, random_state=42)
rfr.fit(X_train, y_train)
y_pred_rfr = rfr.predict(X_test)# 为可视化创建一个画布和三个子图  
fig, axs = plt.subplots(3, 1, figsize=(10, 15))# 决策树回归的预测结果与实际值对比  
axs[0].scatter(y_test, y_pred_dtr, color='blue', alpha=0.5)
axs[0].set_title('Decision Tree Regression Predictions vs Actual')
axs[0].set_xlabel('Actual Values')
axs[0].set_ylabel('Predicted Values')
axs[0].plot([np.min((y_test.min(), y_pred_dtr.min())), np.max((y_test.max(), y_pred_dtr.max()))],[np.min((y_test.min(), y_pred_dtr.min())), np.max((y_test.max(), y_pred_dtr.max()))], 'r--')# 线性回归的预测结果与实际值对比  
axs[1].scatter(y_test, y_pred_lr, color='green', alpha=0.5)
axs[1].set_title('Linear Regression Predictions vs Actual')
axs[1].set_xlabel('Actual Values')
axs[1].set_ylabel('Predicted Values')
axs[1].plot([np.min((y_test.min(), y_pred_lr.min())), np.max((y_test.max(), y_pred_lr.max()))],[np.min((y_test.min(), y_pred_lr.min())), np.max((y_test.max(), y_pred_lr.max()))], 'r--')# 随机森林回归的预测结果与实际值对比  
axs[2].scatter(y_test, y_pred_rfr, color='red', alpha=0.5)
axs[2].set_title('Random Forest Regression Predictions vs Actual')
axs[2].set_xlabel('Actual Values')
axs[2].set_ylabel('Predicted Values')
axs[2].plot([np.min((y_test.min(), y_pred_rfr.min())), np.max((y_test.max(), y_pred_rfr.max()))],[np.min((y_test.min(), y_pred_rfr.min())), np.max((y_test.max(), y_pred_rfr.max()))], 'r--')# 显示整个画布上的图形  
plt.tight_layout()
plt.show()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 云计算监控减少网络安全事件的五种方法
  • LinuxShell编程1———shell基础命令
  • 打印室预约小程序的设计
  • 【C++】类和对象·this指针
  • 科技出海|百分点科技智慧政务解决方案亮相非洲展会
  • HLS加密技术:保障流媒体内容安全的利器
  • WebAssembly与JavaScript的交互(1)
  • Mongodb文本索引
  • react页面指定dom转pdf导出
  • 网络通信介绍
  • css3 中的伪类和伪元素
  • 数学建模-Topsis(优劣解距离法)
  • Node.js实现文件下载
  • 记录些MySQL题集(15)
  • idea Apipost 插件导出接口文档字段类型全部是string
  • [笔记] php常见简单功能及函数
  • 【React系列】如何构建React应用程序
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CSS魔法堂:Absolute Positioning就这个样
  • Docker入门(二) - Dockerfile
  • emacs初体验
  • gops —— Go 程序诊断分析工具
  • IDEA常用插件整理
  • JavaScript对象详解
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • 翻译:Hystrix - How To Use
  • 关于使用markdown的方法(引自CSDN教程)
  • ------- 计算机网络基础
  • 马上搞懂 GeoJSON
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 小程序开发之路(一)
  • 责任链模式的两种实现
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #100天计划# 2013年9月29日
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (1) caustics\
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (7)摄像机和云台
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Oracle存储过程编写经验和优化措施
  • **CI中自动类加载的用法总结
  • .aanva
  • .gitignore不生效的解决方案
  • .NET DataGridView数据绑定说明
  • .NET Framework 3.5安装教程
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET/C# 使用反射注册事件
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)