线性回归预时间序列预测

从kanggle看到的一个教程(原文 ),主要讲解了如何进行时间序列预测,本文采用该教程部分内容外加一些个人理解。时间允许的情况下最好去看下原文
kaggle上还有很多其他的教程,初学者看一下挺好的。最近浏览了一遍,整体感觉语言比较凝练,却又通俗易懂,是不错的教程。每节还附带有练习,除了有时候网速问题,其它的都挺完美。

滞后和时间步长是时间序列特有的特征,滞后表示当前状态对后续状态的影响,(时间序列问题假数据设存在滞后影响,因为只有这样才能进行预测,这点不同于散点数据),时间步长是是指前后两个时间点之间的差值。

线性回归方法

什么是线性回归方法

大家学过函数,牛顿时代的给出的函数传统定义是:因变量根据自变量变动而变动的规律。很自然的认为时间序列自变量就是时间,因变量就是各种观测数据,虽然实际上并不止如此,但不妨以此为切入点。

如果我们像伽利略、开普勒等大师一样观察到了足够多的天体运行数据,那么数据背后的规律,也就是天体运行规律是不是也就慢慢的能找到了?找到规律是不是就能进行预测了?因此,回归方法就是找到一个能够很好的拟合现有数据的函数。

为了找到完美的拟合函数,我们从最简单的情况出发,由简入繁慢慢的改进直到能够完美的拟合。

最简单的情况就是用一个直线拟合数据,也就是直线公式
y = w ∗ x + b ( 1 ) y = w*x+b (1) y=wx+b1
其中y代表观测值,x代表时间,w代表权重(weight),b表示截距(这个截距通常只起到一个上下偏移的作用)。

由于无法获得伽利略等大师的数据,此处引用Kaggle给出的硬皮书销售数量的例子。数据如下,Date表示时间,Hardcover就是硬皮书的销售量。

Hardcover
Date
2000-04-01139
2000-04-02128
2000-04-03172
2000-04-04139
2000-04-05191
你会发现时间这个格式无法带入到公式(1)里进行计算啊,为了解决这个问题,我们可以给虚拟变量(time dummy),也就是给时间编个号。
HardcoverTime
Date
2000-04-011390
2000-04-021281
2000-04-031722
2000-04-041393
2000-04-051914

好了,现在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} ny1^y12 也是如此,这个方法名字叫均方误差。

那么原来的问题就变成了如何寻找最小的均方误差的直线。有个叫最小二乘法(ordinary least squares)的方法可以解决这个问题。这是另外一个故事了,知道这个方法可以就行了,不是本文重点。计算完成后,结果如下图所示,(你会发现图上有时间编号到了30,原因是上边数据只节选了几个意思一下而已)

绘图

滞后影响

更进一步,如果像下表Lag_1列一样,把因变量滞后一个时间步长,然后把Lag_1作为因变量,是不是就能表示滞后影响,也就是今天的销量对明天销量的影响。

HardcoverLag_1
Date
2000-04-01139NaN
2000-04-02128139.0
2000-04-03172128.0
2000-04-04139172.0
2000-04-05191139.0

同样,采用最小二乘法计算得到结果如下图所示。
在这里插入图片描述

多元线性回归

上述分别说明了时间的影响和滞后影响,那么能不能同时考虑两者同时的影响,这样预测的值是不是更加准确呢?
y = w 1 ∗ x 1 + w 2 ∗ x 2 + b ( 2 ) y = w_1*x_1+w_2*x_2+b (2) y=w1x1+w2x2+b2
公式(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)

为什么要使用线性回归方法

  1. 直接用于预测
    如果线性回归能够很好的拟合数据,多加一个时间变量就可以得到预测值。
    这是拟合在预测中的作用。
  2. 用于初步分析各影响因素的影响力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值