Como treinar e validar um modelo de rede neural em R?

33

Eu sou novo na modelagem com redes neurais, mas consegui estabelecer uma rede neural com todos os pontos de dados disponíveis que se ajustam bem aos dados observados. A rede neural foi feita em R com o pacote 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      

Os dados que estou analisando têm a seguinte aparência, onde o DOC é a variável que deve ser modelada (existem cerca de 17.000 observações):

      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

Agora, li que o modelo deve ser treinado com 70% dos pontos de dados e validado com os 30% restantes. Como eu faço isso? Quais funções eu tenho que usar?

Usei a função de trem do pacote de interpolação para calcular os parâmetros de tamanho e decaimento.

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)

Qualquer ajuda direta ou ligação a outros sites / postagens é muito apreciada.

Strohmi
fonte
6
Na verdade, a metodologia de divisão de trem / teste é inferior, uma vez que o desempenho do seu algoritmo pode variar bastante com base na sua escolha do ponto de divisão (vi diferenças de 5% ...). Uma metodologia melhor é a validação cruzada.
31412 John Doucette

Respostas:

36

O manual de intercalação de Max Kuhn - Model Building é um excelente ponto de partida.

Eu pensaria no estágio de validação como ocorrendo na chamada de sinal de intercalação (), já que ele escolhe seus hiperparâmetros de decaimento e tamanho via bootstrapping ou alguma outra abordagem que você pode especificar através do parâmetro trControl. Chamo o conjunto de dados que utilizo para caracterizar o erro do modelo final escolhido como meu conjunto de testes. Como o sinal de intercalação lida com a seleção de hiperparâmetros para você, você só precisa de um conjunto de treinamento e um conjunto de teste.

Você pode usar a função createDataPartition () no sinal de intercalação para dividir seu conjunto de dados em conjuntos de treinamento e teste. Testei isso usando o conjunto de dados Prestige do pacote car, que contém informações sobre a renda relacionadas ao nível de escolaridade e prestígio ocupacional:

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

A função createDataPartition () parece um pouco errada porque não cria a partição para você, mas fornece um vetor de índices que você pode usar para construir conjuntos de treinamento e teste. É muito fácil fazer isso sozinho no R usando sample (), mas uma coisa que createDataPartition () aparentemente faz é fazer a amostra dentro dos níveis dos fatores. Além disso, se seu resultado for categórico, a distribuição será mantida entre as partições de dados. No entanto, não é relevante neste caso, pois seu resultado é contínuo.

Agora você pode treinar seu modelo no conjunto de treinamento:

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)    

Além disso: tive que adicionar o parâmetro linout para que a nnet trabalhasse com um problema de regressão (vs. classificação). Caso contrário, obtive todos os 1s como valores previstos no modelo.

É possível chamar a previsão no objeto de ajuste usando o conjunto de dados de teste e calcular o RMSE a partir dos resultados:

prestige.predict <- predict(prestige.fit, newdata = prestige.test)
prestige.rmse <- sqrt(mean((prestige.predict - prestige.test$income)^2)) 
Anne Z.
fonte
seu link Max Kuhn parece ter morrido.
EngrStudent - Restabelece Monica
Eu encontrei o livro de Max Kuhn, ele está escondido aqui: feat.engineering
Agile Feijão