caret
包中的mlp
方法调用了RSNNS
包中的mlp
函数。在RSNNS
包中,我可以通过设置size
参数来设置任意数量的隐藏层,例如:
data(iris)#打乱数据集顺序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
似乎不允许添加第二个(或更多)隐藏层。
回答:
你应该使用caret的”mlpML“方法而不是”mlp”。它确实使用了RSNNS中的mlp函数,但你可以单独定义每个隐藏层的neurons数量。例如,以下代码应该可以完成工作。你定义自定义的网格,定义你的层,每个层(1
、2
和3
)以及每层的神经元数量。
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...