У меня проблема с LSTM-сетями в Keras / Tensorflow, которая сбивает меня с толку, вероятно, из-за моих ограниченных знаний. Я пытаюсь сделать прогноз временных рядов и внимательно слежу за учебником по номеру https://www.r-bloggers.com/lstm-with-keras-tensorflow/, но со своими собственными данными. По какой-то причине я не могу предсказать новые значения, которые появятся после моего предварительно определенного набора тестов в хорошем качестве.
Это мои необработанные данные:
myts<-structure(list(index = 1:134, price = c(713655, 620882, 534423,
301212, 275206, 236982, 191321, 149769, 324011, 481569, 463714,
510889, 569519, 690535, 520049, 320149, 347690, 229641, 183152,
228005, 487889, 476487, 417786, 594872, 536477, 557535, 549195,
334525, 260100, 223233, 243597, 214327, 311121, 482158, 494918,
632172, 541249, 654774, 536593, 354443, 282714, 245026, 232637,
189300, 349136, 517210, 414459, 509904, 547189, 627898, 533068,
349600, 252529, 194692, 155137, 139654, 308015, 381730, 310255,
423232, 361262, 374629, 368167, 246905, 200175, 170869, 148086,
143913, 268351, 335569, 295319, 384937, 363872, 493699, 388613,
241881, 180627, 151719, 115126, 108879, 247074, 314382, 221703,
286724, 307349, 340225, 314616, 186348, 146997, 112888, 108379,
104672, 142896, 253393, 239154, 302409, 307254, 271735, 200217,
128681, 116230, 72325, 80034, 84925, 164486, 166280, 165264,
200221, 193023, 227763, 214221, 97091, 78585, 62376, 65722, 54432,
116195, 147662, 155628, 190662, 198070, 200930, 161195, 113739,
88345, 56547, 60988, 57107, 110908, 134138, 139983, 169545, 164385,
156990)), class = "data.frame", row.names = c(NA, -134L))
Это мой код для создания LSTM-сеть в керасе / тензорном потоке, которая, кажется, тренируется довольно хорошо (может быть настроена позже, но это не самая актуальная проблема на данный момент)
library(keras)
## Scaling
msd.price = c(mean=mean(myts$price), sd=sd(myts$price))
myts$price = (myts$price - msd.price[1])/msd.price[2]
lags<-10
batch_size <- 1
train<-myts[1:100,] #Trainset
test<-myts[100:nrow(myts),] #Testset
## Preparation for LSTM-Network
x.train<-array(data=lag(train$price,lags),dim=c(nrow(train),lags,2))
y.train<-array(data=train$price,dim=c(nrow(train),1))
x.test<-array(data=lag(test$price,lags),dim=c(nrow(test),lags,2))
y.test<-array(data=test$price,dim=c(nrow(test),1))
## Network setup & training
model <- keras_model_sequential()
model %>%
layer_lstm(units = 30,
input_shape = c(lags, 2),
batch_size = batch_size,
return_sequences = TRUE,
stateful = TRUE) %>%
layer_dropout(rate = 0.2) %>%
layer_lstm(units = 15,
return_sequences = FALSE,
stateful = TRUE) %>%
layer_dropout(rate = 0.2) %>%
layer_dense(units = 1)
model %>%
compile(loss = 'mae', optimizer = 'adam')
for(i in 1:30){
model %>% fit(x = x.train,
y = y.train,
batch_size = batch_size,
epochs = 1,
verbose = 1,
shuffle = FALSE)
model %>% reset_states()
print(paste("i is:",i))
}
Теперь наступает «интересная» часть - я предсказание набора тестов, что «подозрительно» хорошо:
pred_out <- model %>% predict(x.test,batch_size=batch_size)
plot(pred_out,type="l",ylim=c(min(y.test),max(y.test)),col="blue")
lines(y.test,col="red")
Но здесь я уже знаю «реальные значения», потому что я, конечно, разделил его раньше. Как я могу на самом деле предсказать значения, которые я не знаю заранее? Я попытался предсказать тот же период снова, как если бы я не знал заранее: моя наивная идея состояла в том, чтобы предсказать одно новое значение набора тестов (из последнего значения моего набора поездов) и затем присоединить его к концу моего теста -set (при удалении его первого значения, чтобы его длина оставалась постоянной), а затем пошагово предсказать его в al oop, но это приводит к очень неудовлетворительным / неправдоподобным значениям. Почему тестовый набор работает так хорошо, а «настоящие» неизвестные так плохи? Мой код:
n<-nrow(train)
new_try<-train$price[n] # last known value of trainset (scaled)
steps<-35
res<-rep(NA,steps) # memory preallocation
for(k in 1:steps){
new_try_x<-array(data = lag(new_try,lags),dim=c(1,lags,2))
erg<-model %>% predict(new_try_x,batch_size=batch_size)
res[k]<-as.numeric(erg)
}
plot(c(train$price,test$price),type="l",ylab="Price") # real dataset
lines(101:135,res,col="blue") # prediction of the last 35 steps
Как правильно сделать "правильный" прогноз неизвестных значений? Что я делаю не так?