Hutan dan prediksi acak


13

Saya mencoba memahami cara kerja Random Forest. Saya memiliki pemahaman tentang bagaimana pohon dibangun tetapi tidak dapat memahami bagaimana Random Forest membuat prediksi dari sampel kantong. Adakah yang bisa memberi saya penjelasan sederhana, tolong? :)

Jawaban:


16

Setiap pohon di hutan dibangun dari sampel bootstrap pengamatan dalam data pelatihan Anda. Pengamatan dalam sampel bootstrap membangun pohon, sementara yang tidak dalam sampel bootstrap membentuk sampel out-of-bag (atau OOB).

Seharusnya jelas bahwa variabel yang sama tersedia untuk kasus dalam data yang digunakan untuk membangun pohon seperti halnya kasus dalam sampel OOB. Untuk mendapatkan prediksi untuk sampel OOB, masing-masing diturunkan pohon saat ini dan aturan untuk pohon diikuti sampai tiba di simpul terminal. Itu menghasilkan prediksi OOB untuk pohon tertentu.

Proses ini diulang berkali-kali, setiap pohon dilatih tentang sampel bootstrap baru dari data pelatihan dan prediksi untuk sampel OOB baru yang diturunkan.

Ketika jumlah pohon bertambah, salah satu sampel akan berada dalam sampel OOB lebih dari satu kali, sehingga "rata-rata" dari prediksi atas pohon N di mana sampel berada di OOB digunakan sebagai prediksi OOB untuk setiap sampel pelatihan untuk pohon 1, ..., N. Dengan "rata-rata" kami menggunakan rata-rata prediksi untuk tanggapan terus-menerus, atau suara mayoritas dapat digunakan untuk respons kategoris (suara mayoritas adalah kelas dengan suara terbanyak di antara set pohon 1, ..., N).

Misalnya, asumsikan kami memiliki prediksi OOB berikut untuk 10 sampel dalam pelatihan yang ditetapkan pada 10 pohon

set.seed(123)
oob.p <- matrix(rpois(100, lambda = 4), ncol = 10)
colnames(oob.p) <- paste0("tree", seq_len(ncol(oob.p)))
rownames(oob.p) <- paste0("samp", seq_len(nrow(oob.p)))
oob.p[sample(length(oob.p), 50)] <- NA
oob.p

> oob.p
       tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1     NA    NA     7     8     2     1    NA     5     3      2
samp2      6    NA     5     7     3    NA    NA    NA    NA     NA
samp3      3    NA     5    NA    NA    NA     3     5    NA     NA
samp4      6    NA    10     6    NA    NA     3    NA     6     NA
samp5     NA     2    NA    NA     2    NA     6     4    NA     NA
samp6     NA     7    NA     4    NA     2     4     2    NA     NA
samp7     NA    NA    NA     5    NA    NA    NA     3     9      5
samp8      7     1     4    NA    NA     5     6    NA     7     NA
samp9      4    NA    NA     3    NA     7     6     3    NA     NA
samp10     4     8     2     2    NA    NA     4    NA    NA      4

Di mana NAberarti sampel ada dalam data pelatihan untuk pohon itu (dengan kata lain itu tidak ada dalam sampel OOB).

Nilai tengah dari NAnilai-nilai untuk setiap baris memberikan prediksi OOB untuk setiap sampel, untuk seluruh hutan

> rowMeans(oob.p, na.rm = TRUE)
 samp1  samp2  samp3  samp4  samp5  samp6  samp7  samp8  samp9 samp10 
  4.00   5.25   4.00   6.20   3.50   3.80   5.50   5.00   4.60   4.00

Karena setiap pohon ditambahkan ke hutan, kita dapat menghitung kesalahan OOB hingga termasuk pohon itu. Misalnya, di bawah ini adalah cara kumulatif untuk setiap sampel:

FUN <- function(x) {
  na <- is.na(x)
  cs <- cumsum(x[!na]) / seq_len(sum(!na))
  x[!na] <- cs
  x
}
t(apply(oob.p, 1, FUN))

> print(t(apply(oob.p, 1, FUN)), digits = 3)
       tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1     NA    NA  7.00  7.50  5.67  4.50    NA   4.6  4.33    4.0
samp2      6    NA  5.50  6.00  5.25    NA    NA    NA    NA     NA
samp3      3    NA  4.00    NA    NA    NA  3.67   4.0    NA     NA
samp4      6    NA  8.00  7.33    NA    NA  6.25    NA  6.20     NA
samp5     NA     2    NA    NA  2.00    NA  3.33   3.5    NA     NA
samp6     NA     7    NA  5.50    NA  4.33  4.25   3.8    NA     NA
samp7     NA    NA    NA  5.00    NA    NA    NA   4.0  5.67    5.5
samp8      7     4  4.00    NA    NA  4.25  4.60    NA  5.00     NA
samp9      4    NA    NA  3.50    NA  4.67  5.00   4.6    NA     NA
samp10     4     6  4.67  4.00    NA    NA  4.00    NA    NA    4.0

