pROC 如何处理多级因子标签?
How does pROC handle multi-level factor labels?
我正在计算 R 中模型的 AUC。该模型已经过训练以预测两级因子 (good/bad)。它已应用于具有三级结果(good/bad/缺失)的数据。我对得分部分很好。我根据每个观察的一组预测变量得到一个概率。
我不明白的部分是当我使用 roc(data$label, data$score)
计算 AUC 时会发生什么,因为现在 roc$label
有 3 个水平(good/bad/缺失),但是得分在只有 2 个级别 (good/bad) 的数据上进行训练。是否忽略了新级别?我是否应该从数据中手动排除所有此类观察结果以获得准确的 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)
类别 missing
是 data$label
因素的 3 个水平之一。
你可以把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
除非你有一个特别旧的 pROC 版本,或者你有一些静音诊断消息,它应该告诉你它在做什么:
> roc(data$label, data$score)
Setting levels: control = missing, case = good
Setting direction: controls < cases
如您所见,它使用 "missing" class 作为对照或阴性 class。
它继续向您显示使用了哪些数据:
[...]
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
现在它可以按照您的要求正确使用 good/bad 级别。
最后一件事,请注意 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 中引入一些偏差,并且您可能认为您的预测器在实际情况下表现良好。
通常,您希望尽可能明确地设置 levels
和 direction
参数。
如果方向在训练和测试之间以某种方式逆转。
我正在计算 R 中模型的 AUC。该模型已经过训练以预测两级因子 (good/bad)。它已应用于具有三级结果(good/bad/缺失)的数据。我对得分部分很好。我根据每个观察的一组预测变量得到一个概率。
我不明白的部分是当我使用 roc(data$label, data$score)
计算 AUC 时会发生什么,因为现在 roc$label
有 3 个水平(good/bad/缺失),但是得分在只有 2 个级别 (good/bad) 的数据上进行训练。是否忽略了新级别?我是否应该从数据中手动排除所有此类观察结果以获得准确的 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)
类别 missing
是 data$label
因素的 3 个水平之一。
你可以把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
除非你有一个特别旧的 pROC 版本,或者你有一些静音诊断消息,它应该告诉你它在做什么:
> roc(data$label, data$score)
Setting levels: control = missing, case = good
Setting direction: controls < cases
如您所见,它使用 "missing" class 作为对照或阴性 class。
它继续向您显示使用了哪些数据:
[...]
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
现在它可以按照您的要求正确使用 good/bad 级别。
最后一件事,请注意 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 中引入一些偏差,并且您可能认为您的预测器在实际情况下表现良好。
通常,您希望尽可能明确地设置 levels
和 direction
参数。
如果方向在训练和测试之间以某种方式逆转。