Как обучить и проверить модель нейронной сети в R?

33

Я новичок в моделировании с нейронными сетями, но мне удалось создать нейронную сеть со всеми доступными точками данных, которая хорошо соответствует наблюдаемым данным. Нейронная сеть была сделана в R с пакетом 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      

Данные, которые я анализирую, выглядят следующим образом, где DOC - это переменная, которую необходимо смоделировать (существует около 17 000 наблюдений):

      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

Теперь я прочитал, что модель должна быть обучена с 70% точек данных и проверена с оставшимися 30% точек данных. Как мне это сделать? Какие функции мне нужно использовать?

Я использовал функцию train из пакета caret для расчета параметров размера и затухания.

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)

Любая прямая помощь или связь с другими сайтами / сообщениями очень ценится.

Strohmi
источник
6
На самом деле, методология разделения поезда / теста не соответствует требованиям, поскольку производительность вашего алгоритма может немного отличаться в зависимости от вашего выбора точки разделения (я видел различия в 5% ...). Лучшая методология - перекрестная проверка.
Джон Дусетт

Ответы:

36

Руководство Карета Макса Куна - Построение модели - отличная отправная точка.

Я бы подумал, что этап проверки происходит в вызове caret train (), так как он выбирает ваши гиперпараметры затухания и размера с помощью начальной загрузки или другого подхода, который вы можете указать с помощью параметра trControl. Я называю набор данных, который я использую для определения ошибки окончательно выбранной модели, своим тестовым набором. Поскольку карета обрабатывает выбор гиперпараметров для вас, вам просто нужен тренировочный набор и тестовый набор.

Вы можете использовать функцию createDataPartition () в каретке, чтобы разделить ваш набор данных на обучающий и тестовый наборы. Я проверил это, используя набор данных Prestige из автомобильного пакета, в котором есть информация о доходах в зависимости от уровня образования и профессионального престижа:

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

Функция createDataPartition () выглядит несколько неправильно, потому что она не создает раздел для вас, а предоставляет вектор индексов, которые вы затем можете использовать для создания обучающих и тестовых наборов. Это довольно легко сделать самостоятельно в R с помощью sample (), но одна вещь, которую, очевидно, делает createDataPartition (), - это выборка из факторных уровней. Более того, если ваш результат категоричен, распределение поддерживается по разделам данных. Однако в данном случае это не актуально, поскольку ваш результат непрерывен.

Теперь вы можете тренировать свою модель на тренировочном наборе:

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)    

Кроме того: мне пришлось добавить параметр linout, чтобы заставить nnet работать с проблемой регрессии (против классификации). В противном случае я получил все 1 как прогнозируемые значения из модели.

Затем вы можете вызвать прогнозирование для подходящего объекта, используя набор тестовых данных, и рассчитать RMSE по результатам:

prestige.predict <- predict(prestige.fit, newdata = prestige.test)
prestige.rmse <- sqrt(mean((prestige.predict - prestige.test$income)^2)) 
Энн З.
источник
Ваша ссылка Макса Куна, кажется, умерла.
EngrStudent - Восстановить Монику
Я нашел книгу Макса Куна, она спрятана здесь: feat.engineering
Agile Bean