【问题标题】:Increasing forecast step in direct multi-step forecast strategy flattens the prediction graph instead of shifting在直接多步预测策略中增加预测步长会使预测图变平而不是移动
【发布时间】:2018-04-08 18:12:29
【问题描述】:

我正在使用神经网络进行时间序列预测。只要我以预测步长 = 0 为网络提供数据(对于 Y 取参考日的值),它看起来就可以了。将预测步长增加 N(对于 Y 取参考日的值 + N)会使预测图变平,而不是将预测图移动 N。知道可能出了什么问题吗?

编辑

至于型号:

model = Sequential()
model.add(Dense(14, input_dim=14, kernel_initializer='normal', activation='relu'))
model.add(Dense(7, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
model.compile(loss='mean_squared_error', optimizer='rmsprop', metrics=['mae'])

关于数据准备

data0 = renameColumns(addTimestampForwardShift(history[['year', 'month', 'day', 'hour', 'high']], timeShift), 0)
data1 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 1), -1)
data2 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 2), -2)
data3 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 3), -3)
data4 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 4), -4)
data5 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 5), -5)
data6 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 6), -6)
data7 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 7), -7)
data8 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 8), -8)
data9 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 9), -9)
data10 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 10), -10)
data11 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 11), -11)
data12 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 12), -12)
data13 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 13), -13)
data14 = renameColumns(addTimestampBackwardShift(history[['year', 'month', 'day', 'hour', 'high']], 14), -14)

data = pandas.merge(data0, data1, on=['timestamp'], how='left')
data = pandas.merge(data, data2, on=['timestamp'], how='left')
data = pandas.merge(data, data3, on=['timestamp'], how='left')
data = pandas.merge(data, data4, on=['timestamp'], how='left')
data = pandas.merge(data, data5, on=['timestamp'], how='left')
data = pandas.merge(data, data6, on=['timestamp'], how='left')
data = pandas.merge(data, data7, on=['timestamp'], how='left')
data = pandas.merge(data, data8, on=['timestamp'], how='left')
data = pandas.merge(data, data9, on=['timestamp'], how='left')
data = pandas.merge(data, data10, on=['timestamp'], how='left')
data = pandas.merge(data, data11, on=['timestamp'], how='left')
data = pandas.merge(data, data12, on=['timestamp'], how='left')
data = pandas.merge(data, data13, on=['timestamp'], how='left')
data = pandas.merge(data, data14, on=['timestamp'], how='right')

data = data.dropna()

data = data[['high0',
            'high-1',
            'high-2',
            'high-3',
            'high-4',
            'high-5',
            'high-6',
            'high-7',
            'high-8',
            'high-9',
            'high-10',
            'high-11',
            'high-12',
            'high-13',
            'high-14']]

normalized = (data - data.mean()) / (data.max() - data.min())
normalized = normalized.values

X = normalized[:, 1:]
Y = normalized[:, 0]

seed = int(time.time())
numpy.random.seed(seed)

model.fit(X, Y)

至于结果数据(timeshift=12):

    year0  month0  day0  hour0  high0  timestamp  year-1  month-1  day-1  \
0   2014.0    12.0  28.0    0.0   5.15 2014-12-16  2014.0     12.0   15.0   
1   2014.0    12.0  29.0    0.0   5.72 2014-12-17  2014.0     12.0   16.0   
2   2014.0    12.0  30.0    0.0   5.95 2014-12-18  2014.0     12.0   17.0   
3   2014.0    12.0  31.0    0.0   5.75 2014-12-19  2014.0     12.0   18.0 
    hour-1  high-1  year-2  month-2  day-2  hour-2  high-2  year-3  month-3  \
0      0.0    5.21  2014.0     12.0   14.0     0.0    5.21  2014.0     12.0   
1      0.0    5.50  2014.0     12.0   15.0     0.0    5.21  2014.0     12.0   
2      0.0    5.90  2014.0     12.0   16.0     0.0    5.50  2014.0     12.0   
3      0.0    5.89  2014.0     12.0   17.0     0.0    5.90  2014.0     12.0   
rest according to the same pattern

【问题讨论】:

  • 您能否发布一些用于数据转换以及您正在构建的网络的代码?可能还有一些数据片段等。可能有许多不同的事情需要考虑更改。
  • 我添加了所需的数据。感谢 Chris 抽出宝贵时间。

标签: machine-learning keras time-series


【解决方案1】:
  • 看看你的标准化函数。您需要将“data.mean()”替换为“data.min()”以获得真正的最小-最大比例。此外,我会将数据分解为各个滞后特征之前对其进行缩放。

    normalized = (data - data.min()) / (data.max() - data.min())

  • 从仅 3-4 个滞后变量开始(目前您从 14 个开始)并逐步添加,每次添加都测试性能,以确保提高测试准确性。

  • 如果要设置种子,请使用静态值以提高再现性。否则没有理由设置种子,因为每次运行都会不同。

从那开始,看看这是否会从平坦的输出中改善它。

【讨论】:

  • 我的假设是,生成的预测图应该与实际输出相似,偏移量等于预测步长,对吧?
  • 预测应该与实际输出相似,只有 no 偏移。预测 step 是模型学习考虑的偏移量。示例:时间 10 的 y 值的预测是从时间 1-9 的 y 值生成的,假设窗口长度为 9,偏移量为 1。绘制时间 10 的预测时,应与时间 10 的实际值一致.
  • 但我正在执行以下操作:窗口长度为 14,偏移量为 6...所以应该有 6 天的班次,对吧?
  • 是的,没错,对不起,我不是故意的。
猜你喜欢
  • 2019-04-03
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2019-07-16
  • 2021-02-01
  • 1970-01-01
  • 2019-06-16
相关资源
最近更新 更多