问题代码:数据集划分方式不适合时间序列,会导致评估结果不可靠。

  • 代码在整体流程上是合理的,但针对时间序列数据,存在一个关键问题:使用train_test_split进行随机划分是不合适的。
  • 时间序列的特殊性
    • 风速数据属于时间序列数据,其核心特点是数据具有时间依赖性(即未来的数据与历史数据存在时间上的先后关联)。而train_test_split的默认行为是随机划分数据(即使设置了random_state,本质还是随机抽样),这会导致:

      • 测试集中可能包含 “时间上早于训练集” 的数据
      • 模型在训练时可能 “见过” 未来的数据,造成数据泄露
      • 最终的评估结果(如 RMSE、R²)不能真实反映模型对 “未来数据” 的预测能力(这是时间序列预测的核心目标)
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler# 1. 加载数据
data1 = pd.read_csv(r'data.csv')# 2. 确保 date_time 列是 datetime 类型
data1['date_time'] = pd.to_datetime(data1['date_time'], format='%Y/%m/%d %H:%M')# 3. 定义时间范围并筛选数据
start_time = '2023-07-01 00:00:00'
end_time = '2024-06-30 18:00:00'
data1 = data1[(data1['date_time'] >= start_time) & (data1['date_time'] <= end_time)]# 4. 提取特征和目标列
X = data1[['ecmwf_wind']]  # 特征列
y = data1['wind_obs']  # 目标列# 5. 数据集划分(训练集和测试集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)# 6. 数据归一化(最大最小归一化)
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 7. 训练简单线性回归模型
model = LinearRegression()
model.fit(X_train_scaled, y_train)# 8. 预测
y_pred = model.predict(X_test_scaled)# 9. 计算评价指标
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
mae = mean_absolute_error(y_test, y_pred)
mbe = np.mean(y_test - y_pred)  # 平均偏差误差
r2 = r2_score(y_test, y_pred)# 10. 输出评价指标
print(f"RMSE: {rmse:.4f}")
print(f"MAE: {mae:.4f}")
print(f"MBE: {mbe:.4f}")
print(f"R²: {r2:.4f}")# 11. 数据可视化
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5, label='Predicted vs Observed')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--', label='Ideal Line')
plt.xlabel('Observed Wind Speed')
plt.ylabel('Predicted Wind Speed')
plt.title('Observed vs Predicted Wind Speed')
plt.legend()
plt.grid(True)
plt.show()

改进建议(针对时间序列划分)

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler# 1. 加载数据
data1 = pd.read_csv(r'data.csv')# 2. 确保 date_time 列是 datetime 类型
data1['date_time'] = pd.to_datetime(data1['date_time'], format='%Y/%m/%d %H:%M')# 3. 定义时间范围并筛选数据
start_time = '2023-07-01 00:00:00'
end_time = '2024-06-30 18:00:00'
data1 = data1[(data1['date_time'] >= start_time) & (data1['date_time'] <= end_time)]# 4. 按时间排序(时间序列分析的重要步骤)
data1 = data1.sort_values('date_time').reset_index(drop=True)# 5. 提取特征和目标列
X = data1[['ecmwf_wind']]  # 特征列
y = data1['wind_obs']      # 目标列# 6. 时间序列数据集划分(按时间顺序,前75%训练,后25%测试)
split_ratio = 0.75
split_idx = int(len(data1) * split_ratio)X_train, X_test = X.iloc[:split_idx], X.iloc[split_idx:]
y_train, y_test = y.iloc[:split_idx], y.iloc[split_idx:]# 7. 数据归一化(最大最小归一化)
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 8. 训练简单线性回归模型
model = LinearRegression()
model.fit(X_train_scaled, y_train)# 9. 预测
y_pred = model.predict(X_test_scaled)# 10. 计算评价指标
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
mae = mean_absolute_error(y_test, y_pred)
mbe = np.mean(y_test - y_pred)  # 平均偏差误差
r2 = r2_score(y_test, y_pred)# 11. 输出评价指标
print(f"RMSE: {rmse:.4f}")
print(f"MAE: {mae:.4f}")
print(f"MBE: {mbe:.4f}")
print(f"R²: {r2:.4f}")# 12. 预测值与观测值对比可视化(带时间维度)
plt.figure(figsize=(12, 6))
plt.plot(data1['date_time'].iloc[split_idx:], y_test, label='观测风速', alpha=0.7)
plt.plot(data1['date_time'].iloc[split_idx:], y_pred, label='预测风速', linestyle='--')
plt.xlabel('时间')
plt.ylabel('风速')
plt.title('测试集风速预测对比')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()# 13. 散点图可视化(预测值 vs 观测值)
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5, label='预测值 vs 观测值')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--', label='理想线')
plt.xlabel('观测风速')
plt.ylabel('预测风速')
plt.title('观测值与预测值对比')
plt.legend()
plt.grid(True)
plt.show()

绘图展示中文显示不了,设置matplotlib设置中文字体。

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScalerimport matplotlib as mpl# 设置中文字体 - 根据您的系统选择
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体,Windows
# plt.rcParams['font.sans-serif'] = ['Heiti TC']  # 黑体-繁,Mac
# plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']  # 文泉驿正黑,Linux# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False# 或者使用全局设置
mpl.rc('font', family='SimHei')  # Windows
# mpl.rc('font', family='Arial Unicode MS')  # Mac# 1. 加载数据
data1 = pd.read_csv(r'data.csv')# 2. 确保 date_time 列是 datetime 类型
data1['date_time'] = pd.to_datetime(data1['date_time'], format='%Y/%m/%d %H:%M')# 3. 定义时间范围并筛选数据
start_time = '2023-07-01 00:00:00'
end_time = '2024-06-30 18:00:00'
data1 = data1[(data1['date_time'] >= start_time) & (data1['date_time'] <= end_time)]# 4. 按时间排序(时间序列分析的重要步骤)
data1 = data1.sort_values('date_time').reset_index(drop=True)# 5. 提取特征和目标列
X = data1[['ecmwf_wind']]  # 特征列
y = data1['wind_obs']      # 目标列# 6. 时间序列数据集划分(按时间顺序,前75%训练,后25%测试)
split_ratio = 0.75
split_idx = int(len(data1) * split_ratio)X_train, X_test = X.iloc[:split_idx], X.iloc[split_idx:]
y_train, y_test = y.iloc[:split_idx], y.iloc[split_idx:]# 7. 数据归一化(最大最小归一化)
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 8. 训练简单线性回归模型
model = LinearRegression()
model.fit(X_train_scaled, y_train)# 9. 预测
y_pred = model.predict(X_test_scaled)# 10. 计算评价指标
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
mae = mean_absolute_error(y_test, y_pred)
mbe = np.mean(y_test - y_pred)  # 平均偏差误差
r2 = r2_score(y_test, y_pred)# 11. 输出评价指标
print(f"RMSE: {rmse:.4f}")
print(f"MAE: {mae:.4f}")
print(f"MBE: {mbe:.4f}")
print(f"R²: {r2:.4f}")# 12. 预测值与观测值对比可视化(带时间维度)
plt.figure(figsize=(12, 6))
plt.plot(data1['date_time'].iloc[split_idx:], y_test, label='观测风速', alpha=0.7)
plt.plot(data1['date_time'].iloc[split_idx:], y_pred, label='预测风速', linestyle='--')
plt.xlabel('时间')
plt.ylabel('风速')
plt.title('测试集风速预测对比')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()# 13. 散点图可视化(预测值 vs 观测值)
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5, label='预测值 vs 观测值')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--', label='理想线')
plt.xlabel('观测风速')
plt.ylabel('预测风速')
plt.title('观测值与预测值对比')
plt.legend()
plt.grid(True)
plt.show()

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

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

