我正在对SVM
数据使用iris
函数。目的是从输出矩阵attr(pred_prob, "probabilities")
中提取(1)每行(2)的最高预测概率的“类别”。
data(iris)
attach(iris)
x <- subset(iris, select = -Species)
y <- Species
model <- svm(x, y, probability = TRUE)
pred_prob <- predict(model, x, decision.values = TRUE, probability = TRUE)
attr(pred_prob, "probabilities")
(原始代码来自先前的thread。)
代码的最后一行将为我们提供以下格式的输出:
setosa versicolor virginica
1 0.979989881 0.011347796 0.008662323
2 0.972567961 0.018145783 0.009286256
3 0.978668604 0.011973933 0.009357463
为了便于将这些预测的概率与它们的真实类别“标签”(即,setosa,杂色,弗吉尼亚州)进行比较,我计划从上述输出矩阵中为每一行提取具有最高预测概率的类别。例如,第一次观察的最高概率类别为setosa
,预测概率为0.9799,该概率是从
which(attr(pred_prob, "probabilities")[1,] == max(attr(pred_prob, "probabilities")[1,]), arr.ind = TRUE)
我现在正在努力将上述代码扩展到一个循环中,以便为数据中的每个观察结果输出一个包含预测类标签的数据列。以下是到目前为止的内容,但是我很难过
predicted_class <- attr(pred_prob, "probabilities")
for(row in 1:nrow(predicted_class)) {
output <- print(which(predicted_class[row,] == max(predicted_class[row,]), arr.ind = TRUE))
output
}
但是这并没有给我我想要的结果,似乎只是从随机行中返回预测类(而我想为所有观察结果返回一列预测类)。 有人可以启发我吗?
答案 0 :(得分:2)
使用max.col
colnames(pred_prob)[max.col(pred_prob)]
#[1] "setosa" "setosa" "setosa"
或使用循环
output <- vector("double", nrow(pred_prob))
for(row in 1:nrow(pred_prob)) {
output[row] <- which.max(pred_prob[row,])
}
output
#[1] 1 1 1
或apply
apply(pred_prob, MARGIN = 1, FUN = which.max)
#1 2 3
#1 1 1
数据
pred_prob <- structure(c(0.979989881, 0.972567961, 0.978668604, 0.011347796,
0.018145783, 0.011973933, 0.008662323, 0.009286256, 0.009357463
), .Dim = c(3L, 3L), .Dimnames = list(c("1", "2", "3"), c("setosa",
"versicolor", "virginica")))