使用 caret 包是否可以获得特定阈值的混淆矩阵?

机器算法验证 r 分类 插入符号 混淆矩阵
2022-02-03 01:26:53

我已经获得了二元响应的逻辑回归模型(通过),并且通过intrain获得了逻辑混淆矩阵它给了我逻辑模型混淆矩阵,尽管我不确定使用什么阈值来获得它。如何使用in获得特定阈值的混淆矩阵confusionMatrixcaretconfusionMatrixcaret

2个回答

有一个非常简单的方法,假设tune <- train(...)

probsTest <- predict(tune, test, type = "prob")
threshold <- 0.5
pred      <- factor( ifelse(probsTest[, "yes"] > threshold, "yes", "no") )
pred      <- relevel(pred, "yes")   # you may or may not need this; I did
confusionMatrix(pred, test$response)

显然,您可以将阈值设置为您想尝试的任何值或选择“最佳”的阈值,其中最佳意味着最高的综合特异性和灵敏度:

library(pROC)
probsTrain <- predict(tune, train, type = "prob")
rocCurve   <- roc(response = train$response,
                      predictor = probsTrain[, "yes"],
                      levels = rev(levels(train$response)))
plot(rocCurve, print.thres = "best")

查看 Max 发布的示例后,我不确定是否存在一些统计上的细微差别,使我的方法不那么受欢迎。

R 中的大多数分类模型都会产生类预测和每个类的概率。对于二进制数据,几乎在每种情况下,类别预测都基于 50% 的概率截止值。

glm是一样的。使用caret, usingpredict(object, newdata)为您提供预测的类别,并predict(object, new data, type = "prob")为您提供特定类别的概率(何时object由 生成train)。

您可以通过定义自己的模型并应用您想要的任何截止值来做不同的事情。caret 网站还有一个使用重采样来优化概率截止的示例。

tl;博士

confusionMatrix使用预测的类别,因此有 50% 的概率截止

最大限度