如何在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%的数据点进行验证。我该怎么做呢?我必须使用哪些功能?

我使用了插入符号包中的训练函数来计算大小和衰减的参数。

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)

任何直接帮助或与其他网站/帖子的链接都将不胜感激。


6
实际上,训练/测试拆分方法尚不及格,因为算法的性能可能会因您选择的拆分点而有很大差异(我见过5%的差异...)。更好的方法是交叉验证。
约翰·杜塞特

Answers:


36

Max Kuhn的插入符号手册-模型构建是一个很好的起点。

我认为验证阶段发生在插入符号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()函数似乎有点名字错误,因为它不会为您创建分区,而是提供了一个索引向量,您可以将其用于构建训练和测试集。这是很容易做到这一点自己使用样本(),但有一个件事createDataPartition(以R)显然是从因子水平中的作用只是样品。此外,如果您的结果是绝对的,则将在数据分区之间维护分布。但是,在这种情况下这无关紧要,因为您的结果是连续的。

现在,您可以在训练集上训练模型:

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)) 

您的Max Kuhn链接似乎已消失。
EngrStudent-恢复莫妮卡

我找到了马克斯·库恩(Max Kuhn)的书,它藏在这里:feat.engineering
Agile Bean
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.