神经网络中的类概率

时间:2015-05-19 10:00:05

标签: r neural-network classification

我使用具有多层感知的caret包。

我的数据集由标记的输出值组成,可以是A,B或C.输入向量由4个变量组成。

我使用以下代码行来计算每个输入值的类概率:

fit <- train(device~.,data=dataframetrain[1:100,], method="mlp",
             trControl=trainControl(classProbs=TRUE))
(p=(predict(fit,newdata=dataframetest,type=("prob"))))

我认为每条记录的类概率必须总计为1。但我得到以下内容:

rowSums(p)
#        1        2        3        4        5        6        7        8 
# 1.015291 1.015265 1.015291 1.015291 1.015291 1.014933 1.015011 1.015291 
#        9       10       11       12       13       14       15       16 
# 1.014933 1.015206 1.015291 1.015291 1.015291 1.015224 1.015011 1.015291 

任何人都可以帮助我,因为我不知道我做错了什么。

2 个答案:

答案 0 :(得分:1)

可能没有错,似乎caret返回输出层中神经元的值而不将它们转换为概率(如果我错了,请纠正我)。在RSNNS::mlp之外使用caret函数时,预测行也不会合计为一个。

由于所有输出神经元具有相同的激活函数,因此可以通过将预测除以相应的行总和将输出转换为概率,请参阅this question

使用method = "mlp"method = "mlpWeightDecay"时,此行为似乎属实,但在使用method = "nnet"时,预测总和为1。

示例:

library(RSNNS)

data(iris)
#shuffle the vector
iris <- iris[sample(1:nrow(iris),length(1:nrow(iris))),1:ncol(iris)]
irisValues <- iris[,1:4]
irisTargets <- iris[,5]
irisTargetsDecoded <- decodeClassLabels(irisTargets)
iris2 <- splitForTrainingAndTest(irisValues, irisTargetsDecoded, ratio=0.15)
iris2 <- normTrainingAndTestSet(iris2)

set.seed(432)
model <- mlp(iris2$inputsTrain, iris2$targetsTrain, 
             size=5, learnFuncParams=c(0.1), maxit=50, 
             inputsTest=iris2$inputsTest, targetsTest=iris2$targetsTest)

predictions <- predict(model,iris2$inputsTest)
head(rowSums(predictions))
# 139        26        17       104        54        82 
# 1.0227419 1.0770722 1.0642565 1.0764587 0.9952268 0.9988647 

probs <- predictions / rowSums(predictions)
head(rowSums(probs))
# 139  26  17 104  54  82 
# 1   1   1   1   1   1 

# nnet example --------------------------------------
library(caret)
training <- sample(seq_along(irisTargets), size = 100, replace = F)
modelCaret <- train(y = irisTargets[training], 
                    x = irisValues[training, ],
                    method = "nnet")
predictionsCaret <- predict(modelCaret, 
                            newdata = irisValues[-training, ],
                            type = "prob")
head(rowSums(predictionsCaret))
# 122 100  89 134  30  86 
# 1   1   1   1   1   1 

答案 1 :(得分:0)

我不知道插入符号包在这些选择中提供了多大的灵活性,但制作神经网络产生输出总和为1的标准方法是使用softmax函数作为激活函数在输出层。