Используя nnet для предсказания, я делаю это правильно? - PullRequest
18 голосов
/ 12 октября 2011

Я все еще довольно новичок в методах R и AI / ML . Я хотел бы использовать нейронную сеть для прогнозирования, и, поскольку я новичок, я просто хотел бы посмотреть, так ли это должно быть сделано.

В качестве теста я прогнозирую значения sin() на основе 2 предыдущих значений. Для обучения я создаю фрейм данных с y = sin(x), x1 = sin(x-1), x2 = sin(x-2), затем использую формулу y ~ x1 + x2.

Кажется, это работает, но мне просто интересно, если это правильный способ сделать это, или есть более идиоматический способ.

Это код:

require(quantmod) #for Lag()
requre(nnet)
x <- seq(0, 20, 0.1)
y <- sin(x)
te <- data.frame(y, Lag(y), Lag(y,2))
names(te) <- c("y", "x1", "x2")
p <- nnet(y ~ x1 + x2, data=te, linout=TRUE, size=10)
ps <- predict(p, x1=y)
plot(y, type="l")
lines(ps, col=2)

Спасибо

[править]

Это лучше для предсказанного вызова?

t2 <- data.frame(sin(x), Lag(sin(x)))
names(t2) <- c("x1", "x2")
vv <- predict(p, t2)
plot(vv)

Полагаю, мне бы хотелось увидеть, что nnet на самом деле работает, посмотрев на его предсказания (которые должны приближаться к синусоиде).

1 Ответ

46 голосов
/ 17 октября 2011

Мне очень нравится пакет caret, так как он обеспечивает приятный унифицированный интерфейс для различных моделей, таких как nnet. Кроме того, он автоматически настраивает гиперпараметры (такие как size и decay), используя перекрестную проверку или повторную выборку при начальной загрузке. Недостатком является то, что вся эта повторная выборка занимает некоторое время.

#Load Packages
require(quantmod) #for Lag()
require(nnet)
require(caret)

#Make toy dataset
y <- sin(seq(0, 20, 0.1))
te <- data.frame(y, x1=Lag(y), x2=Lag(y,2))
names(te) <- c("y", "x1", "x2")

#Fit model
model <- train(y ~ x1 + x2, te, method='nnet', linout=TRUE, trace = FALSE,
                #Grid of tuning parameters to try:
                tuneGrid=expand.grid(.size=c(1,5,10),.decay=c(0,0.001,0.1))) 
ps <- predict(model, te)

#Examine results
model
plot(y)
lines(ps, col=2)

Он также прогнозирует в правильном масштабе, так что вы можете напрямую сравнить результаты. Если вы заинтересованы в нейронных сетях, вам также следует ознакомиться с пакетами neuralnet и RSNNS. caret в настоящее время может настраивать модели nnet и neuralnet, но пока не имеет интерфейса для RSNNS.

/ edit: caret теперь имеет интерфейс для RSNNS. Оказывается, если вы напишите сопровождающему пакета и попросите добавить модель к caret, он обычно сделает это!

/ edit: caret также теперь поддерживает байесовскую регуляризацию для нейронных сетей с прямой связью из пакета brnn . Кроме того, с помощью caret теперь намного проще указать свои собственные пользовательские модели для взаимодействия с любым пакетом нейронной сети, который вам нравится!

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