一、多层感知器
从Data下载CSV格式的文件后,使用Panda的read_csv()函数导入数据。因为数据中包含文件尾信息,在数据导入的同时删除文件的尾信息。数据导入后通过Matplotlib来展示数据的趋势,以便与模型预测的结果的趋势进行比较。
在这个问题中,根据当月的旅客数量预测下一个月的旅客数量。目前当如的数据只有一列,可以编写一个简单的函数将单列数据转换为两列数据集,第一列包含当月(t)的旅客数,第二列包含下个月(t+1)的旅客数。第一列是算法模型的输入第二列是模型的输出。
数据集构建完成后,将数据集按照67%和33%的比例分割成训练数据集和评估数据集。先使用训练数据集来训练模型,并使用模型对训练数据集和评估数据集分别进行预测,再通过图表的形式,将预测的结果的趋势与实际数据的趋势进行比较,以查看算法的准确度,代码如下;
import numpy as np
from pandas import read_csv
from matplotlib import pyplot as plt
import math
from keras.models import Sequential
from keras.layers import Dense
seed = 7
batch_size = 2
epochs = 200
filename = 'international-airline-passengers.csv'
footer = 1
look_back = 1
def create_dataset(dataset):
dataX, dataY = [], []
for i in range(len(dataset) - look_back - 1):
x = dataset[i: i + look_back, 0]
dataX.append(x)
y = dataset[i + look_back,0]
dataY.append(y)
print('X: %s, Y: %s'%(x,y))
return np.array(dataX),np.array(dataY)
def build_model():
model = Sequential()
model.add(Dense(units=8,input_dim=look_back,activation='relu'))
model.add(Dense(units=1))
model.compile(loss='mean_squared_error',optimizer='adam')
return model
if __name__ == '__main__':
#设置随机种子
np.random.seed(seed)
#导入数据
data = read_csv(filename,usecols=[1],engine='python',skipfooter=footer)
dataset = data.values.astype('float32')
train_size = int(len(dataset)* 0.67)
validation_size = len(dataset) - train_size
train,validation = dataset[0:train_size,:],dataset[train_size:len(dataset),:]
#创建dataset,让数据产生相关性
X_train,Y_trian = create_dataset(train)
X_validation,Y_validation = create_dataset(validation)
#训练模型
model = build_model()
model.fit(X_train,Y_trian,epochs=epochs,batch_size=batch_size,verbose=2)
#评估模型
train_score = model.evaluate(X_train,Y_trian,verbose=0)
print('Train Score: %.2f MSE (%.2f RMSE)'%(train_score,math.sqrt(train_score)))
validation_score = model.evaluate(X_validation,Y_validation,verbose=0)
print('Train Score: %.2f MSE (%.2f RMSE)' % (validation_score, math.sqrt(validation_score)))
#利用图表查看预测趋势
predict_train = model.predict(X_train)
predict_validation = model.predict(X_validation)
#构建通过训练数据集进行预测的图表数据
predict_train_plot = np.empty_like(dataset)
predict_train_plot[:,:] = np.nan
predict_train_plot[look_back:len(predict_train) + look_back,:] = predict_train
# 构建通过评估数据集进行预测的图表数据
predict_validation_plot = np.empty_like(dataset)
predict_validation_plot[:,:] = np.nan
predict_validation_plot[len(predict_train) + look_back * 2 + 1:len(dataset) - 1,:] = predict_validation
#图表显示
plt.plot(dataset,color='blue')
plt.plot(predict_train_plot,color='green')
plt.plot(predict_validation_plot,color='red')
plt.show()
图中的蓝线是实际数据的变化趋势,绿线是模型对训练数据集预测结果的趋势变化,红线是模型对验证数据集预测结果的变化趋势。模型预测结果的变化趋势与实际数据的变化趋势基本一致。
二、使用窗口方法的多层感知器
对于上面的问题,也可以使用多个最近的时间项来进行预测下一个时间项的预测,这个方法被称为窗口方法。可以针对不同的问题,对窗口的大小进行调整。例如,给定时间(t),预测序列(t+1)中的值时。使用当前时间(t)以及前两个时间(t-1和t-2)。
create_dataset()函数被定义为使用参数控制输出数据集的格式,可以简单地修改一下参数look_back,就能直接使用。
import numpy as np
from pandas import read_csv
from matplotlib import pyplot as plt
import math
from keras.models import Sequential
from keras.layers import Dense
seed = 7
batch_size = 2
epochs = 400
filename = 'international-airline-passengers.csv'
footer = 1
look_back = 3
def create_dataset(dataset):
dataX, dataY = [], []
for i in range(len(dataset) - look_back - 1):
x = dataset[i: i + look_back, 0]
dataX.append(x)
y = dataset[i + look_back,0]
dataY.append(y)
print('X: %s, Y: %s'%(x,y))
return np.array(dataX),np.array(dataY)
def build_model():
model = Sequential()
model.add(Dense(units=12,input_dim=look_back,activation='relu'))
model.add(Dense(units=8,activation='relu'))
model.add(Dense(units=1))
model.compile(loss='mean_squared_error',optimizer='adam')
return model
if __name__ == '__main__':
#设置随机种子
np.random.seed(seed)
#导入数据
data = read_csv(filename,usecols=[1],engine='python',skipfooter=footer)
dataset = data.values.astype('float32')
train_size = int(len(dataset)* 0.67)
validation_size = len(dataset) - train_size
train,validation = dataset[0:train_size,:],dataset[train_size:len(dataset),:]
#创建dataset,让数据产生相关性
X_train,Y_trian = create_dataset(train)
X_validation,Y_validation = create_dataset(validation)
#训练模型
model = build_model()
model.fit(X_train,Y_trian,epochs=epochs,batch_size=batch_size,verbose=2)
#评估模型
train_score = model.evaluate(X_train,Y_trian,verbose=0)
print('Train Score: %.2f MSE (%.2f RMSE)'%(train_score,math.sqrt(train_score)))
validation_score = model.evaluate(X_validation,Y_validation,verbose=0)
print('Train Score: %.2f MSE (%.2f RMSE)' % (validation_score, math.sqrt(validation_score)))
#利用图表查看预测趋势
predict_train = model.predict(X_train)
predict_validation = model.predict(X_validation)
#构建通过训练数据集进行预测的图表数据
predict_train_plot = np.empty_like(dataset)
predict_train_plot[:,:] = np.nan
predict_train_plot[look_back:len(predict_train) + look_back,:] = predict_train
# 构建通过评估数据集进行预测的图表数据
predict_validation_plot = np.empty_like(dataset)
predict_validation_plot[:,:] = np.nan
predict_validation_plot[len(predict_train) + look_back * 2 + 1:len(dataset) - 1,:] = predict_validation
#图表显示
plt.plot(dataset,color='blue')
plt.plot(predict_train_plot,color='green')
plt.plot(predict_validation_plot,color='red')
plt.show()
结果如下: