4

Я использую периодические нейронные сети (РНН) для прогнозирования, но по какой-то странной причине, он всегда выводит 1. Здесь я объяснить это с игрушкой, например, как:Почему РНН всегда выводится 1

Пример Рассмотрим матрицу M размеров (360, 5) и вектор Y, который содержит ряды M. Теперь, используя RNN, я хочу предсказать Y от M. Использование rnnR пакет, я тренировалась модель как

library(rnn) 
    M <- matrix(c(1:1800),ncol=5,byrow = TRUE) # Matrix (say features) 
    Y <- apply(M,1,sum) # Output equls to row sum of M 
    mt <- array(c(M),dim=c(NROW(M),1,NCOL(M))) # matrix formatting as [samples, timesteps, features] 
    yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) # formatting 
    model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=1000) # training 

Одна странная вещь, которую я наблюдал во время тренировки в том, что ошибка эпохи всегда 4501. В идеале, ошибка эпоха должна уменьшаться с увеличением эпох.

Далее я создал тестовый набор данных с такой же структурой, как описано выше, один, как:

M2 <- matrix(c(1:15),nrow=3,byrow = TRUE) 
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2))) 
predictr(model,mt2) 

с предсказанием, я всегда получаю результат, как 1. Что может быть причиной постоянной ошибки эпохи и тот же выход?

UPDATE # 1

Ответ предоставляется @Barker не работает на моей проблеме. Чтобы открыть его, здесь я разделяю минималистические данные с помощью ссылок на ссылки: traindata, testadata и мой код R.

Детали данных: колонка «власть» является переменной ответ, который является функцией температуры, влажности, а мощность, потребляемая в предыдущие дни от день1 в день 14.

normalize_data <- function(x){ 
    normalized = (x-min(x))/(max(x)-min(x)) 
    return(normalized) 
} 

#read test and train data 
traindat <- read.csv(file = "train.csv") 
testdat <- read.csv(file = "test.csv") 
# column "power" is response variable and remaining are predictors 
# predictors in traindata 
trainX <- traindat[,1:dim(traindat)[2]-1] 
# response of train data 
trainY <- traindat$power 
# arrange data acc. to RNN as [samples,time steps, features] 
tx <- array(as.matrix(trainX), dim=c(NROW(trainX), 1, NCOL(trainX))) 
tx <- normalize_data(tx) # normalize data in range of [0,1] 
ty <- array(trainY, dim=c(NROW(trainY), 1, NCOL(trainY))) # arrange response acc. to predictors 
# train model 
model <- trainr(X = tx, Y = ty, learningrate = 0.08, hidden_dim = 6, numepochs = 400) 

# predictors in test data 
testX <- testdat[,1:dim(testdat)[2]-1] 
testX <- normalize_data(testX) # normalize data in range of [0,1] 
#testY <- testdat$power 
# arrange data acc. to RNN as [samples,time steps, features] 
tx2 <- array(as.matrix(testX), dim=c(NROW(testX), 1, NCOL(testX))) # predict 
pred <- predictr(model,tx2) 
pred 

Я варьируемых параметров learning rate, hidden_dim, numepochs, но до сих пор его либо приводит к 0,9 или 1.

+0

Простейшая причина в том, что ваша скорость обучения слишком высока или что модель просто не соответствует данным. –

+0

Я нахожу ваши данные проблематичными. Во-первых, данные слишком малы для отладки. Даже линейная модель может справиться с набором учебных данных с 16 столбцами и 37 строками, но с нейронной сетью? Забудь об этом. Ваши данные, похоже, не в порядке, так как ваши задержки для каждой строки будут такими же, как и предыдущие строки, просто сдвинуты на один столбец. RNN нужны данные в порядке. Наконец, почему вы используете лаги как функции в любом случае? Весь смысл RNN - это «память», который заставляет вспомнить предыдущие данные. Если вы кормили прежние значения в любом случае, вы сделали вашу сеть более сложной ни для чего. – Barker

+0

@ Баркер, я получил вашу мысль! Но я по-прежнему сталкиваюсь с проблемами моделирования временных рядов в соответствии с требованиями. к входу RNN, я задал тот же вопрос по адресу http://stackoverflow.com/q/42431720/3317829 –

ответ

2

