Kerasメモ(時系列データの学習サンプル生成)
イエナ天候データセットから学習用の入力データを生成する部分のメモ。
このデータセットは、10分ごとに、気温や気圧といった14種類の数値を記録したものになる。
(1時間で6サンプル、1日で144サンプル集まる)
1時間おき(step=6)に、10日分(lookback=1440)の学習データを生成する場合、以下のようにgeneratorを指定する。
ここで、1時間おきにとしているのは、ある時点(t)の数値と、10分後(t+1)の数値が、ほぼ似通っていることによる。
10日分で240個(=1440 / 6)の時系列データが得られる。
train_gen <- generator( data, lookback = 1440, # observations will go back 10 days delay = 144, # targets will be 24 hours in the future min_index = 1, max_index = 10000, shuffle = FALSE, step = 6, # observations will be sampled at one data point per hour batch_size = 128 )
コード全体
元データのままでは確認しにくいので、検証用のデータを作成する。
データ数(行数)は1万、1列目は1から、2列目は10001から1刻みで増加。
data <- data.matrix(cbind(seq(1, 10000, 1), seq(10001, 20000, 1)))
> dim(data) [1] 10000 2 > data [,1] [,2] [1,] 1 10001 [2,] 2 10002 [3,] 3 10003 [4,] 4 10004 [5,] 5 10005 ... [9996,] 9996 19996 [9997,] 9997 19997 [9998,] 9998 19998 [9999,] 9999 19999 [10000,] 10000 20000
1回目のgenerator実行により得られた出力。
samples(入力サンプル)
テンソルの形状は、(batch_size, timesteps, input_features)=(128, 240, 2)
, , 1 [,1] [,2] [,3] ... [,238] [,239] [,240] [1,] 1 7 13 ... 1427 1433 1440 [2,] 2 8 14 ... 1428 1434 1441 [3,] 3 9 15 ... 1429 1435 1442 ... ... [126,] 126 132 138 ... 1552 1558 1565 [127,] 127 133 139 ... 1553 1559 1566 [128,] 128 134 140 ... 1554 1560 1567 , , 2 [,1] [,2] [,3] ... [,238] [,239] [,240] [1,] 10001 10007 10013 ... 11427 11433 11440 [2,] 10002 10008 10014 ... 11428 11434 11441 [3,] 10003 10009 10015 ... 11429 11435 11442 ... ... [126,] 10126 10132 10138 ... 11552 11558 11565 [127,] 10127 10133 10139 ... 11553 11559 11566 [128,] 10128 10134 10140 ... 11554 11560 11567
239列目と240列目の差分が「6」(=step)ではなく、「7」になっているのは、seq関数出力の小数点以下を切り捨てていることによる。
> seq(1, 1440, length.out=240) [1] 1.000000 7.020921 13.041841 19.062762 25.083682 31.104603 ... [235] 1409.895397 1415.916318 1421.937238 1427.958159 1433.979079 1440.000000
targets(ラベル)
テンソルの形状は、(batch_size, output_features)=(128, 1)
144サンプル後(=1日後)の2列目の値が該当する。
[1] 11585 [2] 11586 [3] 11587 ... [126] 11710 [127] 11711 [128] 11712
ここでは、1日と10分(=144+1)後の値になっているので、以下のコードを
targets[[j]] <- data[rows[[j]] + delay, 2]
下記のとおり修正すればよい。
targets[[j]] <- data[rows[[j]] + delay - 1, 2]
"shuffle = TRUE"にしてgeneratorを実行した場合の出力は以下のとおり。
samples(入力サンプル)
, , 1 [,1] [,2] [,3] ... [,238] [,239] [,240] [1,] 2404 2410 2416 ... 3830 3836 3843 [2,] 5336 5342 5348 ... 6762 6768 6775 [3,] 2132 2138 2144 ... 3558 3564 3571 ... ... [126,] 3071 3077 3083 ... 4497 4503 4510 [127,] 1617 1623 1629 ... 3043 3049 3056 [128,] 1432 1438 1444 ... 2858 2864 2871 , , 2 [,1] [,2] [,3] ... [,238] [,239] [,240] [1,] 12404 12410 12416 ... 13830 13836 13843 [2,] 15336 15342 15348 ... 16762 16768 16775 [3,] 12132 12138 12144 ... 13558 13564 13571 ... ... [126,] 13071 13077 13083 ... 14497 14503 14510 [127,] 11617 11623 11629 ... 13043 13049 13056 [128,] 11432 11438 11444 ... 12858 12864 12871
targets(ラベル)
[1] 13988 [2] 16920 [3] 13716 ... [126] 14655 [127] 13201 [128] 13016
開始位置となるindexをシャッフルしているのであり、時系列データは保たれる。
shuffle = TRUE
rows <- sample(c((min_index+lookback):max_index), size = batch_size)
shuffle = FALSE
rows <- c(i:min(i+batch_size-1, max_index))