如何在 R 中训练和验证神经网络模型?

机器算法验证 r 神经网络
2022-02-11 23:24:36

我是使用神经网络建模的新手,但我设法建立了一个包含所有可用数据点的神经网络,这些数据点非常适合观察到的数据。神经网络是在 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% 的数据点进行验证。我该怎么做呢?我必须使用哪些功能?

我使用 caret 包中的 train 函数来计算大小和衰减的参数。

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)

非常感谢任何直接帮助或与其他网站/帖子的链接。

1个回答

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

我认为验证阶段发生在 caret train() 调用中,因为它通过引导或您可以通过 trControl 参数指定的其他方法来选择衰减和大小的超参数。我将用于表征最终选择的模型的误差的数据集称为我的测试集。由于插入符号为您处理超参数的选择,您只需要一个训练集和一个测试集。

您可以使用插入符号中的 createDataPartition() 函数将数据集拆分为训练集和测试集。我使用 car package 中的 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 作为预测值。

然后,您可以使用测试数据集对 fit 对象调用 predict 并根据结果计算 RMSE:

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