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.