数据挖掘实训:天气数据分析与机器学习模型构建
随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、模型训练、调参、评估与优化等多个环节。
1. 项目背景与目标
本项目的核心任务是通过分析天气数据来预测明天是否降雨。数据集包含了多个天气特征(如温度、湿度、风速、气压等),我们使用这些特征作为输入,构建机器学习模型预测目标变量(是否下雨)。具体目标如下:
- 使用历史天气数据来预测明天是否降雨。
- 使用多种机器学习算法进行模型训练和评估。
- 处理数据中的缺失值、类别不平衡等问题,提高模型的预测准确性。
2. 数据集介绍
我们使用一个典型的天气数据集,它包含了如下几个主要特征:
- Location:表示获取该信息的气象站的名称。
- MinTemp:以摄氏度为单位的最低温度。
- MaxTemp:以摄氏度为单位的最高温度。
- Rainfall:当天记录的降雨量,单位为毫米(mm)。
- Evaporation:到早上9点之前的24小时内的A级蒸发量,单位为毫米(mm)。
- Sunshine:白天日照的完整小时数,表示当天白昼时段阳光的强度。
- WindGustDir:表示在午夜12点前24小时内,最强风的风向。
- WindGustSpeed:表示在午夜12点前24小时内,最强风的风速,单位为千米每小时(km/h)。
- WindDir9am:上午9点时的风向。
- WindDir3pm:下午3点时的风向。
- WindSpeed9am:上午9点之前每个十分钟的风速平均值,单位为千米每小时(km/h)。
- WindSpeed3pm:下午3点之前每个十分钟的风速平均值,单位为千米每小时(km/h)。
- Humidity9am:上午9点的湿度,单位为百分比。
- Humidity3pm:下午3点的湿度,单位为百分比。
- Pressure9am:上午9点的平均海平面气压,单位为百帕(hpa)。
- Pressure3pm:下午3点的平均海平面气压,单位为百帕(hpa)。
- Cloud9am:上午9点时的天空云层遮蔽程度,以“oktas”单位衡量。0表示完全晴朗,8表示完全阴天。
- Cloud3pm:下午3点时的天空云层遮蔽程度,单位同上午9点。
- Temp9am:上午9点的温度,单位为摄氏度。
- Temp3pm:下午3点的温度,单位为摄氏度。
- 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
这篇博客详细介绍了使用机器学习方法进行天气预测的步骤,包括数据预处理、特征工程、模型训练与评估等多个环节。希望能帮助大家在实际项目中更好地应用这些技术。如果有任何问题或建议,欢迎在评论区留言。
篇幅有限,需要完整的代码的私信我
相关文章:
![](https://i-blog.csdnimg.cn/direct/1fc742ce992f43b29438ea08904c2a4e.png)
数据挖掘实训:天气数据分析与机器学习模型构建
随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、…...
![](https://i-blog.csdnimg.cn/direct/8c15db5440a9422dbbb18e2193a9d031.png)
STM32如何使用内部晶振作为晶振
目录 前言 首先说明一下芯片内部并没有时钟, 而是内部振荡。使用内部振荡的好处是外部无需设计晶振电路 ,再说的简单点 ,不用外部晶振依然可以让单片机正常运转。 环境: 芯片:STM32F103C8T6 Keil:V5.24…...
![](https://i-blog.csdnimg.cn/direct/7018eb525e8f4c61956416b4ae13b748.png)
【Maui】导航栏样式调整
前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用,是 X…...
![](https://i-blog.csdnimg.cn/direct/4339bad58073496cb0a746fcbceeab1e.png)
【黑马程序员三国疫情折线图——json+pyechart=数据可视化】
json数据在文末 将海量的数据处理成我们肉眼可以进行分析的形式,数据的可视化,可以分为两个步骤: 数据处理:利用三方网站厘清json层次格式化,再对文件的读取、检查是否符合JSON规范以及规范化、JSON格式的转化&#…...
![](https://i-blog.csdnimg.cn/direct/322caf0ea60e4969abab0c9f31f50d6c.png#pic_center)
如何实现多级缓存?
本文重点说一说在Java应用中,多级缓存如何实现。 多级缓存是比较常见的一种性能优化的手段,一般来说就是本地缓存分布式缓存。 本地缓存一般采用Caffeine和Guava,这两种是性能比较高的本地缓存的框架。他们都提供了缓存的过期、管理等功能。…...
![](https://i-blog.csdnimg.cn/img_convert/f492165ec033721785008bb4dd83e5a5.png)
Saas数据库迁移单租户数据
1、背景 租户使用Saas系统,用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库,且数据库数据量太大,需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库,主要使用INFORMATION_SCHEMA.COLUMNS表进行数据…...
![](https://www.ngui.cc/images/no-images.jpg)
LeetCode100之括号生成(22)--Java
1.问题描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例1 输入:n 3 输出:["((()))","(()())","(())()","()(())","()()()&qu…...
![](https://i-blog.csdnimg.cn/direct/a5c5e526ccbd4ba59b19814cc503177e.png)
阿里云ios镜像源
阿里云镜像源:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7...
![](https://www.ngui.cc/images/no-images.jpg)
芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?
英伟达的GPU之所以能在AI基础设施领域扮演重要角色,主要源于其硬件架构的优势以及其与深度学习算法的高度兼容性。以下是几个关键因素: 1. 并行计算能力 GPU(图形处理单元)本质上是为处理大量并行计算任务而设计的。与CPU相比&a…...
![](https://i-blog.csdnimg.cn/direct/282f4b56083f47a3b4211d0240aaddde.jpeg#pic_center)
Linux系统之hostname相关命令基本使用
Linux系统之hostname相关命令基本使用 一、检查本地系统版本二、hostname命令的帮助说明中文帮助说明 三、hostname命令的基本使用1. 查看计算机名2. 查看本机上所有IP地址3. 查看主机FQDN4. 查看短主机名 四、hostnamectl命令的使用1. 查看主机详细信息2. 设置主机名3. hostna…...
Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)
1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…...
![](https://www.ngui.cc/images/no-images.jpg)
在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
![](https://www.ngui.cc/images/no-images.jpg)
SQLite PRAGMA
SQLite的PRAGMA命令是一种特殊的命令,用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取,也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下: 要查询当前的PRAGMA值,只需提供该PRAGMA的名字&am…...
![](https://www.ngui.cc/images/no-images.jpg)
使用python调用JIRA6 REST API及遇到的问题
JIRA认证方式简述 JIRA接口调用有两种认证方式访问Jira Rest API,基本认证⽅式(⽤户名和密码)和OAuth1认证方式。 基本认证⽅式:因为⽤户名和密码会被浏览器重复地请求和发送,即使采⽤ SSL/TLS 发送,也会有安全隐患,…...
![](https://i-blog.csdnimg.cn/direct/e5a0b41de8c040fc8b37bf9441d31917.png#pic_center)
基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)
一、项目概述 随着智能家居的普及,智能电表作为家庭用电管理的重要工具,能够实时监测电流、电压及功率,并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心,结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏…...
![](https://i-blog.csdnimg.cn/direct/ecaebe577c4147bea153fd28c860a3ea.png)
图片和短信验证码(头条项目-06)
1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…...
![](https://www.ngui.cc/images/no-images.jpg)
2501,wtl显示html
原文 在MFC程序中有专门封装的CHTMLView来显示超文本文件,如果在对话框中显示网页可用CDHTMLDialog,甚至可实现多页超文本向导风格的对话框,但是在WTL中却没有单独封装超文本的对应控件,这是因为COM组件的使用和编写本来就是ATL的强项,WTL扩展的是ATL欠缺的桌面应用的功能部分…...
![](https://i-blog.csdnimg.cn/direct/31c42ea5ae194e459c4bce508a48d17c.png)
嵌入式C语言:什么是指针?
目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…...
![](https://www.ngui.cc/images/no-images.jpg)
解锁 KaiwuDB 数据库工程师,开启进阶之路
解锁 KaiwuDB 数据库工程师试题,开启进阶之路 一、KaiwuDB 数据库全方位洞察 (一)核心特性深度解析 原生分布式架构:摒弃传统集中式存储的局限,KaiwuDB 采用原生分布式架构,将数据分散存于多个节点。这不仅能有效避免单点故障风险,保障数据的高可用性,还能凭借并行处…...
![](https://i-blog.csdnimg.cn/direct/21d1bf5b2c6444b3b33ad9c5168a5125.png)
ffmpeg7.0 aac转pcm
#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小(缓存5帧数据) #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …...
![](https://www.ngui.cc/images/no-images.jpg)
【Pandas】pandas Series rdiv
Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...
![](https://www.ngui.cc/images/no-images.jpg)
线程安全问题介绍
文章目录 **什么是线程安全?****为什么会出现线程安全问题?****线程安全问题的常见场景****如何解决线程安全问题?**1. **使用锁**2. **使用线程安全的数据结构**3. **原子操作**4. **使用volatile关键字**5. **线程本地存储**6. **避免死锁*…...
![](https://www.ngui.cc/images/no-images.jpg)
为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器
本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目(为AI聊天工具增加一套知识系统)的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...
![](https://www.ngui.cc/images/no-images.jpg)
初识verilog HDL
为什么选择用Verilog HDL开发FPGA??? 硬件描述语言(Hardware Descriptipon Lagnuage,HDL)通过硬件的方式来产生与之对应的真实的硬件电路,最终实现所设计的预期功能,其设计方法与软件…...
![](https://i-blog.csdnimg.cn/direct/45b63a4ecbf04128aa075ff89e4a132d.png)
VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署
近期有个工作需求是进行 YOLOv8 模型的 C 部署,部署环境如下 系统:WindowsIDE:VS2015语言:COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...
![](https://i-blog.csdnimg.cn/direct/98a0fb9b16204fab8ea6e0d18c0c4b44.png)
Notepad++上NppFTP插件的安装和使用教程
一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP,一般情况下,自带的下载地址容易下载失败。这里准备了一个下载连接:Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…...
![](https://www.ngui.cc/images/no-images.jpg)
Kotlin | Android Provider 的实现案例
目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase,在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗? 内部存储: 当使用 Room 创建数据库(如 DemoDatabase),数据库文件通常…...
![](https://www.ngui.cc/images/no-images.jpg)
频域自适应空洞卷积FADC详解
定义与原理 在探讨FADC的核心策略之前,我们需要深入了解其定义和工作原理。FADC是一种创新性的卷积技术,旨在克服传统空洞卷积的局限性。其核心思想是从 频谱分析的角度 改进空洞卷积,通过 动态调整膨胀率 来平衡有效带宽和感受野大小。 FADC的工作原理可以从以下几个方面…...
![](https://i-blog.csdnimg.cn/direct/131fa5b19da74d17a7cf5a7274678e31.png)
Edge浏览器内置的截长图功能
Edge浏览器内置截图功能 近年来,Edge浏览器不断更新和完善,也提供了长截图功能。在Edge中,只需点击右上角的“...”,然后选择“网页捕获”->“捕获整页”,即可实现长截图。这一功能的简单易用,使其成为…...
![](https://i-blog.csdnimg.cn/direct/bb0bc8e09b424b99ac0674744774001e.png)
GAN的应用
5、GAN的应用 GANs是一个强大的生成模型,它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布,也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…...
海南seo外包/搜索引擎优化
转载于:https://blog.csdn.net/prokgtfy9n18/article/details/68962512 在数组运算前,先了解一下数组的解引用到底是怎么回事。 #include <windows.h>#include <stdio.h>int main(){int arr[] {1,2,3,4,5,6,7,8,9,0};printf("%d\n&quo…...
![](/images/no-images.jpg)
如何做自己网站/关键词排名优化顾问
https://blog.csdn.net/weixin_42642341/article/details/84585253 thrift : 是Facebook公布的一款开源跨语言的RPC框架....
![](/images/no-images.jpg)
怎么做销售网站/手机怎么自己制作网页
选单常见于我们的生活当中,通常用于整理一系列的指令,简化複杂的程序,使介面看起来更加友善。当应用程式愈複杂,功能愈多时,通常会利用多级选单将类似的指令组织成一个子选单。一般网页常见到二级选单,利用…...
![](/images/no-images.jpg)
宣传 网站建设/公司网络推广的作用
同步是通信系统中一个十分重要的实际问题。通信系统能够有效、可靠的工作,很大程度上取决于有无良好的同步系统。AIS系统中重要的同步有以下几种。 一、UTC同步 世界协调时(UTC)同步是航海领域中非常关键的技术。在AIS系统中,站台…...
![](/images/no-images.jpg)
江苏和住房建设厅网站/360优化大师软件
链接:http://tech.quarkjoker.com/2011/06/22/C%E7%9A%84tie()%E5%87%BD%E6%95%B0 今天看C primer 时,看到了iOS::tie() 函数。不明白其含义,跟不知道作用。于是上网查了一下。 cplusplus.com 给出的定义是: ostream* tie ( )…...
烟台seo网站诊断/seo外包公司费用
晚上忽然发现自己的MAC从运行程序到看到Spring boot日志时间超过20秒。新建个空的boot空工程也需要10秒才会看到boot的启动日志。 最后设置了gc日志看了下有无异常情况。 从jvisualvm看下 Java HotSpot(TM) 64-Bit Server VM (25.131-b11) for bsd-amd64 JRE (1.8.0_131…...