數據挖掘實訓:天氣數據分析與機器學習模型構建

隨著氣候變化對各行各業的影響日益加劇,精準的天氣預測已經變得尤為重要。降雨預測在日常生活中尤其關鍵,例如農業、交通和災害預警等領域。本文將通過機器學習方法,利用歷史天氣數據預測明天是否會下雨,具體內容包括數據預處理、模型訓練、調參、評估與優化等多個環節。

1. 項目背景與目標

本項目的核心任務是通過分析天氣數據來預測明天是否降雨。數據集包含了多個天氣特征(如溫度、濕度、風速、氣壓等),我們使用這些特征作為輸入,構建機器學習模型預測目標變量(是否下雨)。具體目標如下:

  • 使用歷史天氣數據來預測明天是否降雨。
  • 使用多種機器學習算法進行模型訓練和評估。
  • 處理數據中的缺失值、類別不平衡等問題,提高模型的預測準確性。

2. 數據集介紹

我們使用一個典型的天氣數據集,它包含了如下幾個主要特征:

  1. Location:表示獲取該信息的氣象站的名稱。
  2. MinTemp:以攝氏度為單位的最低溫度。
  3. MaxTemp:以攝氏度為單位的最高溫度。
  4. Rainfall:當天記錄的降雨量,單位為毫米(mm)。
  5. Evaporation:到早上9點之前的24小時內的A級蒸發量,單位為毫米(mm)。
  6. Sunshine:白天日照的完整小時數,表示當天白晝時段陽光的強度。
  7. WindGustDir:表示在午夜12點前24小時內,最強風的風向。
  8. WindGustSpeed:表示在午夜12點前24小時內,最強風的風速,單位為千米每小時(km/h)。
  9. WindDir9am:上午9點時的風向。
  10. WindDir3pm:下午3點時的風向。
  11. WindSpeed9am:上午9點之前每個十分鐘的風速平均值,單位為千米每小時(km/h)。
  12. WindSpeed3pm:下午3點之前每個十分鐘的風速平均值,單位為千米每小時(km/h)。
  13. Humidity9am:上午9點的濕度,單位為百分比。
  14. Humidity3pm:下午3點的濕度,單位為百分比。
  15. Pressure9am:上午9點的平均海平面氣壓,單位為百帕(hpa)。
  16. Pressure3pm:下午3點的平均海平面氣壓,單位為百帕(hpa)。
  17. Cloud9am:上午9點時的天空云層遮蔽程度,以“oktas”單位衡量。0表示完全晴朗,8表示完全陰天。
  18. Cloud3pm:下午3點時的天空云層遮蔽程度,單位同上午9點。
  19. Temp9am:上午9點的溫度,單位為攝氏度。
  20. Temp3pm:下午3點的溫度,單位為攝氏度。
  21. RainTomorrow:目標變量,表示明天是否會下雨。1表示下雨,0表示不下雨。

目標是基于這些特征來預測RainTomorrow,即明天是否會下雨。

3. 數據預處理

機器學習模型的效果很大程度上取決于數據的質量,因此數據預處理是一個至關重要的步驟。

3.1 讀取數據

我們從CSV文件中加載數據并進行抽樣:

import pandas as pd# 讀取數據
data = pd.read_csv("weather.csv", encoding='gbk', index_col=0)
weather = data.sample(n=5000, random_state=0)
weather.index = range(weather.shape[0])
3.2 特征與目標變量分離

我們將數據集分為特征(X)和目標變量(Y):

X = weather.iloc[:, :-1]  # 所有列,除了最后一列
Y = weather.iloc[:, -1]   # 目標變量,即是否下雨
3.3 處理缺失值

數據中可能存在缺失值,特別是對于天氣數據,缺失值可能較為常見。我們可以使用適當的策略填充這些缺失值。對于分類特征,我們使用眾數(最頻繁的值)填充;對于數值型特征,我們使用均值填充:

from sklearn.impute import SimpleImputer# 對分類變量使用眾數填充
categorical_columns = X.select_dtypes(include=['object']).columns
si = SimpleImputer(strategy="most_frequent")
X[categorical_columns] = si.fit_transform(X[categorical_columns])# 對連續變量使用均值填充
continuous_columns = X.select_dtypes(include=['float64', 'int64']).columns
impmean = SimpleImputer(strategy="mean")
X[continuous_columns] = impmean.fit_transform(X[continuous_columns])
3.4 特征工程

