随机森林的 AUC - 不同的方法,不同的答案?
AUC for Random Forest - different methods, different answers?
我正在尝试寻找一种方法,在不使用 MLeval 的情况下为训练集和测试集提供随机森林模型的 AUC。
这是 , and 。训练数据的 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)
但是整个训练数据(即声纳)的 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 值。如果你只需要1个值来反映最终模型的准确率,那么你的第二种方法就可以了。
我正在尝试寻找一种方法,在不使用 MLeval 的情况下为训练集和测试集提供随机森林模型的 AUC。
这是
plot.roc(rfFit$pred$obs[selectedIndices],
rfFit$pred$M[selectedIndices], print.auc=TRUE)
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)
但是整个训练数据(即声纳)的 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 值。如果你只需要1个值来反映最终模型的准确率,那么你的第二种方法就可以了。