machine-learning - 如何使用SGD进行时间序列分析

标签 machine-learning signal-processing time-series classification regression

是否可以使用stochastic gradient descent用于时间序列分析?

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

编辑:这是使用 SGD implementation 的示例代码在 scikit-learn 中。然而,它无法正确预测简单的线性时间序列模型。它所做的似乎只是计算训练 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)

最佳答案

对于未缩放的输入参数,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

关于machine-learning - 如何使用SGD进行时间序列分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10837897/

相关文章:

python - 您是否必须为部署选择 pickle scaler 和 ML 模型?

python - 标准化波形文件

python - numpy 中信号的 PSD 以及如何对其进行缩放

pandas - 按小时分组时如何概括分类数据?

python - 按 Pandas 组顺序计算差异

python - 机器学习实体候选评分(非识别)

machine-learning - TF-IDF提取关键词

c - DSP 处理器字大小

python - 如何在python中建立一个不规则的时间序列预测模型?

r - R 中随机森林时间序列的变量重要性