特征工程旨在通過從現有數據中提取更有用的特征來提升模型性能。例如,我們可以通過分析降水量來生成一個新特征,表示當天是否有降水:

X['RainToday'] = X['Rainfall'].apply(lambda x: "Yes" if x >= 1 else "No")

此外,我們還可以從日期中提取月份信息,因為不同季節的天氣差異較大:

X['Month'] = pd.to_datetime(X['Date']).dt.month
3.5 類別特征編碼

機器學習模型通常無法直接處理非數值型數據,因此我們需要對類別特征進行編碼。我們可以使用OrdinalEncoder將類別變量轉換為數字值:

from sklearn.preprocessing import OrdinalEncoderencoder = OrdinalEncoder()
categorical_columns = ['Location', 'WindGustDir']  
X[categorical_columns] = encoder.fit_transform(X[categorical_columns])
3.6 特征標準化

標準化步驟有助于加速梯度下降優化算法的收斂,并提高模型性能。我們可以使用StandardScaler對數值特征進行標準化,使得數據具有零均值和單位方差:

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X[continuous_columns] = scaler.fit_transform(X[continuous_columns])
3.7 處理類別不平衡

由于“下雨”的頻率較低,目標變量RainTomorrow的類別可能不平衡。我們使用SMOTE(合成少數類過采樣技術)來生成新的少數類樣本,以平衡數據集:

from imblearn.over_sampling import SMOTEsmote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, Y)

4. 模型訓練與評估

在數據預處理完成后,我們開始使用不同的分類模型進行訓練,并評估它們的表現。常見的分類模型包括:

  • 邏輯回歸(Logistic Regression)
  • 支持向量機(SVM)
  • 隨機森林(Random Forest)
  • XGBoost(XGBoost)
  • AdaBoost(AdaBoost)
  • Gradient Boosting(Gradient Boosting)
4.1 數據集劃分

首先,我們將數據劃分為訓練集和驗證集。一般來說,80%的數據用于訓練,20%的數據用于驗證:

from sklearn.model_selection import train_test_splitX_train, X_val, y_train, y_val = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42)
4.2 訓練模型

接下來,我們訓練多種分類模型,并評估它們的性能:

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier
from sklearn.svm import SVC
import xgboost as xgb
from sklearn.metrics import classification_report# 定義模型
models = {"Logistic Regression": LogisticRegression(),"Random Forest": RandomForestClassifier(),"SVM": SVC(),"XGBoost": xgb.XGBClassifier(),"AdaBoost": AdaBoostClassifier(),"Gradient Boosting": GradientBoostingClassifier()
}# 訓練并評估每個模型
for name, model in models.items():model.fit(X_train, y_train)y_pred = model.predict(X_val)print(f"{name} Performance:")print(classification_report(y_val, y_pred))
4.3 投票分類器(集成方法)

為了提升預測效果,我們使用投票分類器(Voting Classifier)。投票分類器通過結合多個分類器的預測結果,達到提升預測準確率的效果。我們選擇幾個表現較好的分類器進行組合:

from sklearn.ensemble import VotingClassifiervoting_classifier = VotingClassifier(estimators=[('rf', RandomForestClassifier()),('ada', AdaBoostClassifier()),('gb', GradientBoostingClassifier()),('xgb', xgb.XGBClassifier())],voting='hard'
)voting_classifier.fit(X_train, y_train)
y_pred = voting_classifier.predict(X_val)
print("Voting Classifier Performance:")
print(classification_report(y_val, y_pred))

5. 結果分析與模型評估

通過模型訓練與評估,我們可以比較各個模型的表現。通常,隨機森林XGBoost模型會表現較好,因為它們能夠處理復雜的非線性關系并具有較強的抗過擬合能力。

模型評估結果通常包含如下指標:

  • Accuracy(準確率):模型正確預測的樣本數占總樣本數的比例。
  • Precision(精確度):預測為“降雨”時,實際降雨的比例。
  • Recall(召回率):實際降雨時,模型正確預測為“降雨”的比例。
  • F1-Score:精確度與召回率的調和平均值,是分類模型中較為綜合的評估指標。

6. 結論與未來方向

本文展示了如何利用機器學習方法預測明天是否會下雨。通過合理的數據預處理、特征工程以及使用多種機器學習模型進行訓練與評估,我們成功地建立了一個天氣預測模型。

