作者:徐瑞龙,量化分析师

博客专栏:

https://www.cnblogs.com/xuruilong100

前文推送

时间序列分析工具箱——timetk

时间序列预测一直以来是机器学习中的一个难题。

在本篇文章中,将介绍如何在 R 中使用 keras 深度学习包构建神经网络模型实现时间序列预测。

文章的主要内容:

  • 如何将时间序列预测问题表示成为一个回归问题,并建立对应的神经网络模型。

  • 如何使用滞后时间的数据实现时间序列预测,并建立对应的神经网络模型。

问题描述

“航班旅客数据”是一个常用的时间序列数据集,该数据包含了 1949 至 1960 年 12 年间的月度旅客数据,共有 144 个观测值。

下载链接:

international-airline-passengers.csv

多层感知机回归

时间序列预测中最简单的思路之一便是寻找当前和过去数据与未来数据之间的关系,这种关系通常会表示成为一个回归问题。

下面着手将时间序列预测问题表示成一个回归问题,并建立神经网络模型用于预测。

首先,加载相关 R 包。

library(keras) library(dplyr) library(ggplot2) library(ggthemes) library(lubridate)

神经网络模型在训练时存在一定的随机性,所以要为计算统一随机数环境

set.seed(7)

画出整体数据的曲线图,对问题有一个直观的认识。

dataframe <- read.csv(    'international-airline-passengers.csv') dataframe$Month <- paste0(dataframe$Month,'-01') %>%    ymd() ggplot(    data = dataframe,    mapping = aes(        x = Month,        y = passengers)) +    geom_line() +    geom_point() +    theme_economist() +    scale_color_economist()

图1

很显然,数据体现出“季节性”,同时存在线性增长和波动水平增大的趋势。

将数据集分成两部分:训练集和测试集,比例分别占数据集的 2/3 和 1/3。

dataset <- dataframe$passengers train_size <- as.integer(length(dataset) * 0.67) test_size <- length(dataset) - train_size train <- dataset[1:train_size] test <- dataset[(train_size + 1):length(dataset)] cat(length(train), length(test))

96 48

为训练神经网络对数据做预处理,用数据构造出两个矩阵,分别是“历史数据”(作为预测因子)和“未来数据”(作为预测目标)。这里用最近一个月的历史数据做预测。

create_dataset <- function(dataset,                           look_back = 1) {    l <- length(dataset)    dataX <- matrix(nrow = l - look_back, ncol = look_back)    for (i in 1:ncol(dataX))    {        dataX[, i] <- dataset[i:(l - look_back + i - 1)]    }    dataY <- matrix(        data = dataset[(look_back + 1):l],        ncol = 1)    return(        list(            dataX = dataX,            dataY = dataY)) } look_back <- 1 trainXY <- create_dataset(train, look_back) testXY <-  create_dataset(test, look_back)

下面构造神经网络的框架结构并用处理过的训练数据训练。

model <- keras_model_sequential() model %>%    layer_dense(        units = 8,        input_shape = c(look_back),        activation = 'relu') %>%    layer_dense(units = 1) %>%    compile(        loss = 'mean_squared_error',        optimizer = 'adam') %>%    fit(        trainXY$dataX,        trainXY$dataY,        epochs = 200,        batch_size = 2,        verbose = 2)

训练结果如下。

trainScore <- model %>%    evaluate(        trainXY$dataX,        trainXY$dataY,        verbose = 0) testScore <- model %>%    evaluate(        testXY$dataX,        testXY$dataY,        verbose = 0) sprintf(    'Train Score: %.2f MSE (%.2f RMSE)',    trainScore,    sqrt(trainScore)) sprintf(    'Test Score: %.2f MSE (%.2f RMSE)',    testScore,    sqrt(testScore))

[1] "Train Score: 538.50 MSE (23.21 RMSE)"
[1] "Test Score: 2342.33 MSE (48.40 RMSE)

把训练数据的拟合值、测试数据的预测值和原始数据画在一起。

trainPredict <- model %>%    predict(trainXY$dataX) testPredict <- model %>%    predict(testXY$dataX) df <- data.frame(    index = 1:length(dataset),    value = dataset,    type = 'raw') %>%    rbind(        data.frame(            index = 1:length(trainPredict) + look_back,            value = trainPredict,            type = 'train')) %>%    rbind(        data.frame(            index = 1:length(testPredict) + look_back + length(train),            value = testPredict,            type = 'test')) ggplot(data = df) +    geom_line(        mapping = aes(            x = index,            y = value,            color = type)) +    geom_point(        mapping = aes(            x = index,            y = value,            color = type)) +    geom_vline(        xintercept = length(train) + 0.5) +    theme_economist() +    scale_color_economist()

图2

黑线左边是训练部分,右边是测试部分。

从图中可以看出,神经网络模型抓住了数据线性增长和波动率逐渐增加的两大趋势,在不做数据转换的前提下,这是经典的时间序列分析模型不容易做到的;但是很可能没有识别出“季节性”的结构特点,因为训练和预测结果和原始数据之间存在“平移错位”。

多层感知机回归结合“窗口法”

前面的例子可以看出,如果仅使用来预测,很难让神经网络模型识别出“季节性”的结构特征,因此有必要尝试增加“窗口”宽度,使用更多的历史数据(包含一个完整的周期)训练模型。

下面将数 create_dataset 中的参数 look_back 设置为 12,用来包含过去 1 年的历史数据,重新训练模型。

look_back <- 12 trainXY <- create_dataset(train, look_back) testXY <-  create_dataset(test, look_back) model <- keras_model_sequential() model %>%    layer_dense(        units = 8,        input_shape = c(look_back),        activation = 'relu') %>%    layer_dense(units = 1) %>%    compile(        loss = 'mean_squared_error',        optimizer = 'adam') %>%    fit(        trainXY$dataX,        trainXY$dataY,        epochs = 200,        batch_size = 2,        verbose = 2) trainScore <- model %>%    evaluate(        trainXY$dataX,        trainXY$dataY,        verbose = 0) testScore <- model %>%    evaluate(        testXY$dataX,        testXY$dataY,        verbose = 0) sprintf(    'Train Score: %.2f MSE (%.2f RMSE)',    trainScore,    sqrt(trainScore)) sprintf(    'Test Score: %.2f MSE (%.2f RMSE)',    testScore,    sqrt(testScore)) trainPredict <- model %>%    predict(trainXY$dataX) testPredict <- model %>%    predict(testXY$dataX) df <- data.frame(    index = 1:length(dataset),    value = dataset,    type = 'raw') %>%    rbind(        data.frame(            index = 1:length(trainPredict) + look_back,            value = trainPredict,            type = 'train')) %>%    rbind(        data.frame(            index = 1:length(testPredict) + look_back + length(train),            value = testPredict,            type = 'test')) ggplot(data = df) +    geom_line(        mapping = aes(            x = index,            y = value,            color = type)) +    geom_point(        mapping = aes(            x = index,            y = value,            color = type)) +    geom_vline(        xintercept = length(train) + 0.5) +    theme_economist() +    scale_color_economist()

[1] "Train Score: 157.17 MSE (12.54 RMSE)" [1] "Test Score: 690.69 MSE (26.28 RMSE)"

图3

新的模型基本上克服了“平移错位”的现象,同时依然能够识别出线性增长和波动率逐渐增加的两大趋势。

改进方向

  • 目前对“季节性”的识别是靠增加历史数据实现的,能否从神经网络结构的方向入手。

  • 目前的模型中几乎没有用到“特征工程”,如何用特征工程表示数据中存在的主要趋势和结构化特征。

  • DNN + ARIMA:一方作为另外一方的“特征工程”手段。

扩展阅读

  • 《神经网络与深度学习》

  • keras on MRAN

大家都在看

2017年R语言发展报告(国内)

精心整理 | R语言中文社区历史文章合集(作者篇)

精心整理 | R语言中文社区历史文章整理(类型篇)

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战  
回复 Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

