随着科学技术的发展,人们渴望对天气有一定的掌握空间,从古代的夜观天象到如今的气象卫星,人类在对天气的预测上不断的进步与发展,本文将运用循环神经网络实现对天气情况的初步预测,循环神经网络是人工智能领域深度学习的一种算法,基于对时间序列事情的处理能达到特别好的效果,而天气影响因素恰恰是基于时间序列的。我们通过神经网络模型对影响天气因素的学习,比如:风速、风向、露点温度、(大气)压力等一系列外观因素可以预测天气的污染程度或者阴晴情况等;

在本实验中,我们采用python语言进行编程且调用了keras神经网络框架利于代码的实现。我们所使用的是北京PM2.5科研共享数据集,做天气污染程度的预测,同样,该模型将普遍适用于各种天气指数的预测与分析。实验第一步,我们将一些非数字化的影响指标进行处理,比如:风向;然后采用数据中心化处理,将比较分散的数据进行中心化,以便更好的放入神经网络进行学习。最后,我们将通过损失函数曲线进行判断模型的学习情况,待达到稳定后,我们将利用此模型进行纯净数据的预测,最后通过与真实值的对比;大家如果感兴趣可以加深度学习代码实现群:225215316,或者毕业想做此方向的加毕设讨论群:457756921)

 Python环境

本教程假设你已安装Python SciPy环境,你可以在本教程中使用Python 23。你必须使用TensorFlowTheano后端安装Keras2.0或更高版本)。本教程还 假设你已经安装了scikit-learnPandasNumPyMatplotlib

数据集分析与处理

       本数据是国外机器学习网站共享开源的数据集,北京近五年天气情况和污染指数数据的时间段为201011日至20141231,每个一小时记录一次,但是中间有缺失值,在数据处理中去掉了)。原始数据集包含13列,其中四列是对时间的描述,分别为年、月、日、小时;这些时间节点详细的描述了北京的在每天固定时间点的天气指标情况,时间节点的规律性,为后期对此部分是处理提供了方便。

原始数据集如下图所示:(图:)从图中不难看出,原始所统计的数据集一共包含43825条,但是前28条PM2.5值出现了缺失状况,则选择去除,在中间数据部分,同样也有缺失值部分,也选择去除,我们假设样本的局部去除不会影响数据之间特征的连续性。(如若对空值数据采用赋值处理,若处理不当,影响程度将会大于去值处理)

 基于RNN(循环神经网络)的北京雾霾天气指数的预测(keras实现RNN,LSTM神经网络算法)

      在数据中对风向的表示采用西北、东南等方位术语,为了便于放入神经网络训练,我们将方位分别赋值为1,2,3等个位数字区表示,这样每个方向都将会单独的数据去表示,并不影响数据的真实性,同时,将四列时间属性进行合并,用单一***进行表示,初步处理后的数据表示如下图前5行所示(图:)。

 基于RNN(循环神经网络)的北京雾霾天气指数的预测(keras实现RNN,LSTM神经网络算法)

       数据初步处理后,只是变的更为整洁可视了,这样的数据放入神经网络进行训练将会导致梯度下降求参的误差较大。为了进一步处理数据,我们将数据采用标准化就行进行,通俗的讲就是将数据按照一定的比例进行缩放,或者说缩放到某一空间大小,这样数据之间的差距将会变小,但是他们之间的对应关系将保持不变,即不改变数据的真实性。

       python中,通过从sklearn库调用preprocessing方法即可完成对该数据集的标准化预处理。具体实现语句如下:

     train= (train - np.mean(train, axis=0))/np.std(train, axis=0)  # 标准化

     train = scale(train)

RNN模型的具体实现

即为train_X和train_y,RNN模型的具体实现核心代码如下所示:

model = Sequential()
model.add(SimpleRNN(10, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='mae', optimizer='adam')

history = model.fit(train_X, train_y, batch_size=X, epochs=X, shuffle=True, verbose=1, validation_split=X)

LSTM模型的具体实现

# design network
model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')
# fit network

history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)

结果展示:

将数据放入传统RNN进行训练,待模型达到稳定时,选定训练次数,可得其损失函数图如下所示(图):

基于RNN(循环神经网络)的北京雾霾天气指数的预测(keras实现RNN,LSTM神经网络算法)

....Epoch 46/50

0s - loss: 0.0143 - val_loss: 0.0133

Epoch 47/50

0s - loss: 0.0143 - val_loss: 0.0133

Epoch 48/50

0s - loss: 0.0144 - val_loss: 0.0133

Epoch 49/50

0s - loss: 0.0143 - val_loss: 0.0133

Epoch 50/50

0s - loss: 0.0144 - val_loss: 0.0133

真实值与预测值结果展示(其为归一化后的结果展示):

基于RNN(循环神经网络)的北京雾霾天气指数的预测(keras实现RNN,LSTM神经网络算法)

从图中预测曲线来看,随着时间的增加,传统RNN模型基本能够预测出未来pm2.5的气象指标,预测长度在本实验中达到了99条数据集的长度(其中LSTM较RNN稍微好那么一点点,具体的在这里不再展示了);完整代码详解及注释将会根据网友意见和建议在后续博客中持续更新;欢迎大家转载和关注!