我有一个不平衡的数据,我想做分层交叉验证并使用精确召回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
答案 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]))
}