肥胖是一个二进制响应变量,其中1表示肥胖,0表示不肥胖。 体重是一个连续的预测指标。
使用RF对肥胖进行分类:
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可以将每种情况分类到任一类别;不肥胖= 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)
产生相同的结果。
答案 0 :(得分:0)
首先要意识到的是,ROC分析并不关心数据的确切值。取而代之的是,它查看数据点上的排名以及排名如何分离。
第二,正如上面的评论中提到的,在每个观察中,类别0和1的投票总计为1。这意味着就排名而言,两者是等效的(对排序方向取模)。
最后一个难题是,pROC不会假设您提供的预测变量是属于肯定类别的概率。相反,您可以通过任何分数,并且比较的方向会自动检测到。默认情况下,此操作是无提示的,但是您可以通过将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
的情况下,它如何检测到否定类别的值更高(基于中位数),并相应地设置比较的方向。
如果这不是您想要的,则始终可以显式设置类级别和方向参数:
> pROC::roc(obese, votes_2, levels = c(0, 1), direction = "<")
这将导致显示一条“反向”曲线,显示votes_2
在检测具有较高值的阳性类别时表现比随机性差。