随机森林的r-AUC-不同的方法,不同的答案



我正试图找到一种单一的方法,在不使用MLeval的情况下,为训练集和测试集的随机森林模型提供AUC。

这是ROC在训练数据方面的一个很好的例子,这也是ROC在测试数据方面的例子。训练数据的AUC的第一个例子给出AUC=0.944。

plot.roc(rfFit$pred$obs[selectedIndices],
rfFit$pred$M[selectedIndices], print.auc=TRUE)
由于我不知道如何将第一个示例用于测试数据,我将Sonar数据应用于第二个示例,并与第一个示例交叉验证答案

ctrl <- trainControl(method="cv", 
summaryFunction=twoClassSummary, 
classProbs=T,
savePredictions = T)
rfFit <- train(Class ~ ., data=Sonar, 
method="rf", preProc=c("center", "scale"), 
trControl=ctrl, metric="ROC")
print(rfFit)
...
mtry  ROC        Sens       Spec     
2    0.9459428  0.9280303  0.8044444
result.predicted.prob <- predict(rfFit, Sonar, type="prob") # Prediction
result.roc <- roc(Sonar$Class, result.predicted.prob$M)
plot(result.roc, print.thres="best", print.thres.best.method="closest.topleft", print.auc=TRUE)

但整个训练数据(即Sonar(的AUC为1.0,而rfFit显示0.946,这也是不同的!那么,为什么我得到了不同的结果?计算训练和测试AUC的正确方法是什么?

这是不同模型的AUC。

您看到的第一个AUC是通过交叉验证获得的训练的平均AUC。你可以在下面看到:

head(rfFit$resample)
ROC      Sens      Spec Resample
1 1.0000000 0.9090909 1.0000000   Fold02
2 0.9949495 1.0000000 0.7777778   Fold01
3 0.8045455 0.8181818 0.5000000   Fold03
4 1.0000000 1.0000000 0.8000000   Fold06
5 0.9595960 0.9090909 0.6666667   Fold05
6 0.9909091 0.9090909 0.9000000   Fold04
mean(rfFit$resample$ROC)
[1] 0.9540909

在这种情况下,它是10倍交叉验证,你训练90%的数据,并在10%上进行测试,因此它是一个略有不同的模型,每倍都有不同的AUC。

如果对最终训练的模型进行预测,则AUC为1,并且这不包括在插入符号输出中。

所以,这取决于你的AUC应该反映什么。如果是CV训练期间的平均AUC,则使用插入符号中的ROC值。如果你只需要一个值来反映最终模型的准确性,那么你的第二种方法是可以的

相关内容

最新更新