如何使用随机梯度下降法进行时间序列分析

4

是否可以使用随机梯度下降进行时间序列分析?

我的初步想法是,给定一系列(t,v)对,我希望一个SGD回归器预测与t + 1相关联的v,将日期/时间转换为整数值,并使用铰链损失函数在此列表上训练回归器。这可行吗?

编辑:这是使用scikit-learn中的SGD实现的示例代码。但是,它未能正确预测简单的线性时间序列模型。它似乎只计算训练Y值的平均值,并将其用作测试Y值的预测。SGD是否仅适用于时间序列分析,还是我的表述有误?

from datetime import date
from sklearn.linear_model import SGDRegressor

# Build data.
s = date(2010,1,1)
i = 0
training = []
for _ in xrange(12):
    i += 1
    training.append([[date(2012,1,i).toordinal()], i])
testing = []
for _ in xrange(12):
    i += 1
    testing.append([[date(2012,1,i).toordinal()], i])

clf = SGDRegressor(loss='huber')

print 'Training...'
for _ in xrange(20):
    try:
        print _
        clf.partial_fit(X=[X for X,_ in training], y=[y for _,y in training])
    except ValueError:
        break

print 'Testing...'
for X,y in testing:
    p = clf.predict(X)
    print y,p,abs(p-y)
2个回答

1

在sklearn中,SGDRegressor对于未经过缩放的输入参数在数值上不稳定。为了获得良好的结果,强烈建议您对输入变量进行缩放。

from datetime import date
from sklearn.linear_model import SGDRegressor

# Build data.
s = date(2010,1,1).toordinal()
i = 0
training = []
for _ in range(1,13):
    i += 1
    training.append([[s+i], i])
testing = []
for _ in range(13,25):
    i += 1
    testing.append([[s+i], i])

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform([X for X,_ in training])

训练完SGD回归器后,您需要相应地缩放测试输入变量。
clf = SGDRegressor()
clf.fit(X=X_train, y=[y for _,y in training])
        
print(clf.intercept_, clf.coef_)

print('Testing...')
for X,y in testing:
    p = clf.predict(scaler.transform([X]))
    print(X[0],y,p[0],abs(p[0]-y))

这是结果:

[6.31706122] [3.35332573]
Testing...
733786 13 12.631164799851827 0.3688352001481725
733787 14 13.602565350686039 0.39743464931396133
733788 15 14.573965901520248 0.42603409847975193
733789 16 15.545366452354457 0.45463354764554254
733790 17 16.51676700318867 0.48323299681133136
733791 18 17.488167554022876 0.5118324459771237
733792 19 18.459568104857084 0.5404318951429161
733793 20 19.430968655691295 0.569031344308705
733794 21 20.402369206525506 0.5976307934744938
733795 22 21.373769757359714 0.6262302426402861
733796 23 22.34517030819392 0.6548296918060785
733797 24 23.316570859028133 0.6834291409718674

0
时间序列预测的选择方法取决于您对时间序列的了解。如果您为任务选择特定的方法,则始终会对信号的性质和生成信号的系统类型进行隐含假设。任何方法都是系统的模型。您越了解先验的信号和系统,就越能够更好地对其进行建模。
例如,如果您的信号具有随机性质,通常ARMA过程或卡尔曼滤波器是一个不错的选择。如果这些方法失败,其他更确定性的模型可能会有所帮助,当然,前提是您对系统有一些信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接