最近学习了一些数据预测相关的知识,随着预测服务的上线,开始做一轮记录,总结一下最近学习到的与数据预测相关的知识, 也介绍一下做预测目前用到的一些工具。前面也说一下,我处理的数据是时序数据。
Time series
我现在处理的数据都是时序数据(Time series),其特点是跟时间相关,一个时间点,有一个值。 举个例子就用我们互联网服务的带宽来描述好了,通常 CDN 厂商提供的最小粒度是 5 分钟,值的单位是 bps。 那么我们的数据就会长这样
- 2015-01-02T13:00:00 2345
- 2015-01-02T13:05:00 4095
时间序列还是挺规律的,每天服务的高峰低峰,每周也有高峰低峰,每日与每日,每周与每周,其中有一些相关性, 这让我们能够使用一些手段来预测这个值之后的变化。
预测
关于预测,经过最近的学习,也改变了一些观点。刚开始接手的时候,想到,需要把各种因素给找出来,拟合出一个方程式, 有几个因素,就几元的公式,然后进行计算,就能得到那个点的值。比如带宽的因素,当时能想到的,dau,用户平均访问时长, 文件的大小,等等,元素找出来,再进行多项式拟合,找到合适的参数和阶数,然后就能用这些数据进行预测了。 了解调研过后发现,并不是这样的了。
先从最基本的说起,什么是可以预测的,什么是不能预测的呢。 抛硬币。这是一个很普通的例子了,统计学中都会出现的东西,很显然,这个东西是无法预测的,也就是说, 你不能按照前一次抛的硬币是正面还是反面,推测出下一次硬币是正面或者反面。因为无论怎么抛,下一次出现正面反面的概率都是相等的, 除非这不是一个标准的硬币。而当一个数据,它们有时间上的相互关系,并且有一个模式,我们就能预测它。如同一年的降雨量, 一个城市是有规律的。
预测的基本步骤
- 定义问题
- 获取信息
- 初步分析数据
- 选择模型和测试模型
- 检验模型。
预测的方式
通过预测变量
这种就比较传统了,跟上面说的一样,类似的公式是:
ExpectedValue = f(currentValue, factor1, factor2, factor3, factor4…)
需要找到对应的预测变量,并要剔除掉关系不大的预测变量。这种叫做解释性模型,挺好用的, 因为这些因素很好的说明了值是如何做出来的,模型是如何工作。
通过时序数据
ExpectedValue(t) = f(value(t-1), value(t-2), value(t-3), …)
这就是从时序数据自身来推断后续的数据了。
混合模型
将上面两种结合起来做。
然而,我们通常是使用时序数据来做预测,而不是其他两种方式。有几点理由:
- 系统可能是无法理解的,或者说我们很难找出得到这种变化的因素间的关系
- 有必要知道或者预测在未来预测变量的值是多少,这个就很困难了。预测依赖预测。
- 我们更重要的是要知道这个数据是什么,而不是为什么数据是这样。
- 时序数列模型预测,能给出更为精确的值。
实践
针对上面这几点,我们开始通过时序数据做预测。慢慢说一些预测的方式。
一些简单的
平均法
前 n 个数据取均值,作为预测的数据。这种对于有趋势的数据就没什么太大的作用
Naive 法
用最新的点当作预测的
Seasonal naive 法
按照数据的特征,取上一个周期的点作为预测值。
Drift 法
将上一个点,加上之前变化的均值作为预测值。
稍微复杂一些的
移动平均
指数平滑
新的方式
通过深度学习,神经网络进行数据预测
- lstm
- seq2seq
数据分解
时间数据,那么就天然的有一些季节性的特征。通常会分成三个部分。
- Trend
- Seasonal
- Cyclic
一些概念
强/弱平稳
通常我们用一些模型类似 ARIMA 做时序数列的预测,需要其数据是平稳的。平稳简单的说就是数据的变化不会存在趋势。 这个平稳性是有数学定义的。 要求数据平稳,也就是说,我们希望其中的某些性质,不会随着时间的变化而变化。也就是这个数据最本质的特征也延续到未来, 相反,如果这个数据的性质在未来不会发生,对我们的预测工作就没有意义了。 强平稳很难达到,所以我们一般都是弱平稳。 这个数据指标,可以只用 acf 来计算出来。即自己与自己的相关变量。
很自然我们的数据肯定是有趋势的。我们可以针对这份数据进行变换,得到平稳的数据。
差分
差分,diff,也可以理解为 delta。例如一个数据,从 1 慢慢的涨到 10,step 是 10。那么一阶差分,就是 1 的序列。
v: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
diff(1): [1, 1, 1, 1, 1, 1, 1, 1, 1]
这个就是我们上面提到的一个特征(平稳)。每次都 + 1 的这个特征,会延续到未来,我们就能利用这个数据判断出, 下一个预测值很大的概率上是 11。
我现在用的一些方法。
ARIMA
这个可以从我上一篇文章看到,不过有一些不一样,经过我的试验。我发现我的数据按照周来划分,得到的结果要比按天划分的, 要好得多。
Prophet
这是 facebook 开源的工具,prophet, 挺好用的。一开始的时候我把这个工具应用在预测变量上,再用个预测变量计算出预测值。 数据不是很好,因为当时还没理解直接用时序数据预测的方式。直接用来预测,发现预测的曲线比较平滑,一些极值的点判断不好, 还得多看看吧。