Cara terbaik untuk menyajikan hutan acak dalam publikasi?

75

Saya menggunakan algoritma hutan acak sebagai penggolong kuat dari dua kelompok dalam studi microarray dengan ribuan fitur.

  • Apa cara terbaik untuk menyajikan hutan acak sehingga ada cukup informasi untuk membuatnya dapat diproduksi ulang di kertas?
  • Apakah ada metode plot dalam R untuk benar-benar plot pohon, jika ada sejumlah kecil fitur?
  • Apakah estimasi tingkat kesalahan OOB statistik terbaik untuk mengutip?
danielsbrewer
sumber
2
Tidak ada satu pohon pun ... Tetapi lihat jawaban @ Shane untuk merencanakan salah satunya untuk tujuan ilustrasi.
chl
Saya tentu layak dipertimbangkan randomForest :: partialPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling
1
Anda dapat mencoba paket visualisasi hutan acak saya, forestFloor
Soren Havelund Welling

Jawaban:

48

Mengenai membuatnya dapat direproduksi, cara terbaik adalah memberikan penelitian yang dapat direproduksi (yaitu kode dan data) bersama dengan makalah. Jadikan tersedia di situs web Anda, atau di situs hosting (seperti github).

Mengenai visualisasi, Leo Breiman telah melakukan beberapa pekerjaan yang menarik dalam hal ini (lihat homepage-nya , khususnya pada bagian grafis ).

Tetapi jika Anda menggunakan R, maka randomForestpaket tersebut memiliki beberapa fungsi yang berguna:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

Dan

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

Saya tidak mengetahui cara sederhana untuk benar-benar plot pohon, tetapi Anda dapat menggunakan getTreefungsi untuk mengambil pohon dan plot itu secara terpisah.

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

The Strobl / Zeileis presentasi tentang "Mengapa dan bagaimana menggunakan langkah-langkah penting variabel hutan random (dan bagaimana Anda tidak harus)" memiliki contoh pohon yang harus telah diproduksi dengan cara ini. Posting blog ini pada model pohon memiliki beberapa contoh bagus plot pohon CART yang dapat Anda gunakan misalnya.

Seperti yang dikomentari @chl, satu pohon tidak terlalu berarti dalam konteks ini, sehingga singkat menggunakannya untuk menjelaskan apa itu hutan acak, saya tidak akan memasukkan ini ke dalam makalah.

Shane
sumber
4
Perluasan kecil tentang plot: plot.randomForestmenunjukkan bagaimana kesalahan OOB dan kesalahan OOB di kelas berevolusi dengan meningkatnya jumlah pohon; varImpPlotmenunjukkan ukuran kepentingan atribut untuk atribut teratas dan MDSplotsemua objek diplot pada proyeksi 2D ukuran kedekatan objek RF.
+1 untuk mengutip MDSplot()fungsi. Saya harus mengakui bahwa saya sering menggunakan RF sebagai cara untuk menyoroti kelompok individu (berdasarkan ukuran kedekatan RF) daripada memilih fitur terbaik. Dokter sering membaca plot seperti itu dengan mudah daripada dotplot var. pentingnya ...
chl
18
  1. Seperti yang ditulis Shane; buatlah penelitian yang dapat direproduksi + termasuk benih acak, karena RF bersifat stokastik.
  2. Pertama-tama, memplot pohon tunggal yang membentuk RF adalah omong kosong; ini adalah penggolong ensemble, masuk akal hanya sebagai keseluruhan. Tetapi bahkan memplot seluruh hutan itu tidak masuk akal - itu adalah klasifikasi kotak-hitam, jadi tidak dimaksudkan untuk menjelaskan data dengan strukturnya, melainkan untuk mereplikasi proses aslinya. Sebagai gantinya, buat beberapa plot yang disarankan Shane.
  3. Dalam praktiknya, OOB adalah perkiraan kesalahan yang sangat baik; namun ini bukan fakta yang diterima secara luas, jadi untuk publikasi sebaiknya buat CV untuk mengonfirmasi.

sumber
Jadi @mbq ketika melakukan CV apakah valid untuk terlebih dahulu melakukan hutan acak dengan semua sampel yang dipilih; melakukannya dua kali sekali dengan semua dan kedua dengan 10 variabel teratas (yang dapat dikutip dalam makalah). Lalu lakukan validasi silang keluar-satu (pilih 10 gen teratas setiap percobaan) dan kutip kesalahan CV dari itu?
danielsbrewer
1
@danielsbrewer Saya akan melakukan ini dengan cara lain (lebih memperhatikan pemilihan fitur), tetapi ini benar; namun lebih pada topik penentuan tolok ukur pemilihan fitur RF daripada memilih penanda terbaik untuk masalah biologis Anda.
2
Masalah utama adalah sangat sulit untuk membandingkan dua model (model = metode pembelajaran + metode pemilihan fitur), tetapi untuk kesederhanaan Anda dapat mengasumsikan sesuatu (seperti saya akan menggunakan RF dan memilih 10 atribut teratas) dan mengakui bahwa Anda tahu bahwa ini mungkin suboptimal, tetapi Anda setuju bahwa sementara Anda misalnya puas dengan keakuratannya. Dalam hal ini satu-satunya masalah Anda adalah menghapus bias pemilihan atribut. tbc.
2
Jadi, saya akan melakukan bagging sederhana: Anda membuat 10 (atau 30 jika Anda memiliki komputer yang bagus) subsampel objek acak (katakanlah dengan memilih secara acak dengan penggantian), latih RF pada masing-masing, dapatkan pentingnya dan kembalikan peringkat masing-masing atribut rata-rata atas semua pengulangan (atribut terbaik mendapat peringkat 1, kedua terbaik 2 dan seterusnya; itu bisa dirata-rata sehingga atribut yang 12 kali 1 dan 18 kali 2 memiliki peringkat 1,6), akhirnya pilih 10 dengan peringkat terbaik dan panggil mereka spidol Anda. Kemudian gunakan CV (LOO, 10 kali lipat atau lebih disukai sampling acak) untuk mendapatkan perkiraan kesalahan RF menggunakan spidol Anda. tbc.
2
Laporkan peringkat (mudah-mudahan mereka cukup dekat 1,2,3 ...), kesalahan CV dengan penyimpangannya (hitung saja standar deviasi hasil setiap putaran CV) dan kesalahan OOB (mungkin akan identik dengan kesalahan CV). PENOLAKAN: Ini bukan metode untuk memilih jumlah atribut yang optimal - Anda perlu RFE dan CV bersarang untuk melakukan itu. DISCLAIMER2: Saya belum bekerja dengan data seperti itu, jadi saya tidak menjamin bahwa wasit Anda akan senang dengan itu (meskipun saya percaya mereka harus melakukannya).
13

Perlu diingat peringatan di jawaban lain tentang plot tentu menjadi bermakna. Tetapi jika Anda menginginkan plot untuk tujuan ilustrasi / pedagogis, cuplikan R berikut mungkin berguna. Tidak sulit untuk menambahkan "titik split" ke teks tepi jika Anda membutuhkannya.

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))
Patrick Caldon
sumber
1
Kode menghasilkan plot pohon yang sangat bagus. Tetapi nilai tidak ditampilkan. Mungkin fungsi teks () perlu ditambahkan setelah pernyataan (plot) terakhir.
rnso