机器学习与时间序列预测

 爱斯翠摩鸡 关注

2018.03.15 14:02* 字数 2186 阅读 2711评论 8喜欢 9

前言

在所有的预测问题里面,时间序列预测最让我头疼。

做时间序列预测,传统模型最简便,比如Exponential Smoothing和ARIMA。但这些模型一次只能对一组时间序列做预测,比如预测某个品牌下某家店的未来销售额。

而现实中需要面对的任务更多是:预测某个品牌下每家店的未来销售额。也就是说,如果这个品牌在某个地区一共有100家店,那我们就需要给出这100家店分别对应的销售额预测值。

这个时候如果再用传统模型,显然不合适,毕竟有多少家店就要建多少个模型,太累。

而且在大数据时代,我们面对的数据往往都是高维的,如果仅使用这些传统方法,很多额外的有用信息可能会错过。

所以,如果能用机器学习算法对这“100家店”一起建模,那么整个预测过程就会高效很多。

但是,用机器学习算法做时间序列预测,处理的数据会变得很tricky。对于普通的截面数据,在构建特征和分割数据(比如做K-fold CV)的时候不需要考虑时间窗口。而对于时间序列,时间必须考虑在内,否则模型基本无效。因此在数据处理上,后者的复杂度比前者要大。

之前在处理时间序列的时候,一直没太想明白该怎么做,最近观摩了几个时间序列预测竞赛冠军分享的代码,颇有收获,这里总结一下他们的建模思路,以便自己日后再碰到类似问题的时候,不要脑抽。

时间序列预测模型建模思路

1. 初始数据集

一开始拿到的数据可能是分好训练集、测试集的,也可能是没分好的。这里我按照竞赛的情况假设一开始的数据集分有训练集和测试集。

对于时间序列数据来说,训练集即为历史数据,测试集即为新数据。历史数据对应的时间均在时间分割点之前(如2018年以前某品牌每家店每天的销售数据),新数据对应的时间均在分割点之后(如2018年以后某品牌每家店每天的销售数据)。

历史数据和新数据均包含N维信息(如某品牌每家店的地理位置、销售的商品信息等),但前者比后者多一列数据:Target,即要预测的对象,如销售额。

基于给出的数据,我们的预测任务是:根据已有数据,预测测试集的Target(如,根据某品牌每家店2018年以前的历史销售情况,预测每家店2018年1月份头15天的销售额)。

2. 数据处理

在构建预测特征上,截面数据和时间序列数据遵循的逻辑截然不同。下面两张图分别是二者的数据处理逻辑示意图。

首先来看针对截面数据的数据处理思路。

对于截面数据来说,训练集数据和测试集数据在时间维度上没有区别,二者唯一的区别是前者包含要预测的目标变量,而后者没有该目标变量。

一般来说,在做完数据清洗之后,我们用“N维数据”来分别给训练集、测试集构建M维预测特征(维度相同),然后用机器学习算法在训练集的预测特征和Target上训练模型,最后通过训练出的模型和测试集的预测特征来计算预测结果(测试集的Target)。

此外,为了给模型调优,我们一般还需要从训练集里面随机分割一部分出来做验证集。

而时间序列的处理思路则有所不同。

时间序列预测的核心思想是:用过去时间里的数据预测未来时间里的Target。

所以,在构建模型的时候,所有过去时间里的数据(训练集里的N维数据和Target,如2018年以前每家店的地理信息、所卖商品信息、日销售额等)都应该拿来构建预测特征。

而新数据本身的N维数据(如2018年1月头15天每家店的地理信息、所卖商品信息等)也应该拿来构建预测特征。

前者是历史特征(对应图上的预测特征A),后者是未来特征(对应图上的预测特征B)。二者合起来构成总预测特征集合。

最后,用预测模型和这个总的预测特征集合来预测未来Target(如未来销售额)。

看到这里,一个问题就产生了:既然所有的数据都拿来构建预测特征了,那预测模型从哪里来?没有Target数据,模型该怎么构建?

你可能会说,那就去找Target呗。对,没有错。但这里需要注意,我们要找的不是未来时间下的Target(毕竟未来的事还没发生,根本无从找起),而是从过去时间里构造“未来的”Target,从而完成模型的构建。这是在处理时间序列上,逻辑最绕的地方。

3. 模型构建

用机器学习算法构造时间序列预测模型,关键的思路在于,通过时间滑窗,人为地构造“未来”Target,来给算法进行学习。

有点绕,请看下面的示意图。

和之前一样,从时间的角度上来看,我们有历史数据,和新数据。但这里,我们不能简单地把历史数据作为训练集、把新数据作为测试集。

怎么做呢。

