深度学习 Day23——利用RNN实现天气预测

news2024/9/29 1:21:45

深度学习 Day23——利用RNN实现天气预测

文章目录

  • 深度学习 Day23——利用RNN实现天气预测
    • 一、前言
    • 二、我的环境
    • 三、前期工作
      • 1、导入依赖项
      • 2、导入数据
      • 3、查看数据基本信息
      • 4、查看各列数据的数据类型
      • 5、转换数据集中有关时间数据转换为时间格式
      • 6、删除Date标签列
      • 7、查看所有列的标签
    • 四、探索式数据分析
      • 1、数据相关性探索
      • 2、明天是否会下雨
      • 3、地理位置与下雨的关系
      • 4、湿度和气压对下雨的影响
      • 5、气温对下雨的影响
    • 五、数据预处理
      • 1、检查数据中缺失值的百分比
      • 2、将存在的缺失值进行随机选择数替换
      • 3、再次检查数据集中是否存在缺失值
      • 4、构建数据集
    • 六、利用RNN预测明天是否下雨
      • 1、搭建RNN神经网络结构
      • 2、编译模型
      • 3、设置早停
      • 4、模型训练
      • 5、模型评估
    • 七、最后我想说

一、前言

🍨 本文为🔗365天深度学习训练营 中的学习记录博客

🍦 参考文章:第R3周:LSTM-火灾温度预测(训练营内部可读)

🍖 作者:K同学啊

在本期博客中我们将继续利用RNN来实现一些预测,本期数据集我们将用到来自澳大利亚许多地点的大约10年的每日天气观测数据,我们将利用这些数据对明天是否会下雨进行一个预测,并在博客的后面添加探索式数据分析,我们首先来看一下我们的CSV数据集:

在这里插入图片描述

数据量有点大,大致看一下可以发现第一行是数据标签,对应各种数值含义,标签下面都是数据。

二、我的环境

  • 电脑系统:Windows 11
  • 语言环境:Python 3.8.5
  • 编译器:DataSpell 2022.2
  • 深度学习环境:TensorFlow 2.4.0
  • 显卡及显存:RTX 3070 8G

三、前期工作

1、导入依赖项

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation,Dropout
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.layers import Dropout
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error , mean_absolute_percentage_error , mean_squared_error

2、导入数据

data = pd.read_csv("data/weatherAUS.csv")
df = data.copy()
data.head()

在这里插入图片描述

3、查看数据基本信息

data.describe()

在这里插入图片描述

4、查看各列数据的数据类型

data.dtypes

在这里插入图片描述

5、转换数据集中有关时间数据转换为时间格式

data['Date'] = pd.to_datetime(data['Date'])
data['Date']

在这里插入图片描述

data['year'] = data['Date'].dt.year
data['Month'] = data['Date'].dt.month
data['day'] = data['Date'].dt.day
data.head()

在这里插入图片描述

在这里插入图片描述

6、删除Date标签列

data.drop('Date', axis=1, inplace=True)

7、查看所有列的标签

data.columns
Index(['Location', 'MinTemp', 'MaxTemp', 'Rainfall', 'Evaporation', 'Sunshine',
       'WindGustDir', 'WindGustSpeed', 'WindDir9am', 'WindDir3pm',
       'WindSpeed9am', 'WindSpeed3pm', 'Humidity9am', 'Humidity3pm',
       'Pressure9am', 'Pressure3pm', 'Cloud9am', 'Cloud3pm', 'Temp9am',
       'Temp3pm', 'RainToday', 'RainTomorrow', 'year', 'Month', 'day'],
      dtype='object')

四、探索式数据分析

1、数据相关性探索

