在 R 中使用 pROC 的随机森林拟合对象的 ROC 曲线,使用正或负 "votes" 作为预测变量

ROC curves for Random Forest fit objects using pROC in R, to use positve or negative "votes" as predictor

肥胖是一个二进制响应变量,1 表示肥胖,0 表示不肥胖。 体重是一个连续的预测变量。

使用 RF class消除肥胖:

library(randomFores)

rf <- randomForest(factor(obese)~weight)

给我们一个适合的对象包含:

> summary(rf)
                Length Class  Mode     
call               2   -none- call     
type               1   -none- character
predicted        100   factor numeric  
err.rate        1500   -none- numeric  
confusion          6   -none- numeric  
votes            200   matrix numeric  
oob.times        100   -none- numeric  
classes            2   -none- character
importance         1   -none- numeric  
importanceSD       0   -none- NULL     
localImportance    0   -none- NULL     
proximity          0   -none- NULL     
ntree              1   -none- numeric  
mtry               1   -none- numeric  
forest            14   -none- list     
y                100   factor numeric  
test               0   -none- NULL     
inbag              0   -none- NULL     
terms              3   terms  call  

我相信投票矩阵显示了从 0 到 1 有多少票,rF 给予 class 将每个案例验证为 class;不肥胖 = 0,肥胖 = 1:

> head(rf$votes, 20) 
           0          1
1  0.9318182 0.06818182
2  0.9325843 0.06741573
3  0.2784091 0.72159091
4  0.9040404 0.09595960
5  0.3865979 0.61340206
6  0.9689119 0.03108808
7  0.8187135 0.18128655
8  0.7170732 0.28292683
9  0.6931217 0.30687831
10 0.9831461 0.01685393
11 0.3425414 0.65745856
12 1.0000000 0.00000000
13 0.9728261 0.02717391
14 0.9848485 0.01515152
15 0.8783069 0.12169312
16 0.8553459 0.14465409
17 1.0000000 0.00000000
18 0.3389831 0.66101695
19 0.9316770 0.06832298
20 0.9435897 0.05641026

采取那些:

votes_2 <- rf$votes[,2]
votes_1 <- rf$votes[,1]

我的问题是为什么:

pROC::plot.roc(obese, votes_1)

pROC::plot.roc(obese, votes_2)

产生相同的结果。

首先要认识到的是,ROC 分析并不关心数据的确切值。相反,它会查看数据点的排名,以及排名如何分开。

其次,正如上面评论中提到的,在每个观察中,对 classes 0 和 1 的投票总和为 1。这意味着在排名方面,两者是等价的(对排序方向取模)。

最后一个难题是 pROC 不假设您提供的预测变量是属于正 class 的概率。相反,您可以传递任何类型的分数,并且会自动检测比较的方向。默认情况下这是静默完成的,但您可以通过将 quiet 标志设置为 FALSE:

来查看会发生什么
> pROC::roc(obese, votes_1, quiet = FALSE)
Setting levels: control = 0, case = 1
Setting direction: controls < cases

> pROC::roc(obese, votes_2, quiet = FALSE)
Setting levels: control = 0, case = 1
Setting direction: controls > cases

注意在 votes_2 的情况下,它如何检测到负数 class 具有更高的值(基于中位数)并相应地设置比较的方向。

如果这不是您想要的,您可以随时明确设置 class 级别和方向参数:

> pROC::roc(obese, votes_2, levels = c(0, 1), direction = "<")

这将导致 "reversed" 曲线显示 votes_2 在检测具有较高值的​​阳性 class 时表现如何比随机更差。