软件包 mlp 中的caret方法调用 mlp 中的RSNNS函数。在RSNNS包中,我可以通过设置size参数来在神经网络中设置任意数量的隐藏层,例如

data(iris)

#shuffle the vector
iris <- iris[sample(1:nrow(iris),length(1:nrow(iris))),1:ncol(iris)]

irisValues <- iris[,1:4]
irisTargets <- decodeClassLabels(iris[,5])
#irisTargets <- decodeClassLabels(iris[,5], valTrue=0.9, valFalse=0.1)

iris <- splitForTrainingAndTest(irisValues, irisTargets, ratio=0.15)
iris <- normTrainingAndTestSet(iris)

model <- mlp(iris$inputsTrain, iris$targetsTrain, size=c(5,7), learnFuncParams=c(0.1),
             maxit=50, inputsTest=iris$inputsTest, targetsTest=iris$targetsTest)

将建立一个分别具有5个和7个节点的两个隐藏层的神经网络。我想使用caret包,因为它具有执行参数/模型搜索以及集群并行实现的功能。在caret中,当我查找该方法时,只能使用一个参数size对其进行调整,例如
data(iris)

mlpGrid <- data.frame(.size=3)
model2<-caret::train(Species~. , iris, method='mlp', tuneGrid=mlpGrid)

设置具有3节点单隐藏层的神经网络。

我曾尝试将其他列添加到mlpGrid中,但是caret似乎不允许添加第二个(或更多个)隐藏层。

最佳答案

您应该使用插入符号为“mlp”的插入符号的“mlpML”方法。它确实使用了RSNNS的mlp函数,但是您可以分别定义每个隐藏层的神经元数量。例如,以下代码应该可以完成工作。您可以通过定义图层,每一层(123)以及每层多少个神经元来定义自定义网格。

mlp_grid = expand.grid(layer1 = 10,
                       layer2 = 10,
                       layer3 = 10)

mlp_fit = caret::train(x = train_x,
                y = train_y,
                method = "mlpML",
                preProc =  c('center', 'scale', 'knnImpute', 'pca'),
                trControl = trainControl(method = "cv", verboseIter = TRUE, returnData = FALSE),
                tuneGrid = mlp_grid)

给定verboseIter=TRUE,它表明确实应用了这些值
+ Fold01: layer1=10, layer2=10, layer3=10
+ Fold02: layer1=10, layer2=10, layer3=10
+ Fold03: layer1=10, layer2=10, layer3=10
...

09-06 07:57