plt.figure(figsize=(15,13))
# data.corr()表示了data中的两个变量之间的相关性
ax = sns.heatmap(data.corr(), square=True, annot=True, fmt='.2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
plt.show()

在这里插入图片描述

2、明天是否会下雨

sns.set(style="darkgrid")
plt.figure(figsize=(4,3))
sns.countplot(x='RainTomorrow',data=data)
<AxesSubplot:xlabel='RainTomorrow', ylabel='count'>

在这里插入图片描述

plt.figure(figsize=(4,3))
sns.countplot(x='RainToday',data=data)
<AxesSubplot:xlabel='RainToday', ylabel='count'>

在这里插入图片描述

然后我们创建一个交叉表用于统计分组频率:

x = pd.crosstab(data['RainTomorrow'], data['RainToday'])
x

在这里插入图片描述

统计出频率之后我们继续来求出概率:

y = x / x.transpose().sum().values.reshape(2,1)*100
y

在这里插入图片描述

可以得出,如果今天不下雨那么明天下雨的概率约为15.4%,如果今天下雨那么明天下雨的概率约为46.8%。我们将概率用图表画出来:

y.plot(kind='bar', figsize=(4, 3), color=['#006666', '#d279a6'])

在这里插入图片描述

3、地理位置与下雨的关系

x=pd.crosstab(data['Location'],data['RainToday'])
#获取每个城市下雨天数和非下雨天数的百分比
y=x/x.transpose().sum().values.reshape((-1,1))*100
#按每个城市的雨天百分比排序
y=y.sort_values(by='Yes',ascending=True)
color=['#cc6699','#006699','#006666','#862d86','#ff9966' ]
y.Yes.plot(kind="barh",figsize=(15,20),color=color)

在这里插入图片描述

我们由图表可以分析出,地理位置会影响下雨,例如:对于城市Portland一年有36%的时间在下雨,而对于城市Woomers来说一年只有6%的时间在下雨。

4、湿度和气压对下雨的影响

我们绘制气压9am的图像:

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Pressure9am',y='Pressure3pm',hue='RainTomorrow')

在这里插入图片描述

我们绘制湿度9am的图像:

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Humidity9am',y='Humidity3pm',hue='RainTomorrow')

在这里插入图片描述

由图表我们分析可知,低压与高湿度会增加第二天下雨的概率,尤其是下午3点的空气湿度。

5、气温对下雨的影响

我们绘制最高气温和最低气温对是否下雨的图像:

plt.figure(figsize=(8,6))
sns.scatterplot(x='MaxTemp',y='MinTemp',data=data,hue='RainTomorrow')

在这里插入图片描述

由图像我们分析可知,当一天的最高气温和最低气温接近时,第二天下雨的概率会增加。

五、数据预处理

1、检查数据中缺失值的百分比

#每列中缺失数据的百分比
data.isnull().sum()/data.shape[0]*100

在这里插入图片描述

2、将存在的缺失值进行随机选择数替换

#在该列中随机选择数进行填充
lst=['Evaporation','Sunshine','Cloud9am','Cloud3pm']
for col in lst:
    fill_list =data[col].dropna()
    data[col] =data[col].fillna(pd.Series(np.random.choice(fill_list,size=len(data.index))))

s=(data.dtypes =="object")
object_cols=list(s[s].index)
object_cols
['Location',
 'WindGustDir',
 'WindDir9am',
 'WindDir3pm',
 'RainToday',
 'RainTomorrow']
#inplace=True:直接修改原对象,不创建副本
#data[i].mode()[0] 返回频率出现最高的选项,众数

for i in object_cols:
    data[i].fillna(data[i].mode()[0],inplace=True)

t=(data.dtypes =="float64")
num_cols=list(t[t].index)
num_cols
['MinTemp',
 'MaxTemp',
 'Rainfall',
 'Evaporation',
 'Sunshine',
 'WindGustSpeed',
 'WindSpeed9am',
 'WindSpeed3pm',
 'Humidity9am',
 'Humidity3pm',
 'Pressure9am',
 'Pressure3pm',
 'Cloud9am',
 'Cloud3pm',
 'Temp9am',
 'Temp3pm']
#.median(), 中位数
for i in num_cols:
    data[i].fillna(data[i].median(), inplace=True)

3、再次检查数据集中是否存在缺失值

data.isnull().sum()

在这里插入图片描述

4、构建数据集

在处理数据标签时,机器学习或深度学习能识别的标签都是数字类型,分类时用0,1,2…,预测时是浮点数,而大多数数据起始时都不是这种类型,像:“男”和“女”,“是”和“否”,“猫”或“狗”或“人”这类的比较多,因此需要将它们转换为数字类型。

LabelEncoder:将n个类别编码为0~n-1之间的整数(包含0和n-1),以下是使用LabelEncoder转换标签的实例:

from sklearn.preprocessing import LabelEncoder

label_encoder=LabelEncoder()
for i in object_cols:
    data[i] =label_encoder.fit_transform(data[i])

X=data.drop(['RainTomorrow','day'],axis=1).values
y=data['RainTomorrow'].values

X_train,X_test, y_train, y_test =train_test_split(X,y,test_size=0.25,random_state=101)

scaler=MinMaxScaler()
scaler.fit(X_train)
X_train=scaler.transform(X_train)
X_test =scaler.transform(X_test)

六、利用RNN预测明天是否下雨

1、搭建RNN神经网络结构

model=Sequential()
model.add(Dense(units=24,activation='tanh',))
model.add(Dense(units=18,activation='tanh'))
model.add(Dense(units=23,activation='tanh'))
model.add(Dropout(0.5))
model.add(Dense(units=12,activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(units=1,activation='sigmoid'))

2、编译模型

from tensorflow.keras.optimizers import Adam

optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4)

model.compile(loss='binary_crossentropy',
              optimizer=optimizer,
              metrics="accuracy")

3、设置早停

early_stop=EarlyStopping(monitor='val_loss',
                         mode='min',
                         min_delta=0.001,
                         verbose=1,
                         patience=25,
                         restore_best_weights=True)

4、模型训练

history=model.fit(x=X_train,
y=y_train,
validation_data=(X_test,y_test), verbose=1,
callbacks=[early_stop],
epochs =10,
batch_size =32
)

训练的结果是:

Epoch 1/10
   1/3410 [..............................] - ETA: 0s - loss: 0.7532 - accuracy: 0.4688WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0000s vs `on_train_batch_end` time: 0.0010s). Check your callbacks.
