簡體   English   中英

使用多個樣本時,如何使用 Keras 進行多變量時間序列預測

[英]How to use Multivariate time-series prediction with Keras, when multiple samples are used

正如標題所述,我正在做多元時間序列預測。 我對這種情況有一些經驗,並且能夠在 TF Keras 中成功設置和訓練一個工作模型。

但是,我不知道處理多個不相關的時間序列樣本的“正確”方法。 我有大約 8000 個獨特的樣本“塊”,每個樣本有 800 個時間步到 30,000 個時間步。 當然,我無法將它們全部連接成一個時間序列,因為樣本 2 的第一個點與樣本 1 的最后一個點在時間上不相關。

因此,我的解決方案是將每個樣本單獨放入一個循環中(效率極低)。

我的新想法是可以/我是否應該用空的時間步長填充每個樣本的開始= RNN 的回顧量,然后將填充的樣本連接成一個時間序列? 這意味着第一個時間步將有一個主要為 0 的回溯數據,這聽起來像是針對我的問題的另一個“黑客”,而不是正確的方法。

主要挑戰是 800 對 30,000 時間步長,但沒有什么是你做不到的。

  • 模型設計:將序列分組為塊——例如,800 到 900 時間步長的 30 個序列,填充,然后 900 到 1000 的 60 個序列等等——不必是連續的(即下一個可以是 1200-到-1500)
  • 輸入形狀:( (samples, timesteps, channels) - 或等效地, (sequences, timesteps, features)
  • Conv1D和/或Conv1D - 例如GRU, LSTM 每個都可以處理可變的時間步長
  • 串聯不要這樣做 如果您的每個序列都是獨立的,那么每個序列都必須沿 Keras 中的第 0 維 -批次樣本維度提供。 如果它們是相關的,例如多元時間序列,就像信號中的許多通道一樣 - 然后沿着channels維度(dim 2)饋送它們。 但永遠不要沿時間序列維度串聯,因為它意味着不存在的因果連續性。
  • 有狀態的 RNN :可以幫助處理長序列 - 有關它們如何在這里工作的信息
  • RNN 能力:對於長序列是有限的,即使對於 LSTM,800 也已經處於危險區域; 我建議通過自動編碼器或 CNN 在輸入處使用strides > 1進行降維,然后將它們的輸出提供給 RNN。
  • RNN 訓練:很難。 訓練時間長、超參數敏感性、梯度消失——但是,通過適當的正則化,它們可以很強大。 更多信息在這里
  • 零填充:之前/之后/兩者- 有爭議,可以閱讀它,但可能要遠離“兩者”,因為在一個地方學習忽略填充更容易; 我個人使用“之前”
  • RNN 變體:盡可能使用CuDNNLSTMCuDNNGRU ,因為它們快 10 倍

注意:上面的“樣本”在機器學習中是指獨立的示例/觀察,而不是測量的信號數據點(稱為timesteps )。


以下是適合時間序列的模型的最小代碼:

from tensorflow.keras.layers import Input, Conv1D, LSTM, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
import numpy as np

def make_data(batch_shape):  # dummy data
    return (np.random.randn(*batch_shape),
            np.random.randint(0, 2, (batch_shape[0], 1)))

def make_model(batch_shape):  # example model
    ipt = Input(batch_shape=batch_shape)
    x   = Conv1D(filters=16, kernel_size=10, strides=2, padding='valid')(ipt)
    x   = LSTM(units=16)(x)
    out = Dense(1, activation='sigmoid')(x)  # assuming binary classification

    model = Model(ipt, out)
    model.compile(Adam(lr=1e-3), 'binary_crossentropy')
    return model

batch_shape = (32, 100, 16)  # 32 samples, 100 timesteps, 16 channels
x, y  = make_data(batch_shape)
model = make_model(batch_shape)

model.train_on_batch(x, y)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM