機器學習時間序列算法進行隨機劃分數據是不合適的!

問題代碼:數據集劃分方式不適合時間序列,會導致評估結果不可靠。

  • 代碼在整體流程上是合理的,但針對時間序列數據,存在一個關鍵問題:使用train_test_split進行隨機劃分是不合適的。
  • 時間序列的特殊性
    • 風速數據屬于時間序列數據,其核心特點是數據具有時間依賴性(即未來的數據與歷史數據存在時間上的先后關聯)。而train_test_split的默認行為是隨機劃分數據(即使設置了random_state,本質還是隨機抽樣),這會導致:

      • 測試集中可能包含 “時間上早于訓練集” 的數據
      • 模型在訓練時可能 “見過” 未來的數據,造成數據泄露
      • 最終的評估結果(如 RMSE、R2)不能真實反映模型對 “未來數據” 的預測能力(這是時間序列預測的核心目標)
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"R2: {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"R2: {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"R2: {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.快速去掉行尾很多空格方法點擊頂部菜單欄“宏”…