微信号:gh_204a49628d6a

介绍:工科水硕一枚,数据挖掘自学者&门外汉,在大公司打酱油.文章均为【本人原创】,主要涵盖: 1. 各大公司实习、校招面试经历 2. 机器学习、数据挖掘、推荐系统、自然语言处理等领域技术文章

[DM] 都是套路: 从上帝视角看透时间序列和数据挖掘

2017-03-30 23:03 穆文

【原创,转载请『保留此声明』,并注明来自公众号『数据挖掘机养成记』及作者『穆文』】

  • 引子

  • 参考资料

  • 前言

  • 基础

  • 正文

    • 从统计学的角度

    • 从经典机器学习的角度

    • 从RNN等模型的角度

  • 一点发散

  • 总结

  • Bonus

引子

大家好
我叫数据挖掘机
皇家布鲁斯特大学肄业
我喝最烈的果粒橙,钻最深的牛角尖
——执着如我

今天我要开挖时间序列问题
并总结出一套『大一统』的框架体系

这是一套独家秘笈

阐述数据挖掘套路

万变皆不离其宗

参考资料

[1] My mind palace

前言

在知乎上回答了一个时间序列处理的问题(点击阅读原文),顺便思考了下这几年来,自己接触的各类数据挖掘问题,整理成此文。

首先我们来看下一些常见的数据挖掘场景:

  • 广告点击率预测: 根据用户历史上的浏览、点击、停留时间等行为,预测用户会不会点击该广告
  • 推荐系统: 根据用户历史的购买记录、点击行为,以及商品描述文本、用户画像等等一些系列特征,预测用户未来的购买需求
  • 命名实体识别: NLP (自然语言处理) 的经典问题,识别出一句有序的文本里,特定类别的词组
  • 股价预测: 预测某支股票或某些股票,未来一段时间的价格,或者粗糙一点——涨跌趋势
  • 图像识别: 比如人脸识别、医疗图像分析
  • 视频情感分析: 根据一段视频(可以看做是一系列时间上连续的图像),分析出这个视频表达的情感倾向

我们会发现,这些问题很多都跟『时间序列』有关(除了图像识别),并且也是数据挖掘比赛的常见赛题,以天猫14年的推荐大赛、支付宝15年的资金流入流出预测为例,这俩比赛有非常完整的前十强团队答辩ppt公布,我们会发现,处理这些问题的选手中,主要分俩流派:机器学习流派和统计学流派。14年的天猫推荐大赛是机器学习流派占主流:做特征、训练分类器、模型融合,把时间信息完全融入到特征中去;而15年的支付宝比赛是统计学流派占上风:用各种 AR (auto regression) 模型,从时间维度上建模,直接考虑时间上的连续性。

这些看似迥异的做法,其实都可以归结到一个大的理论中去,而这个理论,正是本文的核心。

P.S. 关于数据挖掘比赛,去年半原创半翻译地写过一篇文章『数据挖掘比赛通用框架』,现在看来,那篇文章还是太偏『术』了,探讨细节的做法居多,并没有从『道』的层面给出解释。今天,本文将给出更 high level 的『数据挖掘之道』

基础

首先,我认为所有『有监督学习』问题,本质上都是在建立一个函数映射 f ,可以用一个式子来刻画:

f(X)->Y

这个式子是我自己想的,但其实只要有一定机器学习基础的人,都很容易想到这一点。这里的 X 是样本的特征,Y 是样本的标签,X 可以是向量、矩阵甚至多维矩阵,相应的,Y 可以是单个标签,也可以是一组标签。我们待会儿结合实例讲讲 X 和 Y 在具体情形下的具体形式

于是:

  • 按照 Y 的取值是连续的,还是离散的,可以把有监督学习问题分为『回归』和『分类』,可以参考我的前作『分类和回归的本质』,给你一个不同的视角看待经典问题。
  • 按照 Y 是单个标签,还是前后有关联的序列化标签,可以把有监督学习问题分为『时间序列』和『非时间序列』问题,而本文今天的主角,就是这个『时间序列』

上面两种划分方式的两两组合,会产生四种情况,比如:时间序列的回归问题,非时间序列的分类问题,等等。这四种情况基本涵盖了所有的机器学习模型,或者说,所有实际问题,都可以通过各种方式,最后转化成这四种情况里的一种。