3410/3410 [==============================] - 2s 671us/step - loss: 0.4421 - accuracy: 0.8066 - val_loss: 0.3883 - val_accuracy: 0.8310
Epoch 2/10
3410/3410 [==============================] - 2s 661us/step - loss: 0.3974 - accuracy: 0.8319 - val_loss: 0.3786 - val_accuracy: 0.8363
Epoch 3/10
3410/3410 [==============================] - 2s 631us/step - loss: 0.3902 - accuracy: 0.8347 - val_loss: 0.3758 - val_accuracy: 0.8379
Epoch 4/10
3410/3410 [==============================] - 2s 627us/step - loss: 0.3869 - accuracy: 0.8367 - val_loss: 0.3739 - val_accuracy: 0.8386
Epoch 5/10
3410/3410 [==============================] - 2s 621us/step - loss: 0.3848 - accuracy: 0.8366 - val_loss: 0.3757 - val_accuracy: 0.8377
Epoch 6/10
3410/3410 [==============================] - 2s 651us/step - loss: 0.3824 - accuracy: 0.8379 - val_loss: 0.3728 - val_accuracy: 0.8389
Epoch 7/10
3410/3410 [==============================] - 2s 678us/step - loss: 0.3822 - accuracy: 0.8374 - val_loss: 0.3712 - val_accuracy: 0.8398
Epoch 8/10
3410/3410 [==============================] - 2s 651us/step - loss: 0.3809 - accuracy: 0.8382 - val_loss: 0.3705 - val_accuracy: 0.8396
Epoch 9/10
3410/3410 [==============================] - 2s 624us/step - loss: 0.3789 - accuracy: 0.8391 - val_loss: 0.3699 - val_accuracy: 0.8401
Epoch 10/10
3410/3410 [==============================] - 2s 611us/step - loss: 0.3790 - accuracy: 0.8393 - val_loss: 0.3695 - val_accuracy: 0.8394

5、模型评估

import matplotlib.pyplot as plt

acc = model.history.history['accuracy']
val_acc = model.history.history['val_accuracy']

loss = model.history.history['loss']
val_loss = model.history.history['val_loss']

epochs_range = range(10)

plt.figure(figsize=(14, 4))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

在这里插入图片描述

七、最后我想说

本期的博客就到这里结束了,训练营有关RNN的实验到这里就结束了,后续我也会自己去找一下有关这方面的实验进行学习,拓宽自己的知识面,下一期博客开始,我们将暂时离开TensorFlow转战Pytorch的学习。

最后,马上就要跨越到2023年了,今年的时间过得可真快,在2022年中经历了很多事,也从中学到了很多,也多谢我的粉丝们这一路的陪伴,提前祝你们2023年新年快乐,心想事成,在新的一年里不留遗憾,谢谢!

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

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

相关文章

多版本并发控制(MVCC)

MVCC机制概述 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;中文是多版本并发控制&#xff0c;是指在使用READ COMMITTED、REPEATABLE READ这两种隔离级别的事务在执行SELECT操作时访问记录的版本链的过程&#xff0c;从而在不加锁的前提下使不…

基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

基于LSTM三分类的文本情感分析&#xff0c;采用LSTM模型&#xff0c;训练一个能够识别文本postive, neutral, negative三种 &#xff0c;含数据集可直接运行 完整代码下载地址&#xff1a;基于LSTM三分类的文本情感分析 基于LSTM三分类的文本情感分析 背景介绍 文本情感分析…

Comic Life - 超棒的漫画制作工具,拥有多种动画模版,创作属于自己的漫画

Comic Life - 超棒的漫画制作工具&#xff0c;拥有多种动画模版&#xff0c;创作属于自己的漫画 Comic Life是一个照片编辑器&#xff0c;能够添加各种效果&#xff0c;并基于它们创建漫画。该工具包包括各种各样的模板&#xff0c;可以很容易地将照片放置在工作表上&#xff0…

CKEditor 为你的Flask项目添加一个富文本编辑器

人家高高在上的CKEditor是有个官网的&#xff01;&#xff01; WYSIWYG HTML Editor with Collaborative Rich Text EditingRock-solid, Free WYSIWYG Editor with Collaborative Editing, 200 features, Full Documentation and Support. Trusted by 20k companies.https://c…

SBM模型分析全流程

