【问题标题】:Unable to get the proper multi-class ROC Curve using the pROC library in R无法使用 R 中的 pROC 库获得正确的多类 ROC 曲线
【发布时间】:2018-10-23 17:29:27
【问题描述】:

我的预测栏有垃圾邮件,不是垃圾邮件,而且无法定义。我使用了集成方法-堆叠方法来预测它。我能够获得大约 77% 的准确度我能够绘制 ROC 曲线,但我认为它不正确。

集成技术代码:

# Generate level-one dataset for training the ensemble metalearner
predDF <- data.frame(dataTest.pred, NB_Predictions, RF_Predictions,SVM_Predictions, spam = validation$spam, stringsAsFactors = F)

# Train the ensemble

# define training control
set.seed(1958)
# Train the ensemble
modelStack <- caret::train(spam ~ ., data = predDF, method = "rf")

这是我的 ROC 代码:

#ROC Curve
pre<-predict(modelStack, testPredLevelOne,type='prob')
# AUC measure
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 曲线的另一种方法。我认为这也行不通。

#Method 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))

剧情如下:

有人可以帮我解决这个问题吗?非常感谢。

【问题讨论】:

  • 我认为auc 的值符合情节。这绝对不是一个好模型。

标签: r machine-learning classification roc


【解决方案1】:

类之间的平均是直接在 pROC 中完成的。因此,您只想使用单个预测向量运行 multiclass.roc 一次。通常您希望使用type="response" 而不是probs,尽管这可能会因您的模型可用的predict 函数而异:

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

之后,pROC 会为您进行平均,因此您可以直接获得平均 AUC:

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

请注意,在您的情况下,这将是 3 个 AUC 的平均值:垃圾邮件与非垃圾邮件、垃圾邮件与不可定义的邮件以及非垃圾邮件与不可定义的邮件。这可能无法反映您计算的准确度值。

关于绘图,您从 caret 的 predict.train 方法中获得了预测类。通常为了构建 ROC 曲线,您需要一个数字的、定量的测量。定性测量会产生包含单个点的 ROC 曲线,这通常不是最佳的。不幸的是,插入符号中的 type="probs" 选项返回 3 个概率向量,这不是 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 是为二进制分类而设计的,根据我的经验,各种现有的多类扩展的相关性有些可疑。

【讨论】:

  • 非常感谢。我使用第二种方法绘制它的方式是否正确?你能告诉我如何策划这个吗?我是数据挖掘的新手,试图学习我的方法。我已经为二进制类做过,但从来没有为多类做过。只是有点挣扎。会有很大的帮助。非常感谢。 :)
  • @TheAsipiringone 很难说不知道predict 使用了什么方法(换句话说,你如何生成modelStack)或者predictions 变量中的内容。如果您想要的不仅仅是一般性答案,您需要在问题中提供更多详细信息(我的答案是:对我来说看起来不错)。
  • 集成技术是使用 C4.5、朴素贝叶斯、SVM 和随机森林构建的。我已经添加了生成模型堆栈的代码。
  • 好的,所以您正在使用?caret:::predict.train 函数。更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 2016-08-06
  • 2019-02-27
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多