我们如何计算随机森林等分类算法的 ROC AUC?

机器算法验证 机器学习 分类 随机森林 奥克
2022-03-14 14:49:02

与 2 类的分类一样,更高的准确度会导致更低的 ROC - AUC 吗?, AdamO 说对于随机森林 ROC AUC 是不可用的,因为这个算法没有截止值,并且 ROC AUC 只有在算法返回一个连续概率值(并且只有 1 个值)的情况下才能计算看不见的元素。

但是在R和Python中,很多时候,比如pROC::auc在R中,或者roc_auc_score在python中的sklearn中,我们可以在预测结果后计算ROC AUC,即ROC AUC适用于所有算法。

摘要:为什么ROC AUC不适用于随机森林(在分类True / False标签的情况下)

AUC 的思想是:如果你改变截止值,分配就会改变。例如,在回归中,一个对象的预测值为 0.75,截止值为 0.8,它将被分配给 False (0),如果截止值为 0.6,它将被分配给 True (1) .

但是对于 randomForest,分配永远不会改变。

例如,使用函数predict_proba,sklearn 将返回每个类的概率列表,而不仅仅是 1 个概率

所以,假设 sklearn 返回一个看不见的元素

True        False
0.21        0.19

无论截止值发生什么变化,分配将始终为 True 并且永远不会改变。

1个回答

虽然 randomForest 包没有内置函数来生成 ROC 曲线和 AUC 度量,但结合包 pROC 使用,在 2 个类的情况下很容易生成。

randomForest 函数将创建一个包含投票的对象。这些投票基于每个数据点的 Out of Bag (OOB) 样本树分类投票。这些投票大致代表一个概率,因此可用于创建 ROC 和 AUC 度量。

这是一个示例,假设安装了包 randomForest 和 pROC:

require(randomForest)
data(iris)

# This will make drop a class to make it a 2 class problem
iris<-iris[-which(iris$Species=="setosa"),]
iris$Species<-as.factor(as.character(iris$Species))

set.seed(71)
iris.rf<-randomForest(Species ~ ., data=iris,ntree=10)
require(pROC)
rf.roc<-roc(iris$Species,iris.rf$votes[,2])
plot(rf.roc)
auc(rf.roc)

在此处输入图像描述