如何预测scikit-learn中的时间序列?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何预测scikit-learn中的时间序列?相关的知识,希望对你有一定的参考价值。
Scikit-learn使用基于fit
和predict
方法的非常方便的方法。我有适合fit
和predict
格式的时间序列数据。
例如,我有以下Xs
:
[[1.0, 2.3, 4.5], [6.7, 2.7, 1.2], ..., [3.2, 4.7, 1.1]]
和相应的ys
:
[[1.0], [2.3], ..., [7.7]]
这些数据具有以下含义。存储在ys
中的值形成时间序列。 Xs
中的值是相应的时间相关的“因子”,已知它们对ys
中的值有一些影响(例如:温度,湿度和大气压力)。
现在,当然,我可以使用fit(Xs,ys)
。但后来我得到了一个模型,其中ys
中的未来值仅取决于因子,并且不依赖于先前的Y
值(至少直接),这是模型的限制。我想有一个模型,其中Y_n
也依赖于Y_{n-1}
和Y_{n-2}
等。例如,我可能想使用指数移动平均线作为模型。在scikit-learn中最优雅的方法是什么
添加
正如评论中提到的,我可以通过添加Xs
来扩展ys
。但这种方式有一些局限性。例如,如果我将y
的最后5个值作为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中实现这个简单的模型吗?
对于指数加权移动平均线,这可能是您正在寻找的:
import pandas, numpy
ewma = pandas.stats.moments.ewma
EMOV_n = ewma( ys, com=2 )
在这里,com
是一个参数,你可以阅读有关here。然后你可以使用类似的东西将EMOV_n
与Xs
结合起来:
Xs = numpy.vstack((Xs,EMOV_n))
然后你可以看看各种线性模型,here,并做类似的事情:
from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit ( Xs, ys )
print clf.coef_
祝你好运!
根据维基百科的说法,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 )
正如您所看到的,EWMA将这一趋势推向了上坡和下坡。我们可以通过在两个方向上取EWMA然后求平均来纠正这个问题(无需自己实施二阶方案)。我希望你的数据是固定的!
以上是关于如何预测scikit-learn中的时间序列?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?
如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?
使用 scikit-learn 训练线性回归模型后,如何对原始数据集中不存在的新数据点进行预测?
python - 如何在python scikit-learn中进行字典向量化后预测单个新样本?