其实,严格来讲,『时间序列』这个说法并不准确,比如在 NLP 中,一句话的每个单词组成一个序列,但他们并不代表有时间标签,只是有前后关系,所以这类问题其实叫『事件序列(event sequences)』。我们在本文当中为了简单起见,将这种带有前后顺序关系的序列,统称为『时间序列』,特此声明。


鉴于不少网站私自爬取我的原创文章,我决定在文中插入二维码以维护来源,希望不会打扰到各位阅读


正文

接下来,我们将正式探讨『时间序列』问题的常见处理手段

从统计学的角度

处理时间序列最自然的方法,莫过于 AR 系列的模型 (ARIMA, ARMAX, …), 以及我之前在一篇很水的论文里用过的一阶马尔可夫链模型。这类模型的的最大特点,就是直接从预测变量 Y 的角度来考虑问题,比如现在要预测 y(T),比如T 时刻的股价,那我们就会用 {y(1),…,y(t)…, y(T-1) } 这些历史信息,做一阶差分、二阶差分、均值、方差等等等,得到各种统计量(有点特征工程的意思),然后来预测 y(T)。这种模型有两个显而易见的弊端:

  1. 只用到了预测变量本身,无法利用到其他信息如影响股价的政策因素等(不过统计学里已经有一些模型在 handle 这类问题了)
  2. 看似在时间维度上建立模型,但其实是用以往的记录分别来预测 y(T), y(T+1),…, 并没有考虑这些预测变量本身的时间相关性
  3. 能处理的历史记录时长有限

从经典机器学习的角度

依然是预测 y(T) ,这时候我们会对利用上所有的其他变量 X,比如上面说的,影响股价的政策因素等,而且与统计学的做派不同,我们也对历史记录提取不同的特征,但我们并不 care 是哪类统计量,比如什么一阶差分啥的,也不太 care 统计指标,我们只管拼命做特征,开脑洞做特征,用 CNN 自动做特征,反正就是特征工程搞得飞起,然后得到一个庞大无比的 X,用来预测 y(T)。其实不难发现,这种做法,就是我们在上一节提到的『非时间序列问题』,即把一个本来是『时间序列』的问题,转换成非时间序列问题。这种做法的好处是通过完善的特征工程,我们能把过去历史信息尽可能多地建模在 X 里,当然弊端也很明显,跟 AR 系列模型一样

  1. 割裂了 y(T), y(T+1) 之间的时间相关性
  2. 处理的历史记录的时长有限

从RNN等模型的角度

先总结下,前面两种处理『时间序列』的方法,看似杂乱无章,实则可以简洁地纳入我们上一节提到的公式

f(X)->Y

具体到单个样本的预测,就是

f( X(T) ) -> Y(T)

比如,在统计学的方法中,那些从 {y(1),…,y(t)…, y(T-1) } 历史记录上提取的特征,其实就是这里的 X(T);而在经典机器学习方法中,我们脑洞打开所做的各类特征,依然可以归结为—— X(T)。

所以问题就来了,既然这两大类方法,都割裂了 y 之间的时间相关性,那有没有一个『大一统』模型能建立 y 之间的相关性呢? 我们转化成数学语言就是

f( X(1), X(2), …, X(T) ) -> Y(1), Y(2), …, Y(T)

这样,上面的 f( X(T) ) -> Y(T) 就可以看做是它的一个特例,即当样本只包含一个时间点的时候。

答案是肯定的,这样的模型是存在的,那就是——RNN,HMM,CRF 等等,这类模型在建模时显示地建立了 Y 之间的关系。但一般情况下,HMM、CRF 会有马尔可夫性假设,直白地说就是假设 Y(T) 只跟 Y(T-1) 有关系,所以相比而言,从理论上看,RNN 更完美(注意,只是理论上讲,具体效果还要看实际应用),而且,RNN 理论上能处理无限时长的时间序列,即上面的 T 可以无穷大,但因为训练时梯度在时间维度上的连乘操作,RNN 存在梯度消失和爆炸的风险,取而代之的是 GRU, LSTM 等,这又是另一个话题了,在此不表。

好,下面我们用更浅显明白的语言,来叙述这个『大一统』框架。这时候我们不得不搬出这张神图了:

