深度学习 Day23 |
您所在的位置:网站首页 › 预测降雨量可以用什么模型来表示呢 › 深度学习 Day23 |
深度学习 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()然后我们创建一个交叉表用于统计分组频率: 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'])我们由图表可以分析出,地理位置会影响下雨,例如:对于城市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在处理数据标签时,机器学习或深度学习能识别的标签都是数字类型,分类时用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年新年快乐,心想事成,在新的一年里不留遗憾,谢谢! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |