我使用具有多层感知的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
任何人都可以帮助我,因为我不知道我做错了什么。
答案 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
函数作为激活函数在输出层。