这张图阐释了 RNN 所能处理的所有可能情形,绿色框是 RNN 模型,红色是 输入 X, 蓝色是预测目标 Y。我们重点关注第一个 one to one 和 最后一个many to many。不难发现,对于非时间序列模型,他们看待『时间序列』的角度是单一的,即他们建立的是针对样本 (x(T),y(T))的映射,就是这里的 one to one,而在时间序列模型里,一个样本天然的是 (sequenceX, sequenceY ),这里的 sequenceX 就是上面公式里的 X(1), X(2), …, X(T),同理 sequenceY 是 Y(1), Y(2), …, Y(T),对应的就是 many to many 的情形。

不过这里要提一下两个重要的补充

  1. 尽管理论上 RNN 可以建模无穷时间序列,可以处理不同时间长度的样本,不需要像其他方法一样,只能统计一个时间窗口内的历史信息,但在实际工程实现上,还是要尽量统一历史时间步长的,否则将对编程造成很大麻烦,这点在 Keras, Tensorflow, Theano 等框架里都有体现。
  2. 虽然把 统计学方法 和 经典机器学习方法 都纳入了这个『大一统』框架,看做是一个特例,但其实,RNN 并不需要像他们一样,做很复杂的特征工程,因为这些工作早已隐含在神经网络的各个非线性模块的各种映射里(这也是为什么说 神经网络能自动提取特征),并嵌入到了隐层输出 h 中,作为下一时刻的输入,所以下一个时刻的输入 X(T) 可以不用做那么多特征工程,这正是神经网络吸引人的地方。

一点发散

写到这儿的时候,我的脑子里突然闪过研究生期间学的『预测控制』理论(好吧,我承认我已经完全脱离控制这行了)。预测控制就是利用以往的系统状态、输出信号,来生成未来 N 步的控制率,但区别在于,这里的模型是已知的线性或非线性模型,所以是一种『机理建模』,而用 RNN、RF、GBDT 等,则是完全的数据驱动的黑箱建模。

总结

虽然讨论的是『时间序列』问题,但其实是借助 RNN 模型的理念,把处理所有『有监督学习』问题的思路都理清了

  1. 当处理的是非时间序列问题时(比如人脸识别),收集到的是一系列样本 (X, Y),只要建立 f(X) -> Y 的映射。X可以做特征工程,也可以交由 CNN 这类模型自动学出来
  2. 当样本是时间序列时,有两种做法:
    1. 仿照非时间序列问题的处理方法,收集一系列样本 (X(t),Y(t))建立 f(X(t))->Y(t) 的映射,但其实是『大一统』框架的一个特烈
    2. 更通用的『大一统』框架,则是从 RNN 的角度看待这个问题,建立 f( X(1), X(2), …, X(T) ) -> Y(1), Y(2), …, Y(T) 的映射

额外补充一点:在图像处理、语音识别中,输入特征的维度(像素点、语音波形)之间的相关度很大,可以交给神经网络自动提取特征,而在推荐系统、nlp等问题中,输入特征的维度(user的id、性别、年龄、词的词形)之间的相关性并不那么强,所以神经网络提取特征的效果,未必比得上人工特征。我认为这就是为何深度学习最先在语音和图像领域打开市场的主要原因。

今天所讲的文章,都是『道』的层面,至于具体做法,比如如何提取特征,如何训练模型,可以参考之前两篇文章 『数据挖掘比赛通用框架』 、『优雅高效地数据挖掘』

Bonus

欢迎打赏支持24K纯原创!

另外建了个讨论群,只讨论技术相关问题,可以加我私人微信号,邀请进群,请务必备注:公众号读者,否则不予通过

 
数据挖掘机养成记 更多文章 [DM] 分类和回归的本质 [DM]Kaggle泰坦尼克数据的随机森林实战[下] [DM]Kaggle泰坦尼克数据的随机森林实战[上] [NLP] Tagging系列一、HMM 和 Viterbi 算法 [Python]修饰器(Decorator)由浅入深
猜您喜欢 如何才能成为出色的架构(狗)师 第103讲 扩展标准库(2) 【第324期】用 HTML 标记的古怪代码注释 睿云智合 - 容器技术企业落地的领导者 灵力四射——Docker品玩会