未來的工作包括:

  • 深度學習方法:可以考慮使用LSTM(長短時記憶網絡)等深度學習方法

來建模天氣的時間序列特性。

  • 集成學習優化:進一步優化集成學習方法,如Stacking、Boosting等。
  • 更多的特征:增加更多天氣相關的特征,如氣象衛星數據等,來提高模型的準確性。

通過不斷優化模型與特征,天氣預測的準確性可以得到顯著提高,為農業、物流等領域提供更加精確的預報。

參考資料

  • XGBoost Documentation
  • Random Forest Documentation
  • SMOTE - imbalanced-learn

這篇博客詳細介紹了使用機器學習方法進行天氣預測的步驟,包括數據預處理、特征工程、模型訓練與評估等多個環節。希望能幫助大家在實際項目中更好地應用這些技術。如果有任何問題或建議,歡迎在評論區留言。

篇幅有限,需要完整的代碼的私信我

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66033.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kalilinux - 目錄掃描之dirsearch

情景導入 先簡單介紹一下dirsearch有啥用。 假如你現在訪問一個網站,例如https://www.example.com/ 它是一個電商平臺或者其他功能性質的平臺。 站在開發者的角度上思考,我們只指導https://www.example.com/ 但不知道它下面有什么文件,文…

關于 ThinkPHP 與 PostgreSQL 結合使用的一些要點

ThinkPHP 是一款流行的 PHP 開發框架,而 PostgreSQL 是功能強大的開源關系型數據庫。它們可以結合使用來開發各類應用,以下是關于 ThinkPHP 與 PostgreSQL 結合使用的一些要點: 配置數據庫連接 編輯配置文件:在 ThinkPHP 項目中&…

進程同步之信號量機制

信號量機制 信號量機制是一種用于進程同步和互斥的基本工具,特別是在并發編程中,廣泛用于控制對共享資源的訪問,避免數據競爭和死鎖等問題。信號量機制由荷蘭計算機科學家Edsger Dijkstra在1965年提出,并在操作系統的進程同步中發…

SOME/IP協議詳解 基礎解讀 涵蓋SOME/IP協議解析 SOME/IP通訊機制 協議特點 錯誤處理機制

車載以太網協議棧總共可劃分為五層,分別為物理層,數據鏈路層,網絡層,傳輸層,應用層,其中今天所要介紹的內容SOME/IP就是一種應用層協議。 SOME/IP協議內容按照AUTOSAR中的描述,我們可以更進一步…

springboot vue uniapp 仿小紅書 1:1 還原 (含源碼演示)

線上預覽: 移動端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小紅書憑借優秀的產品體驗 和超高人氣 目前成為筆記類產品佼佼者 此項目將詳細介紹如何使用Vue.js和Spring Boot 集合uniapp 開發一個仿小紅書應用,憑借uniapp 可以在h5 小程序 app…

基于celery的任務管理,本文主要是處理自己的算法,暴露API,管理任務并發,多線程

基于celery的任務管理,本文主要是處理自己的算法,暴露API,管理任務并發,多線程 基本需求描述潛在問題主函數配置文件 基本需求描述 暴露API,供其他人調用算法。方便查看任務狀態。因為服務器資源有限,控制…

Java(7)常用的工具類

1.Collections集合工具類 內置了大量對集合操作的靜態方法,可以通過類名直接調用方法。 方法的種類:最大值max、最小值min、sort排序...詳見API幫助文檔 import java.util.ArrayList; import java.util.Collections; import java.util.List;public cl…

【Varnish】:解決 Varnish 7.6 CDN 靜態資源緩存失效問題

項目場景: 在一個使用Varnish作為反向代理的Web應用中,我們依賴CDN(內容分發網絡)來緩存靜態資源(如圖片、CSS、JavaScript文件等),以提高全球用戶的訪問速度并減輕源站服務器的負載。然而&…

理解機器學習中的參數和超參數

在機器學習中,參數和超參數是兩個重要但不同的概念,它們共同影響模型的性能和表現。以下是它們的定義和區別,以及如何通俗地理解它們: 1. 參數 定義 參數是模型在訓練過程中自動學習到的變量,它們直接決定了模型如何…

Win11右鍵菜單實現

主要參考Win11 Context Menu Demo 此工程是vs2022編譯,vs2019先修改下 base.h 方可編譯過 編譯好dll以后 拷貝至SparsePackage目錄下 生成稀疏包msix 就拿他工程里面的改,編輯AppxManifest.xml,配置都要對,一個不對可能都失敗&a…