首先,在历史数据上,我们通过截取不同时间窗口的数据来构造一组或几组数据。比如,我的历史数据是2017年 1月到12月每家店每天的销售数据,那么我可以截取3组数据(见上图的深绿、浅绿部分):2017年1月到10月的数据、2017年2月到11月的数据、2017年3月到12月的数据。

然后,人为地给每组数据划分历史窗口(对应上图的深绿色部分)和未来窗口(对应上图的浅绿色部分)。比如,对于2017年1月到10月的数据,我把1月到9月作为历史窗口、10月作为未来窗口,以此类推。

接着,分别给每组数据构建预测特征,包括历史特征(预测特征A)和未来特征(预测特征B)。而此时,每组数据还有预测Target。

这个时候,我们把得到的所有预测特征(我的例子里是三组预测特征)都合并起来作为训练集特征、把所有预测Target(我的例子里是三组预测Target)合并起来作为训练集Target,之后就可以构建机器学习模型了。

有了训练集和训练模型,还差测试集。测试集的构建遵循之前的数据处理逻辑,拿历史数据构建历史特征,拿新数据构建未来特征,然后把这些特征加入到从训练集上训练出的预测模型中去,即可得到任务需要的最终预测值。

这里需要注意,划多少个时间窗口因数据而异。此外,数据的历史窗口(图上深绿部分)和未来窗口(图上浅绿部分)可以是定长也可以是变长,看具体情况。

以上就是我最近总结出的用机器学习算法构建时间序列预测模型的建模思路。

小礼物走一走,来简书关注我

赞赏支持

日记本

© 著作权归作者所有

举报文章

关注爱斯翠摩鸡

写了 40994 字,被 24 人关注,获得了 29 个喜欢

喜欢

9

更多分享

登录 后发表评论

8条评论 只看作者

按时间倒序按时间正序

小鱼儿_1876

5楼 · 2018.08.24 17:31

没看懂,拿到模型之后,特征B从哪里来。。。 未来有啥特征。

赞  回复

Yessica宏业:

例如 你要预测某一天的销量,那一天是一周的第几天,一个月的第几周,哪一个月等特征就是未来的特征

2018.08.28 22:22  回复

添加新评论

Yessica宏业

4楼 · 2018.08.20 15:30

请问能不能分享一下 观摩的几个时间序列预测竞赛冠军分享的代码或文档~

赞  回复

爱斯翠摩鸡:

https://github.com/wepe/O2O-Coupon-Usage-Forecast

2018.09.04 10:51  回复

添加新评论

edwin1993

3楼 · 2018.06.07 21:39

最近在做客户缴费预测,想添加一点时间序列思想进去。读了以后受益匪浅,非常感谢大佬

赞  回复

爱斯翠摩鸡:

@edwin1993 哈哈不客气 一点小总结 希望有帮助

2018.06.08 13:26  回复

添加新评论

Devi_833d

2楼 · 2018.05.14 11:03

时间序列要保证测试集在训练集时间点之后吧, 文章中的“这个时候,我们把得到的所有预测特征(我的例子里是三组预测特征)都合并起来作为训练集特征、把所有预测Target(我的例子里是三组预测Target)合并起来作为训练集Target“” 会导致部分训练数据在测试集之后吧?

赞  回复

爱斯翠摩鸡:

@Devi_833d 我是这么认为的:这些滑窗数据之所以能合并,是因为我在每组数据上分别构造了“历史”特征和“未来”预测值,也就是说,每一行数据都是用过去的X去预测未来的Y,那这个时候这些数据是可以合并起来、可以当作截面数据那样去用机器学习算法了。可能我确实有欠考虑的地方,但我没太想明白您说的“部分训练数据在测试集之后”具体指的是什么,方便的话您可以说得更详细一些,我们可以探讨一下

什么是时间序列:

什么是时间序列?

时间序列是在一定时间间隔内收集的一系列观察结果。时间在这里起着重要的作用。收集到的观测结果取决于收集的时间。

比如,在沃尔玛这样的零售商店里,面包的销售将是一个时间序列。销售可以是每日水平,也可以是每小时水平。每天从纽约飞往西班牙的人数是一个时间序列。时间在这里很重要。在圣诞节期间,这个数字与其他日子相比将是巨大的。这就是所谓的季节性。

