keras 为什么我的Tensorflow LSTM Timeseries模型只向未来返回一个值

gupuwyp2  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(192)

我有一个使用LSTM预测时间序列值的tensorflow 模型,它训练得很好,但当我要求它预测一些时间值时,它只给我T+1值,
我怎样才能让它给予我从T+1到T+n的值而不仅仅是T+1。
我想把预测值还给他,让他在一个循环中再次进行分析,例如:

We look back at 20 samples for this example

T±0 = now value
T-k = value k steps into the past (known)
T+n = value n steps into the future (unkown at the start)

--- Algorithm

T+1 = model.predict(data from T-20 to T±0)
T+2 = model.predict(data from T-19 to T+1) #using the previously found T+1 value
T+3 = model.predict(data from T-18 to T+2) #using the previously found T+1 and T+2 values
.
.
.
T+n = model.predict(data from T-(k-n) to T+(n-1)) # using the previously found T+1 .. T+(n-1) values

问题是,T+1的平均绝对误差约为0.75%,误差是否会通过预测传播/复合?如果是,则意味着如果我要求程序预测T+10,其平均绝对误差将为0.75%^10 = ~ 7.7%,这在我的情况下不是很好。因此,我正在寻找其他方法来预测多达T+n个值。
我看过几个youtube教程,但每次似乎他们对 model.predict(X) 的调用都已经返回了多个值,我不知道我可能错过了哪些参数。
编码:
第一个
如果没有办法防止误差传播,您有什么技巧可以减少模型的误差吗?
先谢谢你。

dy1byipe

dy1byipe1#

您可以让LSTM返回完整的序列,而不仅仅是最后一个输出,如下所示:

model = tfkr.models.Sequential()
    model.add(tfkr.layers.InputLayer(input_shape=(window_size, 10)))
    model.add(tfkr.layers.LSTM(64, return_sequences=True))
    model.add(tfkr.layers.Dense(8, 'relu'))
    model.add(tfkr.layers.Dense(10, 'linear'))

每个LSTM输出都将经过相同的密集权重(因为我们没有展平)。您的输出将是形状
(None, window_size, 10)
这意味着对于k个输入时间点,您将得到k个输出时间点。
缺点是,第一个输出只能使用第一个输入计算,第二个输出只能使用前两个输入计算,依此类推。因此,我建议使用双向LSTM,并将两个方向结合起来,如下所示:

model = tfkr.models.Sequential()
        model.add(tfkr.layers.InputLayer(input_shape=(window_size, 10)))
        model.add(tfkr.layers.Bidirectional(tfkr.layers.LSTM(64, return_sequences=True), merge_mode='sum')
        model.add(tfkr.layers.Dense(8, 'relu'))
        model.add(tfkr.layers.Dense(10, 'linear'))
roejwanj

roejwanj2#

一种方法是,假设您最初对模型进行了如下训练:

x_train = [
[1, 2, 3, 4, 5, 6, 7],
[2, 3, 4, 5, 6, 7, 8],
]
y_train = [
[8],
[9]
]

培训是使用www.example.com进行model.fit并进行了所有适当的重塑。

model.fit(x_train, y_train)

那么,当你试图预测

ans = model.predict(x_train[0])
ans: 8

但是,假设您希望它也预测下一个值,预期输出为8,然后是9,或者对于***n***个预期输出,您将预期结果为8、9、10、11......等等。
那么我建议用以下方法来处理这个问题:

def predict_continuous(model, input_arr, num_ahead):
    # Your input arr was [1,2,3,4,5,6,7]
    # You want the output to go beyond just 8, lets say 8,9,10,11,...
    # num_ahead: How much into the future you need predictions.
    predictions = []
    model_input = input_arr
    for i in range(num_ahead):
        predictions.append(model.predict(model_input)) # Get the prediction, and subsequent predictions are appended
        # Since the LSTM model is trained for a particular input size, we need to keep dynamically changing the input
        # so we strip off the first value from the input array, and append the latest prediction as its last value.
        model_input = model_input[1:].append(predictions[-1])
    return predictions

现在,这不会直接工作,你将不得不做一些重塑,但核心思想保持不变。

相关问题