R.swift庫的詳細用法

R.swift 是一個 Swift 工具庫,它提供了一個自動生成的類 R,使得你可以通過類型安全的方式訪問項目中的資源,例如圖片、字體、顏色、XIB 文件等。通過 R.swift,你可以避免字符串類型的錯誤,提升代碼的可維護性。 以下是 R.swift 庫的詳細用法: 1. 安裝 R.swift 使用 Sw…

像JSONDecodeError: Extra data: line 2 column 1 (char 134)這樣的問題怎么解決

問題介紹 今天處理返回的 JSON 的時候,出現了下面這樣的問題: 處理這種問題的時候,首先你要看一下當前的字符串格式是啥樣的,比如我查看后發現是下面這樣的: 會發現這個字符串中間沒有逗號,也就是此時的J…

what?ngify 比 axios 更好用,更強大?

文章目錄 前言一、什么是ngify?二、npm安裝三、發起請求3.1 獲取 JSON 數據3.2 獲取其他類型的數據3.3 改變服務器狀態3.4 設置 URL 參數3.5 設置請求標頭3.6 與服務器響應事件交互3.7 接收原始進度事件3.8 處理請求失敗3.9 Http Observables 四、更換 HTTP 請求實現…

Linux Kernel 之十 詳解 PREEMPT_RT、Xenomai 的架構、源碼、構建及使用

概述 現在的 RTOS 基本可以分為 Linux 陣營和非 Linux 陣營這兩大陣營。非 Linux 陣營的各大 RTOS 都是獨立發展,使用上也相對獨立;而 Linux 陣營則有多種不同的實現方法來改造 Linux 以實現實時性要求。本文我們重點關注 Linux 陣營的實時內核實現方法! 本文我們重點關注 …

【拒絕算法PUA】3065. 超過閾值的最少操作數 I

系列文章目錄 【拒絕算法PUA】0x00-位運算 【拒絕算法PUA】0x01- 區間比較技巧 【拒絕算法PUA】0x02- 區間合并技巧 【拒絕算法PUA】0x03 - LeetCode 排序類型刷題 【拒絕算法PUA】LeetCode每日一題系列刷題匯總-2025年持續刷新中 C刷題技巧總結: [溫習C/C]0x04 刷…

ClickHouse-CPU、內存參數設置

常見配置 1. CPU資源 1、clickhouse服務端的配置在config.xml文件中 config.xml文件是服務端的配置,在config.xml文件中指向users.xml文件,相關的配置信息實際是在users.xml文件中的。大部分的配置信息在users.xml文件中,如果在users.xml文…

《自動駕駛與機器人中的SLAM技術》ch9:自動駕駛車輛的離線地圖構建

目錄 1 點云建圖的流程 2 前端實現 2.1 前端流程 2.2 前端結果 3 后端位姿圖優化與異常值剔除 3.1 兩階段優化流程 3.2 優化結果 ① 第一階段優化結果 ② 第二階段優化結果 4 回環檢測 4.1 回環檢測流程 ① 遍歷第一階段優化軌跡中的關鍵幀。 ② 并發計算候選回環對…

type 屬性的用途和實現方式(圖標,表單,數據可視化,自定義組件)

1.圖標類型 <uni-icon>組件中&#xff0c;type可以用來指定圖標的不同樣式。 <uni-icons type"circle" size"30" color"#007aff"></uni-icons> //表示圓形 <uni-icons type"square" size"30" co…

網絡基礎知識指南|1-20個

1. IP地址: 即互聯網協議地址&#xff0c;是用于標識互聯網上的每一個設備或節點的唯一地址。IP地址的作用主要是進行網絡設備的定位和路由&#xff0c;確保數據包可以從源設備準確地傳送到目標設備。2. 子網掩碼: 是用于將一個IP地址劃分為網絡地址和主機地址的工具。它通常與…

GPT 系列論文精讀:從 GPT-1 到 GPT-4

學習 & 參考資料 前置文章 Transformer 論文精讀 機器學習 —— 李宏毅老師的 B 站搬運視頻 自監督式學習(四) - GPT的野望[DLHLP 2020] 來自獵人暗黑大陸的模型 GPT-3 論文逐段精讀 —— 沐神的論文精讀合集 GPT&#xff0c;GPT-2&#xff0c;GPT-3 論文精讀【論文精讀】…