数据挖掘实训:天气数据分析与机器学习模型构建

随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、模型训练、调参、评估与优化等多个环节。

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.mzph.cn/web/66033.shtml

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

相关文章

kalilinux - 目录扫描之dirsearch

情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站,例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考,我们只指导https://www.example.com/ 但不知道它下面有什么文件,文…

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…

Win11右键菜单实现

主要参考Win11 Context Menu Demo 此工程是vs2022编译,vs2019先修改下 base.h 方可编译过 编译好dll以后 拷贝至SparsePackage目录下 生成稀疏包msix 就拿他工程里面的改,编辑AppxManifest.xml,配置都要对,一个不对可能都失败&a…

像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 回环检测流程 ① 遍历第一阶段优化轨迹中的关键帧。 ② 并发计算候选回环对…

GPT 系列论文精读:从 GPT-1 到 GPT-4

学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT,GPT-2,GPT-3 论文精读【论文精读】…

大数据技术Kafka详解 ⑤ | Kafka中的CAP机制

目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新…

riscv架构下linux4.15实现early打印

在高版本linux6.12.7源码中,early console介绍,可参考《riscv架构下linux6.12.7实现early打印》文章。 1 什么是early打印 适配内核到新的平台,基本环境搭建好之后,首要的就是要调通串口,方便后面的信息打印。 正常流…

improve-gantt-elastic(vue2中甘特图实现与引入)

1.前言 项目开发中需要使用甘特图展示项目实施进度,左侧为表格计划,右侧为图表进度展示。wl-gantt-mater,dhtmlx尝试使用过可拓展性受到限制。gantt-elastic相对简单,可操作性强,基础版本免费。 甘特图(Gan…

力扣 全排列

回溯经典例题。 题目 通过回溯生成所有可能的排列。每次递归时,选择一个数字,直到选满所有数字,然后记录当前排列,回到上层时移除最后选的数字并继续选择其他未选的数字。每次递归时,在 path 中添加一个新的数字&…

1/13+2

运算符重载 myString.h #ifndef MYSTRING_H #define MYSTRING_H #include <cstring> #include <iostream> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度int capacity; …

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档&#xff0c;找到示例&#xff1a;顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 领域介绍✨✨ 实时车辆检测和分类是计算机视觉中的一个重要应用领域&#xff0c;旨在从视频流或…

使用 selenium-webdriver 开发 Web 自动 UI 测试程序

优缺点 优点 有时候有可能一个改动导致其他的地方的功能失去效果&#xff0c;这样使用 Web 自动 UI 测试程序可以快速的检查并定位问题&#xff0c;节省大量的人工验证时间 缺点 增加了维护成本&#xff0c;如果功能更新过快或者技术更新过快&#xff0c;维护成本也会随之提高…

性能测试工具Jmeter分布式运行

性能测试工具JMeter的分布式执行是一种用于增强压力测试能力的技术方案&#xff0c;它允许用户通过多台机器来共同完成同一个测试计划的执行。这种方式特别适用于需要模拟成百上千甚至上万用户并发访问的情况&#xff0c;当单台机器由于硬件资源&#xff08;如CPU、内存、网络I…