Bagaimana cara menafsirkan OOB dan matriks kebingungan untuk hutan acak?

35

Saya mendapat skrip R dari seseorang untuk menjalankan model hutan acak. Saya memodifikasi dan menjalankannya dengan beberapa data karyawan. Kami mencoba memprediksi pemisahan sukarela.

Berikut adalah beberapa info tambahan: ini adalah model klasifikasi yang 0 = karyawan tetap, 1 = karyawan diberhentikan, saat ini kami hanya melihat selusin variabel prediktor, data "tidak seimbang" di mana catatan term'd membuat sekitar 7 % dari total catatan yang ditetapkan.

Saya menjalankan model dengan berbagai pilihan mtry dan ntree tetapi diselesaikan di bawah ini. OOB adalah 6,8% yang menurut saya baik tetapi matriks kebingungan tampaknya menceritakan kisah yang berbeda untuk memprediksi istilah karena tingkat kesalahan cukup tinggi pada 92,79% Apakah saya benar dalam berasumsi bahwa saya tidak dapat mengandalkan dan menggunakan model ini karena tingkat kesalahan tinggi untuk memprediksi istilah? atau ada sesuatu yang juga bisa saya lakukan untuk menggunakan RF dan mendapatkan tingkat kesalahan yang lebih kecil untuk memprediksi istilah?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908
daniellopez46
sumber

Jawaban:

20

Matriks kebingungan dihitung pada titik tertentu yang ditentukan oleh cutoff pada suara. Bergantung pada kebutuhan Anda, yaitu, ketepatan yang lebih baik (mengurangi positif palsu) atau sensitivitas yang lebih baik (mengurangi negatif palsu), Anda mungkin lebih suka cutoff yang berbeda.

Untuk tujuan ini saya sarankan untuk merencanakan (i) kurva ROC , (ii) presisi ingat dan (iii) kurva kalibrasi untuk memilih cutoff yang paling sesuai dengan tujuan Anda. Semua ini dapat dengan mudah diplot menggunakan 2 fungsi berikut dari pustaka ROCR R (tersedia juga di CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Sebagai contoh:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);
Itamar
sumber
Saya tertarik dengan jawaban Anda, saya merencanakan dengan kode yang Anda bagikan. tolong beri saya beberapa sumber untuk menemukan sedikit detail tentang plot yang Anda sarankan. atau akan menulis beberapa kalimat tentang bagaimana menafsirkannya. banyak terima kasih sebelumnya.
MKS
Saya menyarankan Anda mulai dengan entri untuk kurva ROC yang tertaut ke atas dan entri lain yang disebutkan di sana.
Itamar
Jawabannya tidak secara langsung membahas batasan pohon keputusan dalam kumpulan data yang sangat miring.
SmallChess
19

Set Anda sangat tidak seimbang - RF biasanya gagal dalam skenario ini (yaitu hanya memprediksi kelas yang lebih besar).

Anda harus mencoba menyeimbangkan set Anda dengan mengambil sampel kelas "0" hanya untuk memiliki ukuran yang sama dengan kelas "1" atau dengan bermain dengan classwtparameter.


sumber
1
Meskipun ada classwtparameter, saya pikir ini belum diimplementasikan dalam randomForest()fungsi randomForestpaket di R. Per Link . Sudahkah Anda menggunakannya sebelumnya? Saya mencobanya dengan nilai yang berbeda tetapi mendapat hasil yang identik dengan default classwt=NULL.
Zhubarb
9

Berdasarkan matriks kebingungan Anda, Anda memiliki 5.908 titik data dan sebagian besar, sebagian besar dari mereka adalah tipe 0 ('karyawan tetap'). Pengklasifikasi karena itu bisa lolos dengan menjadi "malas" dan memilih kelas mayoritas kecuali jika benar-benar yakin bahwa contoh milik kelas lain. Perhatikan bahwa tingkat kesalahan keseluruhan Anda adalah ~ 7%, yang cukup dekat dengan persentase contoh Class1!

Anda punya beberapa opsi:

  • Buang contoh Class0 sampai Anda memiliki kelas yang kurang lebih seimbang. Saya tidak tahu apakah ada literatur tentang cara memilih subset representatif yang optimal (mungkin orang lain dapat mempertimbangkan?), Tetapi Anda bisa mulai dengan memberikan contoh secara acak. Anda bisa meneruskan subsetargumen ke randomForest, yang seharusnya membuat ini sepele untuk diuji.

  • Sesuaikan fungsi kerugian / bobot kelas Anda untuk mengimbangi jumlah Kelas0 yang tidak proporsional. Anda pada dasarnya ingin membuatnya jauh lebih mahal bagi classifier untuk melakukan kesalahan klasifikasi contoh Class1 daripada Class0 satu. Mungkin masuk akal untuk mencoba Kelas 0 = 1 / 0,07 ~ = 14x Kelas1 untuk memulai, tetapi Anda mungkin ingin menyesuaikan ini berdasarkan permintaan bisnis Anda (seberapa parah salah satu jenis kesalahan). Saya pikir classwtparameternya adalah apa yang Anda cari di sini.

  • Gunakan pengambilan sampel bertingkat untuk memastikan bahwa Anda mendapatkan contoh dari kedua kelas dalam data pelatihan pohon. Ada kemungkinan bahwa beberapa pohon Anda dilatih hanya pada data Class0, yang jelas akan menjadi pertanda buruk untuk kinerja generalisasi mereka. Lihat strataargumennya.

Matt Krause
sumber
Memilih secara acak dari kelas dominan terdengar masuk akal. Mereka tidak perlu sama: bahkan rasio 1: 5 harus menjadi peningkatan.
Itamar
@ Itmar, itu pasti yang akan saya coba dulu. Namun, sepertinya harus ada cara untuk memastikan bahwa contoh yang Anda simpan mewakili kumpulan data yang lebih besar.
Matt Krause
1
Salah satu opsi bisa menjalankan PCA (analisis komponen utama) pada perangkat yang lebih besar, mengelompokkan poin sesuai dengan komponen prinsip pertama dan memilih satu sampel dari masing-masing cluster.
Itamar