无法使用 R 中的 pROC 库获得正确的 multi-class ROC 曲线
Unable to get the proper multi-class ROC Curve using the pROC library in R
我的预测列有垃圾信息,不是垃圾信息,而且无法定义。我使用集成方法-堆叠方法来预测 it.I 能够获得大约 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))
剧情如下:
有人可以帮我解决这个问题吗?非常感谢。
classes 之间的平均是直接在 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
方法中获得了预测的 class。通常为了构建 ROC 曲线,您需要进行数字定量测量。定性测量会导致包含单个点的 ROC 曲线,这通常不是最佳的。不幸的是,插入符号 returns 3 个概率向量中的 type="probs"
选项不是 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)
最后,您应该仔细查看 multiclass ROC 分析的相关性。 ROC 是为二进制 class 化而设计的,根据我的经验,各种现有的 multiclass 扩展的相关性有些可疑。
我的预测列有垃圾信息,不是垃圾信息,而且无法定义。我使用集成方法-堆叠方法来预测 it.I 能够获得大约 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))
剧情如下:
有人可以帮我解决这个问题吗?非常感谢。
classes 之间的平均是直接在 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
方法中获得了预测的 class。通常为了构建 ROC 曲线,您需要进行数字定量测量。定性测量会导致包含单个点的 ROC 曲线,这通常不是最佳的。不幸的是,插入符号 returns 3 个概率向量中的 type="probs"
选项不是 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)
最后,您应该仔细查看 multiclass ROC 分析的相关性。 ROC 是为二进制 class 化而设计的,根据我的经验,各种现有的 multiclass 扩展的相关性有些可疑。