如何从caret::predict()获取类概率和预测?

如何从caret::predict()获取类概率和预测?,r,r-caret,predict,R,R Caret,Predict,除了预测类标签外,在预测时是否可以在新数据中返回每个观察的预期值 library(caret) knnFit <- train(Species ~ ., data = iris, method = "knn", trControl = trainControl(method = "cv", classProbs = TRUE)) x <- predict(knnFit, newdata = iris) 如果我想要概率: x <- predi

除了预测类标签外,在预测时是否可以在新数据中返回每个观察的预期值

library(caret)
knnFit <- train(Species ~ ., data = iris, method = "knn", 
                trControl = trainControl(method = "cv", classProbs = TRUE))

x <- predict(knnFit, newdata = iris)
如果我想要概率:

x <- predict(knnFit, newdata = iris, type = "prob")
> head(x)
  setosa versicolor virginica
1      1          0         0
2      1          0         0
3      1          0         0
4      1          0         0
5      1          0         0
6      1          0         0
x头(x)
维吉尼亚杂色刚毛
1      1          0         0
2      1          0         0
3      1          0         0
4      1          0         0
5      1          0         0
6      1          0         0

有可能让插入符号同时返回预测和概率吗?我知道我可以用max.col of probabilities版本来计算,但我想知道是否有一种内在的方法可以同时得到这两个版本?

我将我的评论变成了一个答案。 生成概率预测表后,实际上不需要运行两次预测函数来获得类。您可以通过应用一个简单的
which.max
函数(它运行得很快)来请求添加class列。这将为每一行指定列的名称(三个
c(“setosa”、“versicolor”、“virginica”)
中的一个),以概率最高为基础

根据要求,您可以获得包含这两个信息的表格:

library(dplyr)
predict(knnFit, newdata = iris, type = "prob") %>% 
  mutate('class'=names(.)[apply(., 1, which.max)])
# a random sample of the resulting table:
####     setosa versicolor virginica      class
#### 18       1  0.0000000 0.0000000     setosa
#### 64       0  0.6666667 0.3333333 versicolor
#### 90       0  1.0000000 0.0000000 versicolor
#### 121      0  0.0000000 1.0000000  virginica

ps:这使用来自
dplyr
magrittr
包的管道操作员。点
表示当您重用上一条指令的结果时

只需调用
predict()
两次即可。如果需要单个调用,请编写一个helper函数。我不确定我是否理解这里的问题所在。@Flick先生,因为我实际上预测了超过1000万条记录的时间是一个因素,因此理想情况下,它将在oner中完成。有可能吗?没有。您可以在
caret::predict.train
查看源代码。根据类型,显然存在一个if/else分支。打两次电话真的太慢了吗?你计时了吗?我的意思是,你可以通过所有的源代码和自己破解,但我确信它会更快,除非你选择重新实现C++中的R函数或其他东西。嗯,刚才我正在linux屏幕上训练,我估计可能需要一天或更长的时间,但如果预测需要很长时间,我会在这里报告。当我今天早上早些时候进行实验时,他们就这样做了,所以我使用了一个带有并行的foreach循环。尽管如此,这回答了我的问题,只是想知道是否有一个参数我可以添加,猜不到。Cheerri曾经使用这个技巧来避免两次使用predict:
predict(knnFit,newdata=iris,type=“prob”)%%>%mutate(names(.)[apply(,1,which.max)]
。你可以用你的方法试试速度..效果很好。如果还希望检索最大概率的值,可以通过将which.max()替换为max():
mutate('class'=names(.)[apply(,1,max)])
library(dplyr)
predict(knnFit, newdata = iris, type = "prob") %>% 
  mutate('class'=names(.)[apply(., 1, which.max)])
# a random sample of the resulting table:
####     setosa versicolor virginica      class
#### 18       1  0.0000000 0.0000000     setosa
#### 64       0  0.6666667 0.3333333 versicolor
#### 90       0  1.0000000 0.0000000 versicolor
#### 121      0  0.0000000 1.0000000  virginica