RNN实例: 机场乘客人数预测
目标:使用循环神经网络,根据机场乘客流动的数据进行预测某个月份时间的人员数目
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow import keras
from tensorflow.keras import Sequential, layers, optimizers
airplane_data = pd.read_csv(./international-airline-passengers.csv)
airplane_data.head(10)
数据预览
数据实际曲线图
数据预处理部分
# 提取前100行作为训练数据集,后44行作为测试集
training_set = np.array(airplane_data.iloc[0 : 100, 1].values)
testing_set = np.array(airplane_data.iloc[100 : 144, 1].values)
val_set = np.array(airplane_data.iloc[30: 144, 1].values)
# training_set.shape, testing_set.shape
training_set = np.reshape(training_set, (-1,1))
testing_set = np.reshape(testing_set, (-1,1))
val_set = np.reshape(val_set, (-1,1))
print(training_set.shape)
print(testing_set.shape)
print(val_set.shape)
对数据进行归一化的操作
# 将数值进行归一化
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range=(0,1)) # 将数值归一化为0-1之间
training_set_scaled = sc.fit_transform(training_set)
testing_set_scaled = sc.transform(testing_set)
val_set_scaled = sc.transform(val_set)
print(training_set_scaled.shape)
print(testing_set_scaled.shape)
print(val_data_scaled.shape)
分别进行训练,测试,验证数据进行处理
x_train = []
y_train = []
x_test = []
y_test = []
len(training_set_scaled)
# 训练集数据的处理,其他两个类似,不再赘述
# 设置数据为每30个输入预测一个输出
for i in range(30, len(training_set_scaled)):
x_train.append(training_set_scaled[i-30:i])
y_train.append(training_set_scaled[i])
x_train, y_train = np.array(x_train), np.array(y_train)
x_train = tf.convert_to_tensor(x_train, dtype = tf.float32)
y_train = tf.reshape(y_train, len(x_train))
x_train.shape, y_train.shape
对数据集进行随机打散,防止过拟合,因为RNN具有记忆性,否则会影响预测数据的准确性
# 将测试数据集进行随机打散
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_db = train_db.shuffle(1000).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db = test_db.shuffle(1000).batch(32)
搭建RNN模型:使用LSTM的GRU的效果不是特别好(可能是我没有找到)
model = keras.Sequential([
layers.SimpleRNN(80, return_sequences = True),
layers.Dropout(0.2),
layers.SimpleRNN(100),
layers.Dropout(0.2),
layers.Dense(1)
])
model.build(input_shape = (None, 30, 1))
model.compile(optimizer = adam,
loss = mean_squared_error
)
history = model.fit(train_db, epochs=100, validation_data=test_db, validation_freq=5)
模型
数据的验证
# 对验证集输入模型数据的预测,然后进行对比
predicted = model.predict(x_val)
predicted_passengers = sc.inverse_transform(predicted)
# 画出真实数据和预测数据的对比曲线
plt.plot(val_set, color=red, label=real)
plt.plot(predicted_passengers, color=blue, label=Predicted)
plt.title(RNN Passengers Prediction)
plt.xlabel(Month)
plt.ylabel(Passengers)
plt.legend()
plt.show()
最后出来的效果图并没有达到我想要的结果,出现的误差较大,但是总的而言能够模拟出来。(使用的是Jupyter,背景是黑色,所以可能看不到标签啥的)。希望大家能够进行指教,如果你有更好的解决模型,欢迎进行评论
最后给小编一个一键三连,哦不,一键四连: )