使用R语言中的pROC库无法正确获取多类ROC曲线

我的预测列包含了垃圾邮件、非垃圾邮件和无法定义的类别。我使用了集成方法中的堆叠方法来进行预测。我能够达到大约77%的准确率,我能够绘制ROC曲线,但我认为它并不正确。

集成技术代码:

# 生成一级数据集用于训练集成元学习器
predDF <- data.frame(dataTest.pred, NB_Predictions, RF_Predictions,SVM_Predictions, spam = validation$spam, stringsAsFactors = F)
# 训练集成
# 定义训练控制
set.seed(1958)
# 训练集成模型
modelStack <- caret::train(spam ~ ., data = predDF, method = "rf")

这是我绘制ROC曲线的代码:

#ROC曲线
pre<-predict(modelStack, testPredLevelOne,type='prob')
# AUC测量
modelroc = mean(  c(as.numeric(multiclass.roc(testPredLevelOne$spam, pre[,1])$auc),
    as.numeric(multiclass.roc(testPredLevelOne$spam, pre[,2])$auc),
    as.numeric(multiclass.roc(testPredLevelOne$spam, pre[,3])$auc)
  ))

我认为AUC测量值也不正确。

> modelroc
[1] 0.500903

这是我尝试的另一种绘制ROC曲线的方法。我认为这种方法也不起作用。

#方法2 ROC
predictions<-as.numeric(predict(modelStack, testPredLevelOne))
roc.multi<-multiclass.roc(testPredLevelOne$spam,predictions)
auc(roc.multi)
rs <- roc.multi[['rocs']]
plot.roc(rs[[1]])
sapply(2:length(rs),function(i) lines.roc(rs[[i]],col=i))

这是绘制的图表:

enter image description here

有人能帮帮我吗?非常感谢。


回答:

pROC库中对类别间的平均值是直接计算的。因此,您只需要运行一次multiclass.roc,并提供一个预测向量。通常您应该使用type="response"而不是probs,尽管这可能因您的模型可用的predict函数而异:

pre<-predict(modelStack, testPredLevelOne, type='response')

之后,pROC会为您计算平均值,因此您可以直接获取平均AUC:

multiclass.roc(testPredLevelOne$spam, pre)$auc

请注意,在您的案例中,这将是三个AUC的平均值:垃圾邮件对非垃圾邮件、垃圾邮件对无法定义和非垃圾邮件对无法定义。这可能与您计算的准确率值不一致。

关于绘图,您从caret的predict.train方法中获得了预测类别。通常,为了构建ROC曲线,您需要一个数值的、定量的测量结果。定性测量结果会导致ROC曲线上只有一个点,这通常不是最优的。不幸的是,caret中的type="probs"选项返回的是三个概率向量,这不是pROC支持的格式。

另一种方法是手动进行计算,选择您想要测试的正确概率列和级别:

pre<-predict(modelStack, testPredLevelOne,type='prob')
roc(testPredLevelOne$spam, pre[,X], levels = c("not spam", "spam"), plot = TRUE)
roc(testPredLevelOne$spam, pre[,X], levels = c("undefined", " spam"), plot = TRUE, add = TRUE)

最终,您应该仔细审查多类ROC分析的相关性。ROC最初是为二元分类设计的,根据我的经验,各种现有的多类扩展的相关性有些值得怀疑。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注