数据包络分析DEA时&#xff0c;其研究投入产出效率情况&#xff0c;并且其假定投入和产出之间存在单调线性关系&#xff0c;其为一种线性规划技术来确定DMU相对效率的方法。但有时候会多出下‘非期望产出’&#xff0c;就是不希望有它产出&#xff0c;比如资金投入、教育投入换…

【Unity3D日常开发】Unity3D拓展开发:UI界面控制,UI界面的显示和隐藏实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;可能遇到管理…

2022最后一天盘点

今天是今年最后的一天工作日&#xff0c;对于我来说就是今年的最后一天&#xff0c;因为放假了我就不需要思考了&#xff08;当然公司后端程序员要保持24小时oncall&#xff09; 1 阳完之后 还是有些 咳嗽&#xff0c;公司此起彼伏的咳嗽声&#xff0c;不知道什么时候所有人都…

21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

【日常系列】LeetCode《23·回溯2》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 401 &#xff1a;二进制手表 https://leetcode.cn/problems/binary-watch/ 提示&#xff1a; 0 < turnedOn < 10 class Solution:def readBinary…

java jvm详解

java 系列文章之JVM 文章目录java 系列文章之JVM一、JVM1.基本概念2.运行过程二、线程三、JVM 内存区域1. 程序计数器(线程私有)2. 虚拟机栈(线程私有)3. 本地方法区(线程私有)4. 堆&#xff08;Heap-线程共享&#xff09;-运行时数据区5. 方法区/永久代&#xff08;线程共享&a…

UE4.27 C++调用DLL

1.首先在UE C项目中添加一个x64动态链接库&#xff0c;取名RouteInterface,放到Source下面&#xff1b; 2.在Source下面新建两个文件夹Include和Lisbs,这两个文件夹用来保存库的头文件和lib文件 3.在项目RouteInterface下面添加一个类&#xff1a;TestDll,并且把头文件保存到…

Mybatis-Plus查询投影与查询条件设置

目录 查询投影 查询指定字段 聚合查询 分组查询 查询条件设置 等值查询 范围查询 模糊查询 排序查询 查询投影 目前我们在查询数据的时候&#xff0c;什么都没有做默认就是查询表中所有字段的内容而查询投影即不查询所有字段&#xff0c;只查询出指定内容的数据 查询指…

九、文件File、IO流

文件File File可以用来表示计算机中的文件或者文件夹官方定义&#xff1a;文件和文件夹路径名的抽象表示形式 3种构造 1File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例2File(String parent, String child) 从父路径名字符串和子路径名字…

2022硅谷大厂的大!失!败!AiDA时尚设计师助手;2023热门IT技能预告;Uber送货机器人;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 『抖音』2022抖音热点数据报告&#xff0c;共度温暖岁末 抖音热点联合巨量算数&#xff0c;发布了《2022抖音热点数据报告》&#xff0c;盘点了20…

如何在pycharm上安装tensorflow

TensorFlow™是一个基于数据流编程&#xff08;dataflow programming&#xff09;的符号数学系统&#xff0c;被广泛应用于各类机器学习&#xff08;machine learning&#xff09;算法的编程实现&#xff0c;其前身是谷歌的神经网络算法库DistBelief 。 Tensorflow拥有多层级结…

qt 崩溃处理

Windows系统MSVC编译器的dump文件 debug模式 生成exe自带生成pdb文件&#xff0c;所以无需处理。 1.生成dump文件 通过修改注册表&#xff0c;增加注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps 具体见&#xff1a;利用vs 分…

Forrester Wave发布最新报告 腾讯云数据连接器评分卓越

全球权威研究机构 Forrester 在2022年12月8日最新发布的《中国公有云开发和基础设施平台&#xff0c;Q4 2022》报告中&#xff0c;腾讯云获得高分&#xff0c;位列“领导者象限”。Forrester在报告中提出&#xff1a;“企业在进行公有云开发和基设施平台提供商的选项中&#xf…

php宝塔搭建部署实战帮管客CRM客户管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的帮管客CRM客户管理系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#xf…

商业智能BI中,业务质量分析和业务成本分析

最初谁也没有想到&#xff0c;信息化 、数字化技术及其应用能够在如此短时间内快速覆盖了社会的方方面面&#xff0c;如今人们的衣食住行和工作生活娱乐都离不开数字化、数据的身影。 数据分析&#xff0c;是离不开业务的&#xff0c;只有把业务研究好了&#xff0c;所做出的报…

Numpy 数组切片

一、列表切片&#xff08;一维数组&#xff09; 1.1、切片原理 列表切片是从原始列表中提取列表的一部分的过程。在列表切片中&#xff0c;我们将根据所需内容&#xff08;如&#xff0c;从何处开始&#xff0c;结束以及增量进行切片&#xff09;剪切列表。Python中符合序列的…