从kanggle看到的一个教程(原文 ),主要讲解了如何进行时间序列预测,本文采用该教程部分内容外加一些个人理解。时间允许的情况下最好去看下原文 。
kaggle上还有很多其他的教程,初学者看一下挺好的。最近浏览了一遍,整体感觉语言比较凝练,却又通俗易懂,是不错的教程。每节还附带有练习,除了有时候网速问题,其它的都挺完美。
滞后和时间步长是时间序列特有的特征,滞后表示当前状态对后续状态的影响,(时间序列问题假数据设存在滞后影响,因为只有这样才能进行预测,这点不同于散点数据),时间步长是是指前后两个时间点之间的差值。
线性回归方法
什么是线性回归方法
大家学过函数,牛顿时代的给出的函数传统定义是:因变量根据自变量变动而变动的规律。很自然的认为时间序列自变量就是时间,因变量就是各种观测数据,虽然实际上并不止如此,但不妨以此为切入点。
如果我们像伽利略、开普勒等大师一样观察到了足够多的天体运行数据,那么数据背后的规律,也就是天体运行规律是不是也就慢慢的能找到了?找到规律是不是就能进行预测了?因此,回归方法就是找到一个能够很好的拟合现有数据的函数。
为了找到完美的拟合函数,我们从最简单的情况出发,由简入繁慢慢的改进直到能够完美的拟合。
最简单的情况就是用一个直线拟合数据,也就是直线公式
y
=
w
∗
x
+
b
(
1
)
y = w*x+b (1)
y=w∗x+b(1)
其中y代表观测值,x代表时间,w代表权重(weight),b表示截距(这个截距通常只起到一个上下偏移的作用)。
由于无法获得伽利略等大师的数据,此处引用Kaggle给出的硬皮书销售数量的例子。数据如下,Date表示时间,Hardcover就是硬皮书的销售量。
Hardcover | |
---|---|
Date | |
2000-04-01 | 139 |
2000-04-02 | 128 |
2000-04-03 | 172 |
2000-04-04 | 139 |
2000-04-05 | 191 |
Hardcover | Time | |
---|---|---|
Date | ||
2000-04-01 | 139 | 0 |
2000-04-02 | 128 | 1 |
2000-04-03 | 172 | 2 |
2000-04-04 | 139 | 3 |
2000-04-05 | 191 | 4 |
好了,现在x就是Time列,y就是Hardcover列,那么公式里的w和b怎么确定呢?这个问题有点难,不妨先思考如果给出w,b的两个可能的值,例如(w=1,b=5)和(w=2,b=3),那么怎么评价这两个直线的好坏呢?这就是说给有序对(w,b)一个度量,也就是给出一个值来表示整体拟合度,说人话就是给每个(w,b)打一个分,看分数决定那个好。
【假装有图,回头补上】。
我们用
y
^
\hat{y}
y^表示预测值,那么$|\hat{y_1}-y_1|
表
示
单
个
值
预
测
的
偏
差
,
因
此
平
均
误
差
表示单个值预测的偏差,因此平均误差
表示单个值预测的偏差,因此平均误差\frac{|\hat{y_1}-y_1| + \dots + |\hat{y_n}-y_n| }{n}$ 的值越大说明越差,即分数越低越好,于是我们有了
(w=1,b=5)和(w=2,b=3)的分数分别为(假装有数)。给这个方法起个名字叫平均绝对误差。同样的,
(
y
1
^
−
y
1
)
2
n
\frac{(\hat{y_1}-y_1)^2 }{n}
n(y1^−y1)2 也是如此,这个方法名字叫均方误差。
那么原来的问题就变成了如何寻找最小的均方误差的直线。有个叫最小二乘法(ordinary least squares)的方法可以解决这个问题。这是另外一个故事了,知道这个方法可以就行了,不是本文重点。计算完成后,结果如下图所示,(你会发现图上有时间编号到了30,原因是上边数据只节选了几个意思一下而已)
滞后影响
更进一步,如果像下表Lag_1列一样,把因变量滞后一个时间步长,然后把Lag_1作为因变量,是不是就能表示滞后影响,也就是今天的销量对明天销量的影响。
Hardcover | Lag_1 | |
---|---|---|
Date | ||
2000-04-01 | 139 | NaN |
2000-04-02 | 128 | 139.0 |
2000-04-03 | 172 | 128.0 |
2000-04-04 | 139 | 172.0 |
2000-04-05 | 191 | 139.0 |
同样,采用最小二乘法计算得到结果如下图所示。
多元线性回归
上述分别说明了时间的影响和滞后影响,那么能不能同时考虑两者同时的影响,这样预测的值是不是更加准确呢?
y
=
w
1
∗
x
1
+
w
2
∗
x
2
+
b
(
2
)
y = w_1*x_1+w_2*x_2+b (2)
y=w1∗x1+w2∗x2+b(2)
公式(2)表示了两个影响因素下的一般公式。
怎么用线性回归方法
这里主要介绍python中的计算方法。简单来说就是调包,具体如下。
from sklearn.linear_model import LinearRegression
# Training data
#X = df.loc[:, ['Time']] # features
X = df.loc[:, ['Time']].values.reshape(-1,1) # features, 高版本要加reshape
y = df.loc[:, 'NumVehicles'] # target
# Train the model
model = LinearRegression()
model.fit(X, y)
# Store the fitted values as a time series with the same time index as
# the training data
y_pred = pd.Series(model.predict(X), index=X.index)
为什么要使用线性回归方法
- 直接用于预测
如果线性回归能够很好的拟合数据,多加一个时间变量就可以得到预测值。
这是拟合在预测中的作用。 - 用于初步分析各影响因素的影响力