[英]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 時間步長,但沒有什么是你做不到的。
(samples, timesteps, channels)
- 或等效地, (sequences, timesteps, features)
Conv1D
和/或Conv1D
- 例如GRU, LSTM
。 每個都可以處理可變的時間步長channels
維度(dim 2)饋送它們。 但永遠不要沿時間序列維度串聯,因為它意味着不存在的因果連續性。strides > 1
進行降維,然后將它們的輸出提供給 RNN。CuDNNLSTM
或CuDNNGRU
,因為它們快 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.