Большинство RNN не любят данные, которые не имеют постоянного значения. Одна из стратегий борьбы с этим - это различие данных. Чтобы увидеть, как это работает, давайте работать с базой R временными рядами co2. Это временный ряд с приятной гладкой сезонностью и трендом, поэтому мы должны иметь возможность прогнозировать его.

co2 time series

Для нашей модели нашего вклада матрицы собирается быть «сезонность» и «тренд» из co2 временных рядов, созданные с использованием разложения stl. Поэтому давайте сделаем наши данные по обучению и тестированию, как вы это делали раньше, и обучите модель (обратите внимание, что я сократил numepochs для выполнения). Я буду использовать все данные до последнего полтора года на подготовку, а затем использовать в прошлом году, и половина для тестирования:

#Create the STL decomposition 
sdcomp <- stl(co2, s.window = 7)$time.series[,1:2] 

Y <- window(co2, end = c(1996, 6)) 
M <- window(sdcomp, end = c(1996, 6)) 
#Taken from OP's code 
mt <- array(c(M),dim=c(NROW(M),1,NCOL(M))) 
yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) 
model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=100) 

Теперь мы можем создать наши прогнозы на последний год тестирования данных:

M2 <- window(sdcomp, start = c(1996,7)) 
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2))) 
predictr(model,mt2) 

output: 
     [,1] 
[1,] 1 
[2,] 1 
[3,] 1 
[4,] 1 
[5,] 1 
[6,] 1 
[7,] 1 
[8,] 1 
[9,] 1 
[10,] 1 
[11,] 1 
[12,] 1 
[13,] 1 
[14,] 1 
[15,] 1 
[16,] 1 
[17,] 1 
[18,] 1 

Ewe, все это снова, как и в вашем примере. Теперь попробуем еще раз, но на этот раз мы будем разграничивать данные. Поскольку мы пытаемся сделать наши прогнозы полтора года назад, мы будем использовать 18 в качестве нашего разностного запаздывания, поскольку те ценности, которые мы знали бы на 18 месяцев раньше времени.

dco2 <- diff(co2, 18) 
sdcomp <- stl(dco2, s.window = "periodic")$time.series[,1:2] 
plot(dco2) 

differenced c02 values

Великий, тенденция в настоящее время нет поэтому наша нейронная сеть должна быть в состоянии найти шаблон лучше. Повторим попытку с новыми данными.

Y <- window(dco2, end = c(1996, 6)) 
M <- window(sdcomp, end = c(1996, 6)) 

mt <- array(c(M),dim=c(NROW(M),1,NCOL(M))) 
yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) 
model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=100) 

M2 <- window(sdcomp, start = c(1996,7)) 
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2))) 
(preds <- predictr(model,mt2)) 

output: 
       [,1] 
[1,] 9.999408e-01 
[2,] 9.478496e-01 
[3,] 6.101828e-08 
[4,] 2.615463e-08 
[5,] 3.144719e-08 
[6,] 1.668084e-06 
[7,] 9.972314e-01 
[8,] 9.999901e-01 
[9,] 9.999916e-01 
[10,] 9.999916e-01 
[11,] 9.999916e-01 
[12,] 9.999915e-01 
[13,] 9.999646e-01 
[14,] 1.299846e-02 
[15,] 3.114577e-08 
[16,] 2.432247e-08 
[17,] 2.586075e-08 
[18,] 1.101596e-07 

Хорошо, теперь есть что-то! Давайте посмотрим, как он сравнивает с тем, что было пытались спрогнозировать, dco2:

Overlay of plots

Не идеально, но мы, но это найти общий «вверх вниз» образец данных. Теперь все, что вам нужно сделать, это возиться со скоростью обучения и начать оптимизацию со всеми этими прекрасными гиперпараметрами, которые делают работу с нейронными сетями такой радостью. Когда он работает так, как вы хотите, вы можете просто взять свой окончательный результат и добавить обратно в течение последних 18 месяцев ваших данных обучения.

+0

Спасибо, он работает над этой проблемой, но он не работает над моей проблемой. Будем очень благодарны, если вы сможете просмотреть обновленный вопрос и найти, где я ошибаюсь. –

0

Из моего обзора примеров с пакетом (см. ?trainr) входы в функцию обучения должны быть двоичными. В пакете есть функции int2bin и bin2int.

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

Смежные вопросы