相关文章

逆向思维下,如何把基金投资做亏?

投资界常说“聪明的人学习别人赚钱的方式”&#xff0c;但如果我们刻意采用逆向思维&#xff0c;想要把基金投资做亏&#xff0c;其实也有科学依据。 今天&#xff0c;我们就从心理学和行为金融的角度&#xff0c;揭示那些真实的投资亏损方法。 ⚡️ 1. 总想追热点&#xff0c…

1-python 自定义模板导出文档-基础实现

使用 Python 根据自定义的 Word 模板和传入的 JSON 数据生成 Word 报告&#xff0c;是自动化文档生成的常见需求。最常用的方法是使用 python-docx 和 docxtpl 库。其中&#xff0c;docxtpl 是基于 python-docx 的模板引擎&#xff0c;支持 Jinja2 模板语法&#xff0c;非常适合…

LeetCode算法日记 - Day 24: 颜色分类、排序数组

目录 1. 颜色分类 1.1 题目分析 1.2 解法 1.3 代码实现 2. 排序数组 2.1 题目解析 2.2 解法 2.3 代码实现 1. 颜色分类 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序…

学习一下动调

[NSSCTF 2nd]MyBasedie查一下用ida64打开main函数里面没有什么信息&#xff0c;接着追一下函数&#xff0c;内容在test函数里面函数会对我们输入的内容进行base64加密&#xff0c;这段逻辑也很简单&#xff0c;就是将加密后的字符串和目标字符串依次进行比较&#xff0c;一样就…

Java试题-选择题(22)

Java试题-选择题&#xff08;22&#xff09; 题目以下对JDBC事务描述错误的是 &#xff1f; A) JDBC事务属于JAVA事务的一种 B) JDBC事务属于容器事务类型 C) JDBC事务可以保证操作的完整性和一致性 D) JDBC事务是由Connection发起的&#xff0c;并由Connection控制要通过可滚动…

蓝牙5.3核心技术架构解析:从控制器到主机的无线通信设计

蓝牙5.3核心技术架构解析&#xff1a;从控制器到主机的无线通信设计在无线通信领域&#xff0c;蓝牙技术如何通过精巧的架构设计实现设备间的高效互操作&#xff1f;答案在于其分层架构与标准化的接口定义。蓝牙5.3核心规范作为现代无线通信的重要标准&#xff0c;其系统架构设…

android View#performClick() 和 View#callOnClick() 的差异

文章目录performClick()callOnClick()关键区别对比总结在 Android 中&#xff0c;View.performClick() 和 View.callOnClick() 都是用于触发视图点击事件的方法&#xff0c;但它们的设计目的和执行逻辑存在细微差异&#xff0c;具体区别如下&#xff1a;performClick() 核心作…

PHP单独使用phinx使用数据库迁移

可以独立使用的迁移包对比后&#xff0c;感觉phinx更接近PHP的使用习惯。 为什么要单独用&#xff1f; 因为我不想数据库的迁移文件依赖于某种框架。本来是可以在框架里直接安装这个包的&#xff0c;但是发现这个包依赖cakephp&#xff0c;而cakephp的函数与thinkphp的env()函…

从零开始学习单片机18

使用STM32CubeMX创建工程选择对应芯片后创建工程&#xff0c;首先设置时钟源内部时钟源包括LSI&#xff08;低速时钟&#xff09;和HSI&#xff08;高速时钟&#xff09;&#xff0c;使用内部时钟源就需要将图中的一二处勾选HCLK是芯片运行时的评率&#xff0c;虽然下面标的最大…

如何使用 DeepSeek 帮助自己的工作?

技术文章大纲&#xff1a;利用 DeepSeek 提升工作效率 了解 DeepSeek 的基本功能 DeepSeek 的核心能力&#xff1a;文本生成、代码辅助、数据分析支持的平台与访问方式&#xff08;网页端/API/集成工具&#xff09;适用场景&#xff1a;技术文档撰写、自动化流程设计、数据处理…

