Bagaimana cara mengubah ambang batas untuk klasifikasi dalam R randomForests?

10

Semua literatur Pemodelan Distribusi Spesies menunjukkan bahwa ketika memprediksi ada / tidaknya suatu spesies menggunakan model yang menghasilkan probabilitas (misalnya, RandomForests), pilihan ambang batas probabilitas yang digunakan untuk benar-benar mengklasifikasikan suatu spesies sebagai ada atau tidaknya adalah penting dan kita harus tidak selalu mengandalkan default 0,5. Saya butuh bantuan dengan ini! Ini kode saya:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

Dari ini saya menentukan bahwa ambang yang ingin saya gunakan untuk mengklasifikasikan kehadiran dari probabilitas yang diprediksi adalah 0,7, bukan default 0,5. Saya tidak sepenuhnya mengerti apa yang harus dilakukan dengan informasi ini. Apakah saya cukup menggunakan ambang ini saat membuat peta output saya? Saya dapat dengan mudah membuat output yang dipetakan dengan probabilitas kontinu kemudian hanya mengklasifikasi ulang mereka yang memiliki nilai lebih dari 0,7 sebagai hadiah, dan yang <0,7 tidak ada.

Atau, apakah saya ingin mengambil informasi ini dan menjalankan kembali pemodelan randomForests saya, menggunakan parameter cut-off? Apa sebenarnya yang dilakukan parameter cut-off? Apakah itu mengubah suara yang dihasilkan? (saat ini mengatakan itu adalah "mayoritas"). Bagaimana cara saya menggunakan parameter cut-off ini? Saya tidak mengerti dokumentasinya! Terima kasih!

sth
sumber
2
Saya akan mengatakan ini mungkin termasuk di sini: Masalah (1) estimasi probabilitas dari RF, (2) apakah Anda dapat memaksakan fungsi biaya pada model atau harus memasukkannya ke dalam model, dan (3) bagaimana menerapkan fungsi biaya dalam RF adalah masalah berulang yang tidak hanya terkait dengan pemrograman.
charles

Jawaban:

7

#set ambang batas atau nilai cutoff ke 0,7

cutoff=0.7

Nilai #all lebih rendah dari nilai cutoff 0.7 akan diklasifikasikan sebagai 0 (ada dalam kasus ini)

RFpred[RFpred<cutoff]=0

Nilai #all lebih besar dari nilai cutoff 0.7 akan diklasifikasikan sebagai 1 (tidak ada dalam kasus ini)

 RFpred[RFpred>=cutoff]=1
banjir
sumber
1
Bisakah Anda sedikit memperluas jawaban Anda? Paling tidak itu akan berguna untuk membubuhi keterangan kode Anda.
Patrick Coulombe
2
FWIW, saya pikir ini sudah cukup.
Sycorax berkata Reinstate Monica
Jawaban ini sangat masuk akal. Saya setuju.
Seanosapien
7

Maaf Anda belum mendapatkan dan mencoba jawaban. Akan merekomendasikan buku Max Kuhn untuk liputan masalah ini. Ini adalah masalah yang cukup luas. Cukup tambahkan beberapa bit:

  1. Kurva ROC populer, tetapi hanya masuk akal jika Anda mencoba memahami pertukaran antara biaya Hasil Negatif Palsu dan Hasil Positif Palsu. Jika CostFN = CostFP maka tidak yakin mereka masuk akal. Statistik-c dan tindakan turunan lainnya masih ada gunanya. Jika Anda ingin memaksimalkan akurasi - tune model Anda untuk ini (paket caret membuatnya mudah), jangan membuat kurva ROC.
  2. Semua orang menggunakan probabilitas yang berasal dari model RF. Saya pikir berpikir beberapa pemikiran harus diberikan untuk melakukan ini - ini bukan model probabilistik, mereka tidak dibangun untuk melakukan ini. Ini sering berhasil. Paling tidak saya akan menghasilkan plot validasi probabilitas RF pada data baru jika saya benar-benar tertarik pada probabilitas
  3. Cara paling sederhana adalah dengan menggunakan "cukup mereklasifikasi mereka yang memiliki nilai lebih dari 0,7 sebagai hadiah, dan mereka yang <0,7 tidak ada".
  4. Jika biaya (FN) tidak sama dengan biaya (FP), maka Anda perlu membuat RF sensitif biaya. R tidak membuat ini mudah. Fungsi pembobotan dalam paket RandomForest tidak berfungsi. Pilihan terbaik adalah bermain-main dengan sampel, kasus mayoritas undersample untuk mendapatkan fungsi biaya yang Anda inginkan. Tetapi hubungan antara rasio sampel dan biaya tidak langsung. Jadi, Anda mungkin ingin tetap dengan (3)

Pembaruan Mengenai bobot kelas Andy Liaw:
Opsi "classwt" saat ini dalam paket randomForest telah ada sejak awal, dan berbeda dari bagaimana kode Fortran resmi (versi 4 dan yang lebih baru) mengimplementasikan bobot kelas. Ini hanya memperhitungkan kelas. Bobot dalam perhitungan indeks Gini ketika membelah node, persis seperti bagaimana pohon CART tunggal dilakukan ketika diberi bobot kelas. Prof Breiman datang dengan skema pembobotan kelas yang lebih baru diimplementasikan dalam versi yang lebih baru dari kode Fortran setelah kami menemukan bahwa hanya menggunakan bobot dalam indeks Gini tampaknya tidak banyak membantu dalam data yang sangat tidak seimbang (katakanlah 1: 100 atau lebih buruk) .Jika menggunakan Gini yang tertimbang membantu dalam situasi Anda, tentu saja lakukanlah. Saya hanya dapat mengatakan bahwa di masa lalu itu tidak memberi kami hasil yang kami harapkan. "

charles
sumber
Bisakah Anda menguraikan tentang pada subpoin (4) mengapa argumen pembobotan tidak bekerja?
Sycorax berkata Reinstate Monica
2
Pemahaman saya adalah bahwa itu diterapkan dengan tepat dalam kode Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ) tetapi bukan paket R. Ini dibahas: ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html ) dan pusat-pusat di sekitar perlu menggunakan bobot pada semua tahap pembangunan pohon - bukan hanya perpecahan Gini. Jadi implementasi R saat ini - yang hanya menggunakan pembobotan saat split tidak bekerja dengan baik
charles