Làm thế nào để `dự đoán.randomForest` ước tính xác suất của lớp?


15

Làm thế nào để randomForestgói ước tính xác suất lớp khi tôi sử dụng predict(model, data, type = "prob")?

Tôi đã sử dụng rangerđể đào tạo các khu rừng ngẫu nhiên bằng cách sử dụng probability = Tđối số để dự đoán xác suất. rangernói trong tài liệu rằng nó:

Trồng rừng xác suất như ở Malley et al. (2012).

Tôi đã mô phỏng một số dữ liệu và thử cả hai gói và thu được kết quả rất khác nhau (xem mã bên dưới)

nhập mô tả hình ảnh ở đây

Vì vậy, tôi biết rằng nó sử dụng một kỹ thuật khác (sau đó là kiểm lâm) để ước tính xác suất. Nhưng cái nào?

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
Chỉ cần tò mò, sẽ ra prob_realsao?
Firebug

1
Xác suất phản ứng thực tế. Vì đây là mô phỏng nên tôi có cái này cho mỗi lần quan sát
Daniel Falbel

Câu trả lời:


17

Đó chỉ là tỷ lệ phiếu bầu của các cây trong đoàn.

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

Ngoài ra, nếu bạn nhân xác suất của mình với ntree, bạn sẽ nhận được kết quả tương tự, nhưng bây giờ tính bằng số thay vì tỷ lệ.

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

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

2
Cảm ơn! Bạn có biết tại sao tỷ lệ phiếu bầu tốt hơn rừng xác suất không? Hoặc bạn nghĩ rằng điều này xảy ra chỉ cho vấn đề này? Xem liên kết này (bằng tiếng Bồ Đào Nha)
Daniel Falbel

2
@DanielFalbel Trong khi tôi khá quen thuộc với việc randomForesttôi không hiểu biết nhiều ranger(thực tế, tôi chưa bao giờ sử dụng nó), vì vậy tôi sẽ không thể trả lời, tôi xin lỗi. Nhưng đó là một câu hỏi thú vị, có lẽ bạn có thể đưa ra một câu hỏi khác về cách cả hai chiến lược khác nhau.
Firebug

6

Malley (2012) có sẵn tại đây: http://dx.doi.org/10.3414%2FME00-01-0052 . Một tài liệu tham khảo đầy đủ là trong phần tài liệu tham khảo trong tài liệu kiểm lâm.

Nói tóm lại, mỗi cây dự đoán xác suất của lớp và các xác suất này được tính trung bình cho dự đoán rừng. Đối với hai lớp, điều này tương đương với một rừng hồi quy trên phản hồi được mã hóa 0-1.

Ngược lại, randomForestvới type="prob"mỗi cây dự đoán một lớp và xác suất được tính từ các lớp này.

Trong ví dụ ở đây tôi đã cố gắng sử dụng phân phối đồng đều thay vì phân phối bình thường để tạo xác suất và ở đây phương pháp khác dường như hoạt động tốt hơn. Tôi tự hỏi nếu những xác suất này thực sự là sự thật?

Nhân tiện, các kết quả tương tự như trong randomForeství dụ trên có thể đạt được với kiểm lâm bằng cách sử dụng phân loại và tính toán xác suất thủ công (sử dụng predict.all=TRUEtrong dự đoán).


bạn có thể thấy đó là những xác suất của phản ứng trong mã mô phỏng. Nhìn vào : Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). Đó là cách Y được tạo ra, tính tổng X1, X2, ..., X10 và sau đó lấy định lượng của phân phối chuẩn với mean = 5 tổng đại diện. Bạn có nghĩ rằng điều này có ý nghĩa?
Daniel Falbel

-1

Nếu bạn muốn ước tính xác suất Out-Of-Bag, bạn chỉ có thể thực hiện nó trong gói RandomForest trong R bằng cách sử dụng phiếu bầu $ model. Các ước tính xác suất khác không phải là OOB.


ước tính xác suất OOB là gì?
dùng158565

Đó là ra khỏi ước tính xác suất túi. Trong một khu rừng ngẫu nhiên, một cách họ ước tính xác suất liên quan đến mỗi lớp là họ tính tỷ lệ các cây được bình chọn cho mỗi lớp. Ước tính OOB sẽ làm tương tự nhưng chỉ tính số phiếu của những cây đó mà trường hợp đó không được sử dụng trong khóa đào tạo của họ (hay còn gọi là trường hợp không có trong túi)
Tối đa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.