r - div - tags$style shiny
Usando nnet para la predicción, ¿lo estoy haciendo bien? (1)
Todavía soy bastante nuevo en las técnicas R y AI / ML . Me gustaría usar una red neuronal para la predicción, y como soy nuevo, me gustaría ver si así es como debería hacerse.
Como caso de prueba, estoy prediciendo los valores de sin()
, en base a 2 valores anteriores. Para el entrenamiento, creo un marco de datos con y = sin(x)
, x1 = sin(x-1)
, x2 = sin(x-2)
, luego uso la fórmula y ~ x1 + x2
.
Parece funcionar, pero me pregunto si esta es la forma correcta de hacerlo o si existe una forma más idiomática.
Este es el código:
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)
Gracias
[editar]
¿Es esto mejor para la llamada de predicción?
t2 <- data.frame(sin(x), Lag(sin(x)))
names(t2) <- c("x1", "x2")
vv <- predict(p, t2)
plot(vv)
Supongo que me gustaría ver que la red realmente está funcionando al observar sus predicciones (que deberían aproximarse a una onda de pecado).
Realmente me gusta el paquete caret
, ya que proporciona una interfaz agradable y unificada para una variedad de modelos, como nnet
. Además, sintoniza automáticamente los parámetros de hiperparámetros (como el size
y la decay
) mediante la validación cruzada o el nuevo muestreo de bootstrap. El inconveniente es que todo este remuestreo toma algún tiempo.
#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)
También predice en la escala adecuada, por lo que puede comparar directamente los resultados. Si está interesado en redes neuronales, también debería echar un vistazo a los paquetes neuralnet
y RSNNS
. Actualmente, caret
puede sintonizar los modelos nnet
y neuralnet
, pero aún no tiene una interfaz para RSNNS
.
/ edit: caret
ahora tiene una interfaz para RSNNS
. Resulta que si envía un correo electrónico al encargado del paquete y solicita que se agregue un modelo a caret
, ¡generalmente lo hará!
/ edit: caret
también es compatible ahora con la regularización bayesiana para redes neuronales de brnn paquete brnn . Además, ahora también es mucho más fácil especificar sus propios modelos personalizados , para interactuar con cualquier paquete de red neuronal que desee.