我的预测专栏包含垃圾邮件,不是垃圾邮件,并且无法定义。我使用集成方法堆叠法对其进行预测,我能够绘制出大约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))


这是情节:

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

有人可以帮我这个忙吗?非常感谢。

最佳答案

类之间的平均直接在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是为二进制分类而设计的,在我的经验中,各种现有的多类扩展的相关性有些怀疑。

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

10-12 19:49