针对不平衡数据的r插入包中的prSummary

时间:2016-09-30 04:15:51

标签: r r-caret

我有一个不平衡的数据,我想做分层交叉验证并使用精确召回auc作为我的评估指标。

我在带有分层索引的r包插入符中使用prSummary,并且在计算性能时遇到错误。

以下是可以复制的样本。我发现只有十个样本来计算p-r auc,并且由于不平衡,只有一个类,所以它不能计算p-r auc。 (之所以我发现只有十个样本来计算p-r auc是因为我修改了prSummary来强制此函数打印出数据)

Error in ROCR::prediction(y_pred, y_true) : 
Number of classes is not equal to 2.
ROCR currently supports only evaluation of binary classification tasks. 

以下是错误消息:

java.util.List

1 个答案:

答案 0 :(得分:0)

我想我找到了奇怪的事情......

即使我指定了交叉验证索引,摘要函数(无论是prSummary还是其他汇总函数)仍将随机(我不确定)选择十个样本来计算性能。

我的方法是使用tryCatch定义一个汇总函数,以避免发生此错误。

prSummaryCorrect <- function (data, lev = NULL, model = NULL) {
  print(data)
  print(dim(data))
  library(MLmetrics)
  library(PRROC)
  if (length(levels(data$obs)) != 2) 
    stop(levels(data$obs))
  if (length(levels(data$obs)) > 2) 
    stop(paste("Your outcome has", length(levels(data$obs)), 
               "levels. The prSummary() function isn't appropriate."))
  if (!all(levels(data[, "pred"]) == levels(data[, "obs"]))) 
    stop("levels of observed and predicted data do not match")

  res <- tryCatch({
    auc <- MLmetrics::PRAUC(y_pred = data[, lev[2]], y_true = ifelse(data$obs == lev[2], 1, 0))
  }, warning = function(war) {
    print(war)
    auc <- NA
  }, error = function(e){
    print(dim(data))
    auc <- NA
  }, finally = {
    print("finally")
    auc <- NA
  })

  c(AUC = res,
    Precision = precision.default(data = data$pred, reference = data$obs, relevant = lev[2]), 
    Recall = recall.default(data = data$pred, reference = data$obs, relevant = lev[2]), 
    F = F_meas.default(data = data$pred, reference = data$obs, relevant = lev[2]))
}