Bagaimana cara memperkirakan probabilitas kelas `predict.randomForest`?


15

Bagaimana randomForestpaket memperkirakan probabilitas kelas saat saya menggunakan predict(model, data, type = "prob")?

Saya menggunakan rangeruntuk melatih hutan acak menggunakan probability = Targumen untuk memprediksi probabilitas. rangermengatakan dalam dokumentasi bahwa:

Menumbuhkan hutan probabilitas seperti di Malley et al. (2012).

Saya mensimulasikan beberapa data dan mencoba kedua paket dan memperoleh hasil yang sangat berbeda (lihat kode di bawah)

masukkan deskripsi gambar di sini

Jadi saya tahu itu menggunakan teknik yang berbeda (kemudian ranger) untuk memperkirakan probabilitas. Tapi yang mana?

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
Hanya karena penasaran, apa yang akan terjadi prob_real?
Firebug

1
Probabilitas respons nyata. Karena ini adalah simulasi, saya punya ini untuk setiap pengamatan
Daniel Falbel

Jawaban:


17

Itu hanya proporsi suara dari pohon-pohon di ansambel.

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

Atau, jika Anda melipatgandakan probabilitas Anda dengan ntree Anda, Anda mendapatkan hasil yang sama, tetapi sekarang dalam hitungan, bukan proporsi.

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

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

2
Terima kasih! Apakah Anda tahu mengapa proporsi suara lebih baik daripada probabilitas hutan? Atau Anda pikir ini terjadi hanya untuk masalah ini? Lihat tautan ini (dalam bahasa portugis)
Daniel Falbel

2
@DanielFalbel Sementara saya cukup terbiasa dengan randomForestsaya tidak banyak pengetahuan tentang ranger(pada kenyataannya, saya tidak pernah menggunakannya), jadi saya tidak akan bisa menjawab, saya minta maaf. Tapi ini pertanyaan yang menarik, mungkin Anda bisa mengajukan pertanyaan lain tentang bagaimana kedua strategi itu berbeda.
Firebug

6

The Malley (2012) tersedia di sini: http://dx.doi.org/10.3414%2FME00-01-0052 . Referensi lengkap ada di bagian referensi dalam dokumentasi ranger.

Singkatnya, setiap pohon memprediksi probabilitas kelas dan probabilitas ini dirata-ratakan untuk prediksi hutan. Untuk dua kelas, ini setara dengan hutan regresi pada respon kode 0-1.

Sebaliknya, randomForestdengantype="prob" setiap pohon memprediksi suatu kelas dan probabilitas dihitung dari kelas-kelas ini.

Dalam contoh di sini saya mencoba menggunakan distribusi seragam daripada distribusi normal untuk menghasilkan probabilitas, dan di sini pendekatan lain tampaknya berkinerja lebih baik. Saya ingin tahu apakah probabilitas ini benar-benar kebenaran?

Omong-omong, hasil yang sama seperti dalam randomForestcontoh di atas dapat dicapai dengan ranger dengan menggunakan klasifikasi dan perhitungan probabilitas manual (digunakan predict.all=TRUEdalam prediksi).


Anda dapat melihat bahwa itu adalah probabilitas respons dalam kode simulasi. Lihatlah: Y = rbinom(n, size = 1, prob = apply(X, 1, sum) %>% pnorm(mean = 5)). Begitulah cara Y dihasilkan, menjumlahkan X1, X2, ..., X10 dan kemudian mendapatkan kuantil dari distribusi normal dengan mean = 5 jumlah yang diwakilinya. Apakah menurut Anda ini masuk akal?
Daniel Falbel

-1

Jika Anda ingin estimasi probabilitas Out-Of-Bag, Anda hanya bisa melakukannya dalam paket randomForest di R menggunakan model $ votes. Estimasi probabilitas lainnya bukan OOB.


apa estimasi probabilitas OOB?
user158565

Ini di luar perkiraan probabilitas tas. Di hutan acak, salah satu cara mereka memperkirakan probabilitas yang terkait dengan setiap kelas adalah mereka menghitung proporsi pohon yang memberikan suara untuk setiap kelas. Perkiraan OOB akan melakukan hal yang sama tetapi hanya menghitung suara pohon-pohon bahwa instance tidak digunakan dalam pelatihan mereka (alias instance tidak di dalam tas)
Max
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.