如何预测scikit-learn中的时间序列?

Rom*_*man 35 python machine-learning time-series scikit-learn

Scikit-learn采用了一种非常方便的方法fitpredict方法.我有适合fit和的格式的时间序列数据predict.

例如,我有以下内容Xs:

[[1.0, 2.3, 4.5], [6.7, 2.7, 1.2], ..., [3.2, 4.7, 1.1]]
Run Code Online (Sandbox Code Playgroud)

和相应的ys:

[[1.0], [2.3], ..., [7.7]]
Run Code Online (Sandbox Code Playgroud)

这些数据具有以下含义.存储的值ys形成时间序列.值Xs是对应的时间相关"因子",已知这些因素对值ys(例如:温度,湿度和大气压力)有一些影响.

现在,当然,我可以使用fit(Xs,ys).但后来我得到了一个模型,其中未来的值ys仅依赖于因子,并且不依赖于先前的Y值(至少直接),这是模型的限制.我想有其中一个模型Y_n也依赖Y_{n-1}Y_{n-2}等.例如,我可能想使用指数移动平均线作为模型.在scikit-learn中最优雅的方法是什么

添加

正如评论中提到的那样,我可以Xs通过添加来扩展ys.但这种方式有一些局限性.例如,如果我将最后5个值添加y为5个新列X,则有关时间排序的信息ys将丢失.例如,没有迹象表明X第5列中的值跟随第4列中的值,依此类推.作为一个模型,我可能希望得到最后五个的线性拟合,ys并使用找到的线性函数进行预测.但如果我在5列中有5个值,那就不是那么简单了.

增加2

为了使我的问题更加清楚,我想举一个具体的例子.我想有一个"线性"模型y_n = c + k1*x1 + k2*x2 + k3*x3 + k4*EMOV_n,其中EMOV_n只是一个指数移动平均线.怎样,我可以在scikit-learn中实现这个简单的模型吗?

cjo*_*318 21

对于指数加权移动平均线,这可能是您正在寻找的:

import pandas, numpy
ewma = pandas.stats.moments.ewma
EMOV_n = ewma( ys, com=2 )
Run Code Online (Sandbox Code Playgroud)

这里com是一个参数,你可以在这里阅读.然后,你可以结合EMOV_nXs,使用这样的:

Xs = numpy.vstack((Xs,EMOV_n))
Run Code Online (Sandbox Code Playgroud)

然后你可以在这里查看各种线性模型,并执行以下操作:

from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit ( Xs, ys )
print clf.coef_
Run Code Online (Sandbox Code Playgroud)

祝你好运!


cjo*_*318 21

根据维基百科的说法,EWMA可以很好地处理固定数据,但在趋势或季节性存在的情况下,它无法正常工作.在这些情况下,您应分别使用二阶或三阶EWMA方法.我决定看一下pandas ewma功能,看看它是如何处理趋势的,这就是我想出来的:

import pandas, numpy as np
ewma = pandas.stats.moments.ewma

# make a hat function, and add noise
x = np.linspace(0,1,100)
x = np.hstack((x,x[::-1]))
x += np.random.normal( loc=0, scale=0.1, size=200 )
plot( x, alpha=0.4, label='Raw' )

# take EWMA in both directions with a smaller span term
fwd = ewma( x, span=15 )          # take EWMA in fwd direction
bwd = ewma( x[::-1], span=15 )    # take EWMA in bwd direction
c = np.vstack(( fwd, bwd[::-1] )) # lump fwd and bwd together
c = np.mean( c, axis=0 )          # average  

# regular EWMA, with bias against trend
plot( ewma( x, span=20 ), 'b', label='EWMA, span=20' )

# "corrected" (?) EWMA
plot( c, 'r', label='Reversed-Recombined' )

legend(loc=8)
savefig( 'ewma_correction.png', fmt='png', dpi=100 )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

正如您所看到的,EWMA将这一趋势推向了上坡和下坡.我们可以通过在两个方向上取EWMA然后求平均来纠正这个问题(无需自己实施二阶方案).我希望你的数据是固定的!

  • 它看起来不像你在这里预测任何东西.您只需尝试在您已知的数据中添加一行. (10认同)