Кривые ROC для произвольного леса подбирают объекты, используя pROC в R, чтобы использовать положительные или отрицательные «голоса» в качестве предиктора - PullRequest
1 голос
/ 21 марта 2019

Ожирение - это двоичный ответ var, где 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, дает РФ, чтобы классифицировать каждый случай в любом классе;не тучный = 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)

дают тот же результат.

1 Ответ

0 голосов
/ 21 марта 2019

Первое, что нужно понять, это то, что анализ 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 работает хуже, чем случайный, при обнаружении положительного класса с более высокими значениями.

...