Cara membuat pohon-pohon hutan acak memilih desimal tetapi tidak biner

9

Pertanyaan saya adalah tentang klasifikasi biner, katakanlah memisahkan pelanggan yang baik dari pelanggan yang buruk, tetapi bukan regresi atau klasifikasi non-biner. Dalam konteks ini, hutan acak adalah ansambel pohon klasifikasi. Untuk setiap pengamatan, setiap pohon memilih "ya" atau "tidak", dan suara rata-rata dari semua pohon adalah probabilitas hutan akhir.

Pertanyaan saya adalah tentang memodifikasi perilaku pohon yang mendasarinya: Bagaimana kita bisa memodifikasi fungsi randomForest (dari paket randomForest dari R) sehingga setiap pohon memilih desimal alih-alih biner ya / tidak. Untuk lebih memahami apa yang saya maksud dengan desimal, mari kita pikirkan tentang cara kerja pohon keputusan.

Pohon keputusan yang telah dewasa memiliki 1 instance baik atau 1 buruk di node terminalnya. Asumsikan bahwa saya membatasi ukuran simpul terminal sebagai 100. Kemudian simpul terminal akan terlihat seperti:

Node1 = 80 buruk, 20 baik
Node2 = 51 buruk, 49 baik
Node3 = 10 buruk, 90 bagus

Perhatikan, meskipun Node1 dan Node2 memilih "buruk", "kekuatan kejahatan" mereka sangat berbeda. Itulah yang saya cari. Alih-alih meminta mereka menghasilkan 1 atau 0 (yang merupakan perilaku default) dapatkah seseorang memodifikasi paket R sehingga mereka memilih 80/100, 51/100, 10/100 dll?

FatihAkici
sumber
Hanya ingin memasukkan tautan berikut ke diskusi terkait: stackoverflow.com/questions/22409019/...
FatihAkici
Maksud Anda, Anda menginginkan probabilitas prediksi yang sebenarnya , bukan hanya kelas prediksi yang paling mungkin.
smci
Ya @smci tepatnya.
FatihAkici

Jawaban:

10

Ini adalah titik halus yang bervariasi dari perangkat lunak ke perangkat lunak. Ada dua metode utama yang saya ketahui:

  1. Daun biner - Setiap daun memilih sebagai mayoritas. Ini adalah cara randomForestkerjanya di R, bahkan saat menggunakanpredict(..., type="prob")
  2. Daun proporsi - Setiap daun mengembalikan proporsi sampel pelatihan milik masing-masing kelas. Beginilah cara sklearn.ensemble.RandomForestClassifier.predict_probakerjanya. Dalam jawaban lain, @ usεr11852 menunjukkan bahwa rangerpaket R juga menyediakan fungsi ini. Untungnya, saya dapat membuktikan bahwa dari penggunaan saya yang terbatas, rangerjuga jauh lebih cepat daripada randomForest.

Saya tidak berpikir bahwa ada cara mudahrandomForest untuk menggunakan metode daun proporsional, karena perangkat lunak R sebenarnya hanya hook ke dalam program C & FORTRAN. Kecuali Anda menikmati memodifikasi kode orang lain, Anda harus menulis sendiri, atau menemukan implementasi perangkat lunak lain.

Sycorax berkata Reinstate Monica
sumber
Terima kasih banyak, Sycorax. Apakah Anda pikir kode sumber R's randomForest dapat dimodifikasi untuk menyertai ini?
FatihAkici
Dengan sumber daya yang cukup, perangkat lunak apa pun dapat dimodifikasi untuk melakukan apa saja. Di sisi lain, randomForesthanya antarmuka R ke dalam kode FORTRAN, jadi mungkin diperlukan sumber daya yang cukup untuk menyelesaikannya.
Sycorax berkata Reinstate Monica
@FatihAkici Sebenarnya, sepertinya saya salah. Kode yang dikompilasi adalah port C dari kode FORTRAN asli Breiman.
Sycorax berkata Reinstate Monica
5
Saya mengerjakan paket randomForest untuk musim panas 2015 sebagai bagian dari REU. Sangat mungkin untuk memodifikasi kode untuk melakukan ini, tetapi agak rumit karena itu sebenarnya campuran C-Fortran. Sebagian besar kode "luar" adalah C, sementara beberapa fungsi inti tetap ada di Fortran, dan dihubungkan setelah dikompilasi. Sayangnya, sudah terlalu lama sejak saya melihat kode untuk mengetahui ke mana harus mencari. tapi saya sarankan sedang bersiap untuk bekerja di C dan Fortran jika Anda ingin memodifikasi paket.
chipbuster
5

Sangat mungkin untuk menumbuhkan "hutan probabilitas". Metodologi dalam Malley et al. (2012) " Mesin probabilitas: estimasi probabilitas konsisten menggunakan mesin pembelajaran nonparametrik. " Yang menguraikan bagaimana hal ini dilakukan dan bagaimana membandingkannya dengan implementasi hutan acak standar. Selain itu, ranger paket R yang luar biasa sudah mengimplementasikan fungsi ini; hanya mengatur ketika membuat panggilan fungsi ke .probability = TRUEranger

usεr11852
sumber
2

Cukup gunakan predict.randomForest(..., type="prob"). Anda melakukan Good Thing .

Stephan Kolassa
sumber
2
Stephan, terima kasih atas jawaban Anda, tetapi bukan itu yang saya cari. Kode yang Anda sebutkan mengambil rata-rata suara pohon biner yang mendasarinya, tetapi saya mencoba untuk membuat suara pohon yang mendasari desimal. Jadi di hutan 3 pohon, saya tidak ingin (1 + 1 + 0) / 3, bukan (.80 + .51 + .10) / 3. Apakah itu masuk akal?
FatihAkici
2
Itu masuk akal, dan itulah perilaku pengelompokan hutan acak di sklearn: scikit-learn.org/stable/modules/generated/…
psarka
1
Ah, saya mengerti maksud Anda. Maaf, saya salah paham. Dilihat dari halaman bantuan dan melihat pada predict.alldan norm.votesparameter, ini sepertinya tidak mungkin. Jika Anda benar-benar menginginkan ini, Anda mungkin perlu membuat kode hutan acak Anda sendiri. Saya setuju dengan @psarka bahwa ini masuk akal. (Saya akan menghapus jawaban ini, tetapi kemudian kita akan kehilangan diskusi ini di komentar.)
Stephan Kolassa
Itu memang diskusi yang sangat bermanfaat, Stephan dan @psarka yang terkasih. Terima kasih!
FatihAkici