Dengan cara ini kita melihat bagaimana prediksi terakumulasi di atas N pohon di hutan hingga iterasi yang diberikan. Jika Anda membaca melintasi baris, nilai paling tidak tepat NAadalah yang saya perlihatkan di atas untuk prediksi OOB. Itulah bagaimana jejak kinerja OOB dapat dibuat - RMSEP dapat dihitung untuk sampel OOB berdasarkan prediksi OOB yang terakumulasi secara kumulatif di atas pohon N.

Perhatikan bahwa kode R yang ditampilkan tidak diambil dari internal kode randomForest dalam paket randomForest untuk R - Saya baru saja mengetuk beberapa kode sederhana sehingga Anda dapat mengikuti apa yang terjadi setelah prediksi dari setiap pohon ditentukan.

Itu karena setiap pohon dibangun dari sampel bootstrap dan bahwa ada sejumlah besar pohon di hutan acak, sehingga setiap pengamatan set pelatihan dalam sampel OOB untuk satu atau lebih pohon, prediksi OOB dapat disediakan untuk semua sampel dalam data pelatihan.

Saya telah membahas masalah seperti data yang hilang untuk beberapa kasus OOB dll, tetapi masalah ini juga berkaitan dengan satu regresi atau pohon klasifikasi. Perhatikan juga bahwa setiap pohon di hutan hanya menggunakan mtryvariabel yang dipilih secara acak.


Jawaban bagus Gavin! Ketika Anda menulis "To get predictions for the OOB sample, each one is passed down the current tree and the rules for the tree followed until it arrives in a terminal node", apakah Anda memiliki penjelasan sederhana tentang apa rules for the treeitu? Dan apakah saya mengerti samplesebagai baris dengan benar jika saya mengerti bahwa sampel adalah groupspengamatan yang membagi pohon data?
user1665355

@ user1665355 Saya kira Anda mengerti bagaimana pohon regresi atau klasifikasi dibangun? Pohon-pohon di RF tidak berbeda (kecuali mungkin dalam aturan berhenti). Setiap pohon membagi data pelatihan menjadi kelompok sampel dengan "nilai" yang sama untuk respons. Variabel dan lokasi pemisahan (mis. PH> 4.5) yang paling baik diprediksi (yaitu meminimalkan "kesalahan") membentuk pemisahan pertama atau aturan di pohon. Setiap cabang dari perpecahan ini kemudian dipertimbangkan secara bergantian dan pemisahan / aturan baru diidentifikasi yang meminimalkan "kesalahan" pohon. Ini adalah algoritma partisi rekursif biner. Perpecahan adalah aturannya.
Reinstate Monica - G. Simpson

@ user1665355 Ya, maaf saya berasal dari bidang di mana sampel adalah observasi, satu baris dalam kumpulan data. Tetapi ketika Anda mulai berbicara tentang sampel bootstrap, itu adalah serangkaian pengamatan N, diambil dengan penggantian dari data pelatihan dan karenanya memiliki N baris atau pengamatan. Saya akan mencoba untuk membersihkan terminologi saya nanti.
Reinstate Monica - G. Simpson

Terima kasih! Saya sangat baru di RF sangat menyesal untuk pertanyaan bodoh mungkin :) Saya pikir saya mengerti hampir semua yang Anda tulis, penjelasan yang sangat bagus! Saya hanya ingin tahu tentang Variabel dan lokasi split (misalnya pH> 4,5) yang paling baik memprediksi (yaitu meminimalkan "kesalahan") membentuk pemisahan pertama atau aturan di pohon ... Saya tidak bisa mengerti apa kesalahannya. : / Saya sedang membaca dan berusaha memahami http://www.ime.unicamp.br/~ra109078/PED/Data%20Minig%20with%20R/Data%20Mining%20with%20R.pdf. Pada halaman 115-116 penulis menggunakan RF untuk memilih variable importanceindikator teknis.
user1665355

"Kesalahan" tergantung pada jenis pohon apa yang dipasang. Penyimpangan adalah ukuran yang biasa untuk tanggapan kontinu (Gaussian). Dalam paket rpart, koefisien Gini adalah default untuk respons kategoris, tetapi ada yang lain untuk model yang berbeda, dll. Anda harus memanfaatkan buku bagus tentang Trees dan RF jika Anda ingin menggunakannya dengan sukses. Variabel Imprortance ukuran adalah sesuatu yang berbeda - mereka mengukur "kepentingan" dari setiap variabel dalam kumpulan data dengan melihat seberapa banyak sesuatu berubah ketika variabel itu digunakan agar sesuai dengan pohon dan ketika variabel itu tidak digunakan.
Reinstate Monica - G. Simpson
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.