Siapa pun mendapat saran pustaka atau kode tentang cara sebenarnya merencanakan beberapa pohon sampel dari:
getTree(rfobj, k, labelVar=TRUE)
(Ya saya tahu Anda tidak seharusnya melakukan ini secara operasional, RF adalah kotak hitam, dll. Saya ingin secara visual kewarasan-periksa pohon untuk melihat apakah ada variabel yang berperilaku berlawanan, perlu penyesuaian / penggabungan / diskritisasi / transformasi, periksa seberapa baik faktor yang disandikan saya berfungsi, dll.)
Pertanyaan sebelumnya tanpa jawaban yang layak:
Saya sebenarnya ingin memplot pohon contoh . Jadi jangan berdebat dengan saya tentang itu, sudah. Saya tidak bertanya tentang varImpPlot
(Variable Importance Plot) atau partialPlot
atau MDSPlot
, atau plot lainnya ini , saya sudah memilikinya, tetapi itu bukan pengganti untuk melihat pohon sampel. Ya saya dapat secara visual memeriksa output getTree(...,labelVar=TRUE)
.
(Saya kira plot.rf.tree()
kontribusi akan diterima dengan sangat baik.)
cforest
(dalam paket partai ). Jika tidak, Anda harus mengonversi yangdata.frame
dikembalikan olehrandomForest::getTree
ketree
-seperti objek.Jawaban:
Solusi pertama (dan termudah): Jika Anda tidak ingin tetap menggunakan RF klasik, seperti yang diterapkan di Andy Liaw's
randomForest
, Anda dapat mencoba paket pesta yang menyediakan implementasi berbeda dari algoritma RF ™ asli (penggunaan pohon kondisional dan skema agregasi berdasarkan rata-rata berat unit). Kemudian, seperti yang dilaporkan pada pos bantuan-R ini , Anda dapat memplot satu anggota dari daftar pohon. Sepertinya berjalan lancar, sejauh yang saya tahu. Di bawah ini adalah plot satu pohon yang dihasilkan olehcforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
.Kedua (hampir semudah) solusi: Sebagian besar teknik berbasis pohon di R (
tree
,rpart
,TWIX
, dll) menawarkantree
struktur-seperti untuk pencetakan / merencanakan satu pohon. Idenya adalah untuk mengkonversi outputrandomForest::getTree
ke objek R seperti itu, bahkan jika itu tidak masuk akal dari sudut pandang statistik. Pada dasarnya, mudah untuk mengakses struktur pohon dari suatutree
objek, seperti yang ditunjukkan di bawah ini. Harap dicatat bahwa itu akan sedikit berbeda tergantung pada jenis tugas - regresi vs klasifikasi - di mana dalam kasus selanjutnya akan menambah probabilitas kelas-spesifik sebagai kolom terakhir dariobj$frame
(yang merupakan adata.frame
).Lalu, ada metode untuk mencetak dan merencanakan objek-objek itu dengan cantik. Fungsi kuncinya adalah
tree:::plot.tree
metode generik (saya menempatkan triple:
yang memungkinkan Anda untuk melihat kode dalam R langsung) bergantung padatree:::treepl
(tampilan grafis) dantree:::treeco
(menghitung koordinat node). Fungsi-fungsi ini mengharapkanobj$frame
representasi pohon. Masalah halus lainnya: (1) argumentype = c("proportional", "uniform")
dalam metode plotting defaulttree:::plot.tree
,, membantu mengatur jarak vertikal antara node (proportional
berarti proporsional dengan penyimpangan,uniform
berarti tetap); (2) Anda perlu melengkapiplot(tr)
dengan panggilan untuktext(tr)
menambahkan label teks ke node dan split, yang dalam hal ini berarti Anda juga harus melihattree:::text.tree
.The
getTree
metode darirandomForest
hasil struktur yang berbeda, yang didokumentasikan dalam bantuan online. Output khas ditunjukkan di bawah ini, dengan terminal node ditunjukkan olehstatus
kode (-1). (Sekali lagi, output akan berbeda tergantung pada jenis tugas, tetapi hanya pada kolomstatus
danprediction
.)Jika Anda dapat mengubah tabel di atas menjadi yang dihasilkan oleh
tree
, Anda mungkin akan dapat menyesuaikantree:::treepl
,tree:::treeco
dantree:::text.tree
sesuai dengan kebutuhan Anda, meskipun saya tidak memiliki contoh pendekatan ini. Secara khusus, Anda mungkin ingin menyingkirkan penggunaan penyimpangan, probabilitas kelas, dll. Yang tidak berarti dalam RF. Yang Anda inginkan adalah mengatur koordinat node dan nilai split. Anda bisa menggunakannyafixInNamespace()
untuk itu, tetapi, jujur saja, saya tidak yakin ini cara yang tepat.Solusi ketiga (dan tentu saja pintar): Tulis
as.tree
fungsi pembantu yang benar yang akan meringankan semua "tambalan" di atas. Anda kemudian dapat menggunakan metode merencanakan R atau, mungkin lebih baik, Klimt (langsung dari R) untuk menampilkan masing-masing pohon.sumber
Saya terlambat empat tahun, tetapi jika Anda benar-benar ingin tetap berpegang pada
randomForest
paket (dan ada beberapa alasan bagus untuk melakukannya), dan ingin benar-benar memvisualisasikan pohon, Anda dapat menggunakan paket reprtree .Paket ini tidak didokumentasikan dengan sangat baik (Anda dapat menemukan dokumen di sini ), tetapi semuanya sangat mudah. Untuk menginstal paket merujuk ke initialize.R di repo, jadi jalankan saja yang berikut:
Kemudian lanjutkan dan buat model dan pohon Anda:
Dan begitulah! Cantik dan sederhana.
Anda dapat memeriksa repo github untuk mempelajari tentang metode lain dalam paket. Bahkan, jika Anda memeriksa plot.getTree.R , Anda akan melihat bahwa penulis menggunakan implementasinya sendiri
as.tree()
yang disarankan oleh Chl: Anda bisa membangun diri dalam jawabannya. Ini artinya Anda bisa melakukan ini:Dan kemudian berpotensi digunakan
realtree
dengan paket plot pohon lain seperti tree .sumber
xgboost
juga.randomForest
paket.plot.getTree()
memplot satu pohon individual. Fungsiplot.reprtree()
dalam paket itu memplot pohon representatif.reprtree:::plot.getTree(mod_rf_1$finalModel)
, bagaimanapun, ada "Kesalahan dalam data.frame (var = fr $ var, splits = as.character (gTree [," split point "]),: argumen menyiratkan perbedaan jumlah baris: 2631, 0 "Saya telah membuat beberapa fungsi untuk mengekstrak aturan pohon.
sumber