Come addestrare e validare un modello di rete neurale in R?


33

Sono nuovo a modellare con le reti neurali, ma sono riuscito a stabilire una rete neurale con tutti i punti di dati disponibili che si adattano bene ai dati osservati. La rete neurale è stata realizzata in R con il pacchetto nnet:

require(nnet)      
##33.8 is the highest value
mynnet.fit <- nnet(DOC/33.80 ~ ., data = MyData, size = 6, decay = 0.1, maxit = 1000)      
mynnet.predict <- predict(mynnet.fit)*33.80  
mean((mynnet.predict - MyData$DOC)^2) ## mean squared error was 16.5      

I dati che sto analizzando sono i seguenti, in cui il DOC è la variabile che deve essere modellata (ci sono circa 17.000 osservazioni):

      Q  GW_level Temp   t_sum   DOC
1 0.045    0.070 12.50     0.2 11.17
2 0.046    0.070 12.61     0.4 11.09
3 0.046    0.068 12.66     2.8 11.16
4 0.047    0.050 12.66     0.4 11.28
5 0.049    0.050 12.55     0.6 11.45
6 0.050    0.048 12.45     0.4 11.48

Ora, ho letto che il modello dovrebbe essere addestrato con il 70% dei punti dati e convalidato con il restante 30% dei punti dati. Come faccio a fare questo? Quali funzioni devo usare?

Ho usato la funzione del treno dal pacchetto del cursore per calcolare i parametri per dimensioni e decadimento.

require(caret)
my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
mynnetfit <- train(DOC/33.80 ~ ., data = MyData, method = "nnet", maxit = 100, tuneGrid = my.grid, trace = f)

Qualsiasi aiuto diretto o collegamento ad altri siti Web / post è molto apprezzato.


6
In realtà, la metodologia di suddivisione treno / test è scadente, poiché le prestazioni del tuo algoritmo possono variare abbastanza in base alla scelta del punto di divisione (ho visto differenze del 5% ...). Una metodologia migliore è la validazione incrociata.
John Doucette,

Risposte:


36

Manuale del caret di Max Kuhn - Costruzione di modelli è un ottimo punto di partenza.

Vorrei pensare alla fase di validazione che si verifica all'interno della chiamata del caret train (), poiché sta scegliendo i tuoi iperparametri di decadimento e dimensione tramite bootstrap o qualche altro approccio che puoi specificare tramite il parametro trControl. Chiamo il set di dati che uso per caratterizzare l'errore del modello scelto finale il mio set di test. Poiché il cursore gestisce la selezione di iperparametri per te, hai solo bisogno di un set di allenamento e un set di test.

È possibile utilizzare la funzione createDataPartition () nel cursore per dividere il set di dati in training e set di test. Ho provato questo usando il set di dati Prestige dal pacchetto auto, che contiene informazioni sul reddito in relazione al livello di istruzione e al prestigio professionale:

library(car)
library(caret)
trainIndex <- createDataPartition(Prestige$income, p=.7, list=F)
prestige.train <- Prestige[trainIndex, ]
prestige.test <- Prestige[-trainIndex, ]

La funzione createDataPartition () sembra un po 'sbagliata perché non crea la partizione per te, ma fornisce piuttosto un vettore di indici che puoi usare per costruire training e set di test. È abbastanza facile farlo da soli in R usando sample () ma una cosa che apparentemente createDataPartition () sembra fare è campionare dai livelli dei fattori. Inoltre, se il risultato è categorico, la distribuzione viene mantenuta tra le partizioni dei dati. Non è rilevante in questo caso, tuttavia, poiché il risultato è continuo.

Ora puoi addestrare il tuo modello sul set di allenamento:

my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
prestige.fit <- train(income ~ prestige + education, data = prestige.train,
    method = "nnet", maxit = 1000, tuneGrid = my.grid, trace = F, linout = 1)    

A parte: ho dovuto aggiungere il parametro linout per far funzionare nnet con un problema di regressione (vs. classificazione). Altrimenti ho ottenuto tutti gli 1 come valori previsti dal modello.

È quindi possibile chiamare predict sull'oggetto fit utilizzando il set di dati di test e calcolare RMSE dai risultati:

prestige.predict <- predict(prestige.fit, newdata = prestige.test)
prestige.rmse <- sqrt(mean((prestige.predict - prestige.test$income)^2)) 

il tuo link Max Kuhn sembra essere morto.
EngrStudent - Ripristina Monica

Ho trovato il libro di Max Kuhn, è nascosto qui: feat.engineering
Agile Bean
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.