我的预测专栏包含垃圾邮件,不是垃圾邮件,并且无法定义。我使用集成方法堆叠法对其进行预测,我能够绘制出大约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))
这是情节:
有人可以帮我这个忙吗?非常感谢。
最佳答案
类之间的平均直接在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/