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

时间:2018-05-14 05:54:00

标签: r machine-learning classification roc

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

Ensemle技术代码:

# 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

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

1 个答案:

答案 0 :(得分:1)

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

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

之后,pROC为您做平均值,这样您就可以直接获得平均AUC:

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

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

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