r - 无法使用 R 中的 pROC 库获得正确的多类 ROC 曲线

标签 r machine-learning classification roc

我的预测列有垃圾邮件、非垃圾邮件且无法定义。我使用集成方法-堆叠方法来预测它。我能够获得大约 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))

剧情如下:

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

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

关于绘图,您通过插入符号的 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 是为二元分类而设计的,根据我的经验,各种现有多类扩展的相关性有些可疑。

关于r - 无法使用 R 中的 pROC 库获得正确的多类 ROC 曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50323796/

相关文章:

r - 无法下载R中的文件-状态503

r - 具有稳健线性模型、分位数回归和机器学习方法的逆回归程序

python - 如何为物体检测准备测试数据?

python - sklearn 中每个类(class)的具体测试数量/训练规模

r - 记录 R 包给出警告 @example 不存在

r - 将文件名拆分为名称、扩展名

python - 从 shell 运行 python 时如何避免打印不必要的信息?

machine-learning - svm 缩放输入值

machine-learning - 监督学习与分类同义,无监督学习与聚类同义吗?

r - R上的三个感叹号