【Keras】学习笔记17:多层感知器的时间序列预测:国际旅行人数预测

一、多层感知器

  从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()

结果如下:
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zking~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值