机器学习与时间序列预测相关推荐

  1. 机器学习笔记 时间序列预测(基本数据处理,Box-Cox)

    数据调整 调整历史数据通常会导致更简单的预测任务. 在这里,我们处理四种调整:日历调整.人口调整.通货膨胀调整和数学变换. 这些调整和转换的目的是通过消除已知的变化源或通过使整个数据集的模式更加一致来 ...

  2. 机器学习笔记 时间序列预测(最基本的方法【benchmark】)

    1 最基本的方法 这些方法将作为这个系列的benchmark 有时,这些简单方法中的一种将是可用的最佳预测方法: 但在许多情况下,这些方法将作为基准而不是选择方法. 也就是说,我们开发的任何预测方法都 ...

  3. 【机器学习】时间序列预测:三次指数平滑(Holt-Winters)

    statsmodels是一个Python模块,它提供对许多不同统计模型估计的类和函数,并且可以进行统计测试和统计数据的探索. # -*- encoding:utf-8 -*-import pandas ...

  4. 时间序列预测方法最全总结!

    时间序列预测就是利用过去一段时间的数据来预测未来一段时间内的信息,包括连续型预测(数值预测,范围估计)与离散型预测(事件预测)等,具有非常高的商业价值. 需要明确一点的是,与回归分析预测模型不同,时间 ...

  5. 读论文——“时间序列预测方法综述”

    文章目录 1 什么是时间序列? 2 时间预测方法的核心 3 时间序列数据的特点 4 相关的时间序列参数模型 4.1 移动平均模型(Moving Average, MA) 4.2 自回归模型(Autor ...

  6. 【机器学习基础】不会时间序列预测?不要紧,大神来教你

    作者:Leandro Rabelo 译者:李洁 整理:Lemonbit 译文出品:Python数据之道 「Python数据之道」导语 本文内容较长,较为详细的阐述了进行时间序列预测的步骤,有些内容可能 ...

  7. SLS机器学习介绍(05):时间序列预测

    00系列文章目录 0.1 算法原理目录 SLS机器学习介绍(01):时序统计建模 SLS机器学习介绍(02):时序聚类建模 SLS机器学习介绍(03):时序异常检测建模 SLS机器学习介绍(04):规 ...

  8. 机器学习多步时间序列预测解决方案

    点击上方入口立即[自由构建 探索无限] 一起共赴年度科技盛宴! 1 简介 近年来,随着机器学习与深度学习的发展,以及 Amazon SageMaker (https://aws.amazon.com/ ...

  9. 交通 流量 时间序列预测,神经网络 机器学习 BPNN

    交通 流量 时间序列预测 神经网络 机器学习 BPNN 代码 MLR MLP LSTM 深度学习 数据+程序+分析报告 MATLAB 源码 技术交流 资源共享 博主QQ:68823886 原创文章,转 ...

最新文章

  1. 专家观点 | 李德仁:基于云计算的智慧城市运营脑
  2. 从零开始写一个武侠冒险游戏-3-地图生成
  3. linux 定时器_定时器: Nodejs 中的 timers
  4. 树莓派控制电机转速_怎样用树莓派控制直流电机的方向和速度
  5. Android数据库框架-----ORMLite 的基本用法
  6. 猿创征文|时间序列分析算法之平稳时间序列预测算法和自回归模型(AR)详解+Python代码实现
  7. 【渝粤教育】电大中专电商运营实操 (14)作业 题库
  8. matlab怎么绘制球差像差曲线,减小球差的环带透镜设计
  9. AutoHotKey实现百度云批量离线下载工具
  10. linux 视频壁纸,Plasma video wallpaper: KDE 4 视频壁纸
  11. Spring MVC 地址请求映射
  12. python绘制三维矢量图_开源图形库 c语言-图形图像库 集合
  13. 讯飞智能录音笔SR502帮职场人
  14. 对接接口需要注意的事项
  15. 【已解决】IDEA创建Maven多模块项目子模块引用不到父模块的pom
  16. 【2016 下半年总结】 拨开云雾见天日——专注提升自己最重要
  17. 深入理解flutter的编译原理与优化
  18. Supervised Online Hashing via Hadamard Codebook Learning
  19. 一文看懂“语音识别ASR” | AI产品经理需要了解的AI技术概念
  20. 保姆级STM32F103C8T6做USB-TypeC版J-link OB(官方数据手册,硬件设计,固件烧录,序列号SN修改)

热门文章

  1. mysql数据驱动测试_自动化测试框架-数据驱动(2)
  2. Qt汉字得到汉字拼音首字母
  3. android 疯狂足球原码,基于Android的疯狂足球游戏源代码
  4. 【GitGitHub - 11】:Git合并分支
  5. 蓝桥杯2017年第八届省赛C/C++程序设计本科B组
  6. Dynamics 365Online 如何从APP Source中下载APP
  7. 自研CPU架构与品牌
  8. “basetsd.h”: No such file or directory,LINK : fatal error LNK1158: 无法运行“rc.exe”报错
  9. Python 编程 画一个漂亮的小丑吧
  10. python 日期计算各种方式