【问题标题】:Additional metrics in caret - PPV, sensitivity, specificity插入符号中的其他指标 - PPV、敏感性、特异性
【发布时间】:2019-03-12 12:06:29
【问题描述】:

我在 R 中使用插入符号进行逻辑回归:

  ctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 10, 
                       savePredictions = TRUE)

  mod_fit <- train(Y ~ .,  data=df, method="glm", family="binomial",
                   trControl = ctrl)

  print(mod_fit)

打印的默认指标是准确度和科恩卡帕。我想提取匹配的指标,如敏感性、特异性、阳性预测值等,但我找不到一种简单的方法来做到这一点。提供了最终模型,但它在所有数据上进行了训练(据我从文档中可以看出),所以我不能用它来重新预测。

混淆矩阵计算所有需要的参数,但将其作为汇总函数传递是行不通的:

  ctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 10, 
                       savePredictions = TRUE, summaryFunction = confusionMatrix)

  mod_fit <- train(Y ~ .,  data=df, method="glm", family="binomial",
                   trControl = ctrl)

Error: `data` and `reference` should be factors with the same levels. 
13.
stop("`data` and `reference` should be factors with the same levels.", 
    call. = FALSE) 
12.
confusionMatrix.default(testOutput, lev, method) 
11.
ctrl$summaryFunction(testOutput, lev, method) 

除了准确率和kappa之外,有没有办法提取这些信息,或者以某种方式在插入符号列车返回的train_object中找到它?

提前致谢!

【问题讨论】:

  • 你好辛迪。在使用caret::train() 之前,您是否将数据分成训练组和测试组?
  • 不,我不是。当我指定交叉验证时,我认为插入符号会为我做这件事。这不正确吗?

标签: r r-caret


【解决方案1】:

Caret 已经有汇总函数来输出您提到的所有指标:

defaultSummary 输出准确率和 Kappa
twoClassSummary 输出 AUC(ROC 曲线下的面积 - 见答案最后一行)、灵敏度和特异性
prSummary 输出精度和召回率

为了获得组合的指标,您可以编写自己的汇总函数来组合这三个的输出:

library(caret)
MySummary  <- function(data, lev = NULL, model = NULL){
  a1 <- defaultSummary(data, lev, model)
  b1 <- twoClassSummary(data, lev, model)
  c1 <- prSummary(data, lev, model)
  out <- c(a1, b1, c1)
  out}

让我们试试 Sonar 数据集:

library(mlbench)
data("Sonar")

在定义列车控制时,设置classProbs = TRUE 很重要,因为其中一些指标(ROC 和 prAUC)不能基于预测类别而是基于预测概率计算。

ctrl <- trainControl(method = "repeatedcv",
                     number = 10,
                     savePredictions = TRUE,
                     summaryFunction = MySummary,
                     classProbs = TRUE)

现在适合您选择的模型:

mod_fit <- train(Class ~.,
                 data = Sonar,
                 method = "rf",
                 trControl = ctrl)

mod_fit$results
#output
  mtry  Accuracy     Kappa       ROC      Sens      Spec       AUC Precision    Recall         F AccuracySD   KappaSD
1    2 0.8364069 0.6666364 0.9454798 0.9280303 0.7333333 0.8683726 0.8121087 0.9280303 0.8621526 0.10570484 0.2162077
2   31 0.8179870 0.6307880 0.9208081 0.8840909 0.7411111 0.8450612 0.8074942 0.8840909 0.8374326 0.06076222 0.1221844
3   60 0.8034632 0.6017979 0.9049242 0.8659091 0.7311111 0.8332068 0.7966889 0.8659091 0.8229330 0.06795824 0.1369086
       ROCSD     SensSD    SpecSD      AUCSD PrecisionSD   RecallSD        FSD
1 0.04393947 0.05727927 0.1948585 0.03410854  0.12717667 0.05727927 0.08482963
2 0.04995650 0.11053858 0.1398657 0.04694993  0.09075782 0.11053858 0.05772388
3 0.04965178 0.12047598 0.1387580 0.04820979  0.08951728 0.12047598 0.06715206

在这个输出中 ROC 实际上是 ROC 曲线下的面积 - 通常称为 AUC
和 AUC 是所有临界值的精确召回曲线下的面积。

【讨论】:

  • 感谢您的出色回答。其中哪些不能基于预测类别而是基于预测概率计算?
  • 很高兴为您提供帮助。 ROC 和 prAUC 需要概率,因为它们是考虑所有可能的决策阈值的度量,而不仅仅是通常使用的 0.5 标记。因此,当您处理不平衡的类时,它们是模型性能的更好衡量标准。
  • 完美!在尝试解决此问题时出现错误:错误:至少一个类级别不是有效的 R 变量名;这将在生成类概率时导致错误,因为变量名称将转换为 X0, X1 。请使用可用作有效 R 变量名称的因子级别(请参阅 ?make.names 以获得帮助)。我想这是由于我对大多数变量的“0”和“1”因子命名。有没有简单的方法解决这个问题?这只有在 classprobs = True 时才会出现问题
  • 在训练前将班级名称转换为单词而不是数字 - 例如 zero 和 one 而不是 0 和 1。 class &lt;- ifelse(class == "0", "zero", "one)。它应该在那之后工作。
  • 你能展示如何编写自定义函数MySummary吗?如果我有data=htn_data、Class=affirmatory 和Class=negatory 和model=rf_model,我该如何使用该功能?我尝试MySummary(htn_data, htn_data$Class, rf_model) 只是为了得到undefined columns selected 错误消息。
猜你喜欢
  • 2019-03-03
  • 2020-05-21
  • 2014-09-22
  • 2019-12-08
  • 2020-08-23
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多