我有一个vs-all-all分类器集。这个集合包括,比方说,3个分类器(LibSVM SVM),每个分类器都训练一个类的数据和所有其他类数据。样本的当前设置是,给出最高分的3个类的分类器被称为匹配类。
此设置提供FAR和FRR结果。问题是FAR和FRR结果不足以构建我需要的ROC曲线。我想知道我能做些什么来制作和ROC曲线。
答案 0 :(得分:0)
这可以使用“多类ROC曲线”来完成(有关详细信息,请参阅例如this answer)。通常,您要么单独查看每个类,要么单独查看每对类。我将提供一个简短的R
示例,说明第一个看起来如何,这个问题不那么复杂,并且仍然能够很好地理解各个类的识别能力。
首先需要获得一些类概率(为了重现性,这是你已经拥有的):
# Computing some class probabilities for a 3 class problem using repeated cross validation
library(caret)
model <- train(x = iris[,1:2], y = iris[,5], method = 'svmLinear', trControl = trainControl(method = 'repeatedcv', number = 10, repeats = 10, classProbs = T, savePredictions = T))
# those are the class probabilities for each sample
> model$pred
pred obs setosa versicolor virginica rowIndex C Resample
[...]
11 virginica virginica 1.202911e-02 0.411723759 0.57624713 116 1 Fold01.Rep01
12 versicolor virginica 4.970032e-02 0.692146087 0.25815359 122 1 Fold01.Rep01
13 virginica virginica 5.258769e-03 0.310586094 0.68415514 125 1 Fold01.Rep01
14 virginica virginica 4.321882e-05 0.202372698 0.79758408 131 1 Fold01.Rep01
15 versicolor virginica 1.057353e-03 0.559993337 0.43894931 147 1 Fold01.Rep01
[...]
现在,您可以单独查看每个类的ROC曲线。对于每条曲线,FRR
表示此类的样本被预测为其他类的样本的频率,而FAR
表示样本的频率。 其他一些类被预测为此类的样本:
plot(roc(predictor = model$pred$setosa, response = model$pred$obs=='setosa'), xlab = 'FAR', ylab = '1-FRR')
plot(roc(predictor = model$pred$versicolor, response = model$pred$obs=='versicolor'), add=T, col=2)
plot(roc(predictor = model$pred$virginica, response = model$pred$obs=='virginica'), add=T, col=3)
legend('bottomright', legend = c('setosa', 'versicolor', 'virginica'), col=1:3, lty=1)
如前所述,您也可以查看每对类的ROC曲线,但恕我直言会传输更多信息,因此掌握包含的信息会更复杂/需要更长时间