基于 Keras 用深度学习预测时间序列相关推荐

  1. 基于keras的深度学习基本概念讲解

    基于keras的深度学习基本概念讲解 Tensorflow1.0正式发布,谷歌首届Tensorflow开发者大会在山景召开,深度学习迎来新的高潮和狂欢.随着深度学习框架的普及和推广,会有越来越多人加入 ...

  2. 基于keras的深度学习——分类

    使用keras的深度学习来分类白葡萄酒还是红葡萄酒 首先介绍一下数据类型: 1.这个数据集包含了1599种红酒,4898种白酒: 2.输入数据特征: 1 - fixed acidity 2 - vol ...

  3. 基于keras的深度学习基本概念讲解——深度学习之从小白到入门

    2019独角兽企业重金招聘Python工程师标准>>> Author: shikanon CreateTime: 2017-02-13 10:33:34 Tensorflow1.0正 ...

  4. 基于keras和深度学习的视频分类实战(附代码)

    作者首先通过train.py训练微调模型,之后用训练好的模型在predict_video.py进行视频分类. 在执行图像分类时,我们: 输入一幅图像到我们的CNN中: 从CNN中获得预测: 选择相应概 ...

  5. 基于深度学习的时间序列预测方法

    之前对时间序列预测的方法大致梳理了一下,最近系统的学习了深度学习,同时也阅读了一些处理序列数据的文献,发现对于基于深度学习的时间序列预测的方法,还可以做进一步细分:RNN.Attention和TCN. ...

  6. 基于深度学习的时间序列预测

    # 技术黑板报 # 第十一期 推荐阅读时长:15min 前言 时间序列建模历来是学术和工业界的关键领域,比如用于气候建模.生物科学和医学等主题应用,零售业的商业决策和金融等.虽然传统的统计方法侧重于从 ...

  7. 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见 ...

  8. 基于深度学习的时间序列分类[含代码]

    基于深度学习的时间序列分类 引言 数据集 实验环境搭建 实验设计 实验代码 实验结果 引言 目前,深度学习在计算机视觉和语音识别上有了非常广泛的应用,但是在工业应用方面还没有完善的体系,一方面缺乏数据 ...

  9. 人脸识别学习一(Keras: 基于 Python 的深度学习库)

    只是把一些文字部分复制出来方便看,完整还是参考源地址,参考文章https://keras.io/zh/ 写在前面: 第一次接触Keras,用自己的话简单概括一下什么事Keras,(不准确之处欢迎批评指 ...

  10. Keras快速上手:基于Python的深度学习

    Keras快速上手:基于Python的深度学习 谢梁,鲁颖,劳虹岚 著 ISBN:9787121318726 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2017-0 ...

最新文章

  1. 计算机技术应用及信息管理,计算机应用技术与信息管理整合研究(共2808字).doc...
  2. 【Java 注解】自定义注解 ( 元注解 )
  3. BQ24296充电管理芯片使用过程中的注意事项
  4. linux raid更换硬盘,linux系统raid1更换故障硬盘处理过程
  5. 需求分析与建模最佳实践_社交媒体和主题建模:如何在实践中分析帖子
  6. 使用相对长度单位em布局网页内容
  7. java int 详解,int与Integer详解(java基础篇)
  8. TCP/UDP调试工具
  9. UE4 如何导入外部插件包
  10. DirectX修复工具 4.0 标准版
  11. 网络安全等级保护的过程
  12. 济南市“十四五”数字泉城规划 附下载
  13. KeyTool 和 OpenSSL 相互转换 [转]
  14. windows神器,让你的效率直线提升
  15. Excel常用函数(案例说明)
  16. SAP_BTE增强有两种,类似于校验和替代
  17. 硬件加油站 | 传感器 - PIR 人体红外传感器
  18. [转]社区运营必读之天涯志
  19. 找朋友(斗地主)判断逻辑
  20. docker-compose links depend on 使用的两种方式

热门文章

  1. 最近,前端开发把我恶心着了,为了甩锅,我写了个牛逼的日志切面!
  2. 微信红包技术架构首次流出,贼牛逼啊!
  3. 最新!2020中国高校毕业生薪资排行出炉!好过双一流的高校原来这么多
  4. 自从上了 Prometheus 监控,睡觉真香!
  5. 2020年只有外包公司给面试机会, Why?
  6. 程序员35岁之后的职业发展
  7. 计算机底层第一课,早学早受益
  8. Linux进阶之Git分布式版本控制系统篇
  9. Linux 命令学习(1): head和tail
  10. MATLAB 动图绘制、保存