pROC如何处理多级因子标签?

问题描述 投票:2回答:2

我正在计算R中的模型的AUC。模型已经过训练,可以预测两级因素(好/坏)。它已应用于具有三级结果(好/坏/缺失)的数据。我的计分部分很好。我根据每个观察值的一组预测变量得出概率。

我不了解的部分是当我使用roc(data$label, data$score)计算AUC时会发生什么,因为现在roc$label具有3个等级(好/坏/缺失),但是该分数是根据只有2个等级的数据进行训练的(好坏)。是否会忽略新级别?我是否应该从数据中手动排除所有这些观察值以获取准确的AUC度量?

data <- structure(list(label = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 1L, 2L, 2L, 3L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L), .Label = c("missing", 
"good", "bad"), class = "factor"), score = c(0.151147571051044, 
0.0411329810171418, 0.0688491931089625, 0.0457818202643564, 0.0411038297454905, 
0.0652004019004794, 0.105964115208592, 0.0538514549969684, 0.0415476305130247, 
0.0533831523731155, 0.0639788335617257, 0.0434341986489527, 0.0520826001358534, 
0.0642210548642832, 0.0536219837901353, 0.0415821872079014, 0.0416555537422, 
0.0491937562992912, 0.0469082976746886, 0.0538194884632293)), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

roc(data$label, data$score)
r roc proc-r-package
2个回答
1
投票

除非您具有特别旧的pROC版本,或者您有沉默诊断消息的信息,它应该告诉您它在做什么:

> roc(data$label, data$score)
Setting levels: control = missing, case = good
Setting direction: controls < cases

如您所见,它使用“ missing”类作为控件或否定类。

它继续向您显示使用了什么数据:

[...]
Data: data$score in 3 controls (data$label missing) < 16 cases (data$label good).

同样可以看到它使用“ missing”标签作为控件。

最后,它提示您如何解决问题:

[...]
Warning message:
In roc.default(data$label, data$score) :
  'response' has more than two levels. Consider setting 'levels' explicitly or using 'multiclass.roc' instead

根据您的情况,最容易按照建议设置levels参数:

> roc(data$label, data$score, levels=c("good", "bad"))
Setting direction: controls > cases

Call:
roc.default(response = data$label, predictor = data$score, levels = c("good",     "bad"))

Data: data$score in 16 controls (data$label good) > 1 cases (data$label bad).
Area under the curve: 0.8125

现在,它可以按照您的要求正确使用好/坏级别。

最后一件事,请注意,pROC仍在自动设置方向:

Setting direction: controls > cases

您应确保这与您在训练数据上获得的方向(阳性病例高于或低于阴性病例)相匹配。

train.roc <- roc(train.data$label, train.data$score, levels=c("good", "bad"))
roc(data$label, data$score, levels=c("good", "bad"), direction=train.roc$direction)

如果不这样做,您可能会在AUC中引入一些偏见,并且您可能认为您的预测变量表现不佳。

通常,您希望尽可能地显式设置levelsdirection参数。如果在培训和测试之间方向有所改变。


1
投票

类别missingdata$label因子的三个级别之一。您可以将missing设置为真正的缺失值,然后降低此级别:

library(pROC)
# Set 'missing' to a real missing
data$label[data$label=="missing"] <- NA
# Drop 'missing' levels from 'label' factor
data$label <- droplevels(data$label)
# ROC estimation
roc(data$label, data$score)

输出为:

Setting levels: control = good, case = bad
Setting direction: controls > cases

Call:
roc.default(response = data$label, predictor = data$score)

Data: data$score in 16 controls (data$label good) > 1 cases (data$label bad).
Area under the curve: 0.8125
© www.soinside.com 2019 - 2024. All rights reserved.