如何在nnet中使用size和decay

9

我对神经网络的世界还很陌生,所以请您谅解。我正在生成一些测试数据,因此我有一个关于参数 sizedecay 的问题。我使用 caret 包和方法 nnet。以下是示例数据集:

require(mlbench)
require(caret)
require (nnet)

data(Sonar)
mydata=Sonar[,1:12] 

set.seed(54878)
ctrl = trainControl(method="cv", number=10,returnResamp = "all")
for_train= createDataPartition(mydata$V12, p=.70, list=FALSE) 
my_train=mydata[for_train,]
my_test=mydata[-for_train,] 

t.grid=expand.grid(size=5,decay=0.2)
mymodel = train(V12~ .,data=my_train,method="nnet",metric="Rsquared",trControl=ctrl,tuneGrid=t.grid) 

那么,我有两个问题。首先,使用caret方法是最好的使用nnet方法的方式吗?其次,我已经了解了大小和衰减(例如:在R中nnet函数的衰减参数的目的?),但我不知道如何在这里实际使用它们。 有人能帮忙吗?

1个回答

17

简要介绍Caret

Caret包可以让您使用交叉验证(Hold-Out或K-fold)或Bootstrap来训练不同的模型并调整超参数。

使用Caret调整超参数有两种不同的方法:网格搜索和随机搜索。如果使用网格搜索(暴力搜索),则需要根据先前的知识为每个参数定义网格,或者您可以固定某些参数并迭代剩余的参数。如果使用随机搜索,则需要指定调整长度(迭代的最大次数),直到达到停止条件,Caret将使用超参数的随机值。

无论选择何种方法,Caret都会使用每个超参数组合来训练模型并计算性能指标,具体如下:

  1. 将初始训练样本分成两个不同的集合:训练集和验证集(对于bootstrap或交叉验证)以及k个集合(对于k-fold交叉验证)。

  2. 使用训练集训练模型,并在验证集上进行预测(用于Cross Validation Hold-Out和Bootstrap)。或者使用k-1个训练集进行训练,并使用第k个训练集进行预测(用于K-fold Cross Validation)。

  3. Caret在验证集上计算一些性能指标,如ROC、准确度等。

  4. 一旦Grid Search完成或Tune Length完成,Caret使用性能指标根据先前定义的条件选择最佳模型(您可以使用ROC、准确度、灵敏度、RSquared、RMSE等)

  5. 您可以创建一些图形来理解重新采样配置文件并选择最佳模型(请记住性能和复杂性)。

如果需要更多关于Caret的信息,请查看Caret网页

使用Caret训练神经网络的过程

当使用Caret训练神经网络(nnet)时,您需要指定两个超参数:sizedecay。Size是隐藏层中单元的数量(nnet适合单隐藏层神经网络),而decay是正则化参数,用于避免过拟合。请注意,对于每个R包,超参数的名称可能会有所不同。

以下是使用Caret进行分类训练神经网络的示例:

fitControl <- trainControl(method = "repeatedcv", 
                           number = 10, 
                           repeats = 5, 
                           classProbs = TRUE, 
                           summaryFunction = twoClassSummary)

nnetGrid <-  expand.grid(size = seq(from = 1, to = 10, by = 1),
                        decay = seq(from = 0.1, to = 0.5, by = 0.1))

nnetFit <- train(Label ~ ., 
                 data = Training[, ],
                 method = "nnet",
                 metric = "ROC",
                 trControl = fitControl,
                 tuneGrid = nnetGrid,
                 verbose = FALSE)

最后,您可以绘制一些图表来理解重采样结果。下面的图表是从GBM训练过程中生成的。

使用Caret进行GBM训练过程


2
我会尝试类似这样的代码:nnet_grid <- expand.grid(.decay = c(0.5, 0.1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7), .size = c(3, 5, 10, 20)),然后可以根据结果尝试其他参数。在0.1到0.5之间选择decay的范围相当小。 - marbel
1
Marbel,这是一个非常小的参数空间。代码只是一个使用caret训练神经网络的简单示例,而不是超参数调整的详细修订。 - Jorge Quintana
1
你可以随时编辑你的回答,但我认为最好将其作为评论留下,以供其他人参考。在我看来,了解应该做什么和不应该做什么是很好的。 - marbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接