计算机毕设javayit商城 基于SSM框架的校园二手交易全流程管理系统设计与实现 Java+MySQL的校园二手商品交易与供需对接平台开发

计算机毕设 javayit 商城uwd1i9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享随着校园二手物品流通需求增长&#xff0c;传统校园二手交易依赖线下摆摊、社群发布的模式&#xff0c;存在信息分…

Java函数式编程之【流(Stream)性能优化】

Java函数式编程之【流&#xff08;Stream&#xff09;性能优化一、流&#xff08;Stream&#xff09;性能优化的预备知识&#xff08;一&#xff09;并行与并发的区别&#xff08;二&#xff09;Stream操作特性分类&#xff08;三&#xff09;Stream流管道的相关知识二、流&…

Cybero: 1靶场渗透

Cybero: 1 来自 <Cybero: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168.23.139 3&#xff0c;对靶机进行端口服务探…

【学习笔记】非异步安全函数(禁止在信号处理中调用)

非异步安全函数&#xff08;禁止在信号处理中调用&#xff09; 一、测试 在信号处理函数&#xff08;Signal Handler&#xff09;中&#xff0c;只有异步信号安全函数&#xff08;async-signal-safe functions&#xff09; 可以安全调用。这类函数的特点是&#xff1a;不使用全…

【K8s】整体认识K8s之K8s的控制器

作用&#xff1a;控制器的作用就是持续监控k8s集群的状态&#xff0c;让它处于我们期望的状态&#xff0c;常见的控制器有replicaset、deployment、daemonset、statefulset 、job 、cronjobReplicaset控制一组pod的副本数&#xff0c;始终与预设的值相同&#xff0c;会持续监视…

R ggplot2学习Nature子刊一张图,换数据即可用!

本次使用R语言复现Nature Communications上的1张组合图,这张图兼具颜值+节约版面! Fig. 1 b原图 ❤️复现效果图-b图❤️ ✅读入测试数据! ✅关键代码, # 关键代码 library(ggplot2) library(dplyr) library(cowplot)# --- 外圈图 --- p_outer <- ggplot(data_aug, aes…

迷你电脑用到什么型号的RJ45网口

迷你电脑常用的 RJ45 网口主要有标准 RJ45 网口和 Mini RJ45 网口两种。标准 RJ45 网口是最常见的类型&#xff0c;遵循 IEEE 802.3i 标准&#xff0c;采用 8P8C&#xff08;8 Position 8 Contact&#xff0c;8 位 8 触点&#xff09;连接器&#xff0c;有 T568A 和 T568B 两种…

网络安全 | 保护智能家居和企业IoT设备的安全策略

网络安全 | 保护智能家居和企业IoT设备的安全策略 一、前言 二、智能家居和企业 IoT 设备面临的安全威胁 2.1 设备自身安全缺陷 2.2 网络通信安全隐患 2.3 数据隐私风险 2.4 恶意软件和攻击手段 三、保护智能家居和企业 IoT 设备的安全策略 3.1 设备安全设计与制造环节的考量 3…

优化器全指南:从原理到调优实战

本文将带你轻松理解深度学习中的“导航系统”——优化器。我们会避开复杂的数学公式,用大量的比喻和图示,让你彻底明白 Adam、AdamW、LAMB 是怎么回事,并学会如何调节它们的关键参数。 第一部分:核心概念:优化器是什么? 一个简单的比喻: 想象你在一座大雾弥漫的山里(…

Notepad++使用技巧1

1.打开官方参考代码经常看到下图这种行尾很多空格的代码&#xff0c;一点都不合符华为的书写规范&#xff0c;阅读起来容易让人烦躁不安。初学者建议看看华为的代码书写规范&#xff0c;你将少走很多弯路&#xff0c;终生受益。2.快速去掉行尾很多空格方法点击顶部菜单栏“宏”…