'predict.randomForest`는 클래스 확률을 어떻게 추정합니까?


16

randomForest패키지를 사용할 때 클래스 확률 은 어떻게 추정 predict(model, data, type = "prob")됩니까?

나는 확률을 예측하기 ranger위해 probability = T인수를 사용하여 임의의 숲을 훈련 하는 데 사용했습니다 . ranger설명서에서 다음과 같이 말합니다.

Malley et al. (2012).

일부 데이터를 시뮬레이트하고 패키지를 모두 시도하고 매우 다른 결과를 얻었습니다 (아래 코드 참조)

여기에 이미지 설명을 입력하십시오

따라서 확률을 추정하기 위해 다른 기술 (그 다음 레인저)을 사용한다는 것을 알고 있습니다. 그러나 어느 것?

simulate_data <- function(n){
  X <- data.frame(matrix(runif(n*10), ncol = 10))
  Y <- data.frame(Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>%
                               pnorm(mean = 5)
                             ) %>% 
                    as.factor()

  ) 
  dplyr::bind_cols(X, Y)
}

treino <- simulate_data(10000)
teste <- simulate_data(10000)

library(ranger)
modelo_ranger <- ranger(Y ~., data = treino, 
                                num.trees = 100, 
                                mtry = floor(sqrt(10)), 
                                write.forest = T, 
                                min.node.size = 100, 
                                probability = T
                                )

modelo_randomForest <- randomForest(Y ~., data = treino,
                                    ntree = 100, 
                                    mtry = floor(sqrt(10)),
                                    nodesize = 100
                                    )

pred_ranger <- predict(modelo_ranger, teste)$predictions[,1]
pred_randomForest <- predict(modelo_randomForest, teste, type = "prob")[,2]
prob_real <- apply(teste[,1:10], 1, sum) %>% pnorm(mean = 5)

data.frame(prob_real, pred_ranger, pred_randomForest) %>%
  tidyr::gather(pacote, prob, -prob_real) %>%
  ggplot(aes(x = prob, y = prob_real)) + geom_point(size = 0.1) + facet_wrap(~pacote)

1
호기심에서, 무엇이 prob_real될까요?
Firebug

1
실제 반응 확률. 이것은 시뮬레이션이므로 각 관측치에 대해 이것을 가지고 있습니다
Daniel Falbel

답변:


17

앙상블에서 나무의 투표 비율에 불과합니다.

library(randomForest)

rf = randomForest(Species~., data = iris, norm.votes = TRUE, proximity = TRUE)
p1 = predict(rf, iris, type = "prob")
p2 = predict(rf, iris, type = "vote", norm.votes = TRUE)

identical(p1,p2)
#[1] TRUE

또는 확률에로 곱 ntree하면 같은 결과를 얻지 만 이제 비율 대신 개수로 계산합니다.

p1 = predict(rf, iris, type = "prob")
p2 = predict(rf, iris, type = "vote", norm.votes = FALSE)

identical(500*p1,p2)
#[1] TRUE

2
감사! 왜 확률 포레스트보다 투표 비율이 더 좋은지 아십니까? 아니면이 문제에 대해서만 발생한다고 생각하십니까? 이 링크 참조 (포르투갈어)
Daniel Falbel

2
와 @DanielFalbel는 동안 나는 아주 익숙 해요 randomForest나는에 대해 많은 지식이 아니에요 ranger(사실, 나는 그것을 사용하지 않음) 내가 대답 할 수 없을 것입니다, 그래서, 미안 해요. 그러나 흥미로운 질문입니다. 두 전략이 어떻게 다른지에 대해 또 다른 질문을 할 수 있습니다.
Firebug

6

Malley (2012)는 http://dx.doi.org/10.3414%2FME00-01-0052에서 제공 됩니다. 전체 참조는 레인저 설명서의 참조 부분에 있습니다.

즉, 각 트리는 클래스 확률을 예측하며 이러한 확률은 산림 예측에 대한 평균입니다. 두 클래스의 경우 0-1 코드 응답의 회귀 포리스트와 같습니다.

대조적으로, 각 나무 randomForest와 함께 type="prob"클래스를 예측하고 확률은 이러한 클래스에서 계산됩니다.

이 예에서는 확률을 생성하기 위해 정규 분포 대신 균일 분포를 사용하려고 시도했지만 다른 접근 방식이 더 나은 것으로 보입니다. 이 확률이 실제로 진실인지 궁금합니다.

그런데 randomForest분류 및 수동 확률 계산 ( predict.all=TRUE예측에 사용 )을 사용하여 레인저를 사용하여 위 의 예 와 동일한 결과를 얻을 수 있습니다 .


이것이 시뮬레이션 코드에서 응답의 확률이라는 것을 알 수 있습니다. 을보십시오 : Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). 이것이 Y가 생성되고 X1, X2, ..., X10을 합한 다음 평균이 5 인 정규 분포의 Quantile을 얻는 방법입니다. 이것이 의미가 있다고 생각합니까?
Daniel Falbel

-1

가방 외부 확률 추정치가 필요한 경우 model $ votes를 사용하여 R의 randomForest 패키지에서만 수행 할 수 있습니다. 다른 확률 추정치는 OOB가 아닙니다.


OOB 확률 추정치는 무엇입니까?
user158565

예상치 못한 확률입니다. 임의 포리스트에서 각 클래스와 관련된 확률을 추정하는 한 가지 방법은 각 클래스에 대해 투표 한 나무의 비율을 계산하는 것입니다. 아웃 오브 밴드 추정치는 동일한 기능을 수행하지만 (인스턴스에 가방이 아니었다 일명) 인스턴스가 훈련에 사용되지 않았 음을 그 나무 '개표 것
최대
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.