包RSNNS-MLP-IRIS-TUNING案例解析

简单分析一下RSNNS包中的一个案例demo。这个文件的源码可以在RSNNS/demo中找到。

library(RSNNS)

set.seed(2)

data(iris)

#shuffle the vector
iris <- iris[sample(nrow(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)

#normalize data
iris <- normTrainingAndTestSet(iris)


#parameterGrid <- expand.grid(c(3,5,9,15), c(0.00316, 0.0147, 0.1))
parameterGrid <- expand.grid(c(3,5,9,15), c(0.00316, 0.0147, 0.1))

colnames(parameterGrid) <- c("nHidden", "learnRate")
rownames(parameterGrid) <- paste("nnet-", apply(parameterGrid, 1, function(x) {paste(x,sep="", collapse="-")}), sep="")

models <- apply(parameterGrid, 1, function(p) {
      
      mlp(iris$inputsTrain, iris$targetsTrain, size=p[1], learnFunc="Std_Backpropagation",
          learnFuncParams=c(p[2], 0.1), maxit=200, inputsTest=iris$inputsTest, 
          targetsTest=iris$targetsTest)
    })

par(mfrow=c(4,3))

for(modInd in 1:length(models)) {
  plotIterativeError(models[[modInd]], main=names(models)[modInd])
}

trainErrors <- data.frame(lapply(models, function(mod) {
          error <- sqrt(sum((mod$fitted.values - iris$targetsTrain)^2))
          error
        }))

testErrors <- data.frame(lapply(models, function(mod) {
      pred <- predict(mod,iris$inputsTest)
      error <- sqrt(sum((pred - iris$targetsTest)^2))
      error
    }))

t(trainErrors)
t(testErrors)

trainErrors[which(min(trainErrors) == trainErrors)]
testErrors[which(min(testErrors) == testErrors)]

model <- models[[which(min(testErrors) == testErrors)]]

model

summary(model)

这个过程还是比较简洁明了的。首先导入数据并且对数据进行打乱,因为原始iris的数据是根据类型排序的,洗牌还是有必要的。

irisTargets <- decodeClassLabels(iris[,5], valTrue=0.9, valFalse=0.1)

 这个地方对标签进行了处理,先看一下这个处理的结果是什么。

> head(irisTargets)
     setosa versicolor virginica
[1,]    0.9        0.1       0.1
[2,]    0.9        0.1       0.1
[3,]    0.9        0.1       0.1
[4,]    0.9        0.1       0.1
[5,]    0.9        0.1       0.1
[6,]    0.9        0.1       0.1

也就是说,如果是对应类别就置0.9,不是的话就置0.1,这个数值根据valTrue和valFalse来设定。

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

这个函数将数据集合划分成训练集和测试集,其中测试集大小根据ratio参数确定。此处就是取数据集的15%。训练集合又分为inputs(特征值)和targets(目标分类结果),测试集也同样分为这两个集合。

为了展示在不同的参数下,运行的效果,案例设置了12组参数。

parameterGrid <- expand.grid(c(3,5,9,15), c(0.00316, 0.0147, 0.1))

expand.grid()函数让两个向量间组合。看一下这个组合的结果

> expand.grid(c(3,5,9,15), c(0.00316, 0.0147, 0.1))
   Var1    Var2
1     3 0.00316
2     5 0.00316
3     9 0.00316
4    15 0.00316
5     3 0.01470
6     5 0.01470
7     9 0.01470
8    15 0.01470
9     3 0.10000
10    5 0.10000
11    9 0.10000
12   15 0.10000

于是这就得到了12组不同的参数。其中第一列是隐藏神经元个数,第二列是学习率。

models <- apply(parameterGrid, 1, function(p) {
      
      mlp(iris$inputsTrain, iris$targetsTrain, size=p[1], learnFunc="Std_Backpropagation",
          learnFuncParams=c(p[2], 0.1), maxit=200, inputsTest=iris$inputsTest, 
          targetsTest=iris$targetsTest)
    })

此时根据不同的参数进行测试。

for(modInd in 1:length(models)) {
  plotIterativeError(models[[modInd]], main=names(models)[modInd])
}

 然后利用plotIterativeError()函数绘制迭代误差。其中IterativeFitError (as black line),
IterativeTestError (as red line)。

最后看一下绘制的图

包RSNNS-MLP-IRIS-TUNING案例解析_第1张图片

转载于:https://www.cnblogs.com/goatee/p/5342602.html

你可能感兴趣的:(包RSNNS-MLP-IRIS-TUNING案例解析)