Basi c прогнозирование сетей LSTM в кератах / R - PullRequest
0 голосов
/ 17 апреля 2020

У меня проблема с 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

Как правильно сделать "правильный" прогноз неизвестных значений? Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...