Hutan acak yang dieksekusi dengan baik diterapkan pada masalah yang lebih "tepat hutan acak" dapat berfungsi sebagai filter untuk menghilangkan kebisingan, dan membuat hasil yang lebih berguna sebagai input ke alat analisis lainnya.
Penafian:
- Apakah itu "peluru perak"? Tidak mungkin. Jarak tempuh akan bervariasi. Ia bekerja di mana ia bekerja, dan bukan di tempat lain.
- Adakah cara Anda dapat menggunakannya secara salah dan mendapatkan jawaban yang ada di domain sampah-ke-voodoo? Anda betcha. Seperti setiap alat analitik, ia memiliki batasan.
- Jika Anda menjilat katak, apakah napas Anda akan berbau seperti katak? mungkin. Saya tidak punya pengalaman di sana.
Saya harus memberikan "berteriak" untuk "mengintip" saya yang membuat "Laba-laba". ( tautan ) Contoh masalah mereka menginformasikan pendekatan saya. ( tautan ) Saya juga menyukai estimator Theil-Sen, dan berharap saya bisa memberikan alat peraga kepada Theil dan Sen.
Jawaban saya bukan tentang bagaimana melakukan kesalahan, tetapi tentang bagaimana cara kerjanya jika Anda benar. Sementara saya menggunakan suara "sepele", saya ingin Anda berpikir tentang suara "non-sepele" atau "terstruktur".
Salah satu kekuatan hutan acak adalah seberapa baik berlaku untuk masalah dimensi tinggi. Saya tidak dapat menampilkan kolom 20k (alias ruang dimensi 20k) dengan cara visual yang bersih. Ini bukan tugas yang mudah. Namun, jika Anda memiliki masalah 20k-dimensi, hutan acak mungkin menjadi alat yang baik di sana ketika sebagian besar lainnya jatuh datar di "wajah" mereka.
Ini adalah contoh menghilangkan noise dari sinyal menggunakan hutan acak.
#housekeeping
rm(list=ls())
#library
library(randomForest)
#for reproducibility
set.seed(08012015)
#basic
n <- 1:2000
r <- 0.05*n +1
th <- n*(4*pi)/max(n)
#polar to cartesian
x1=r*cos(th)
y1=r*sin(th)
#add noise
x2 <- x1+0.1*r*runif(min = -1,max = 1,n=length(n))
y2 <- y1+0.1*r*runif(min = -1,max = 1,n=length(n))
#append salt and pepper
x3 <- runif(min = min(x2),max = max(x2),n=length(n)/2)
y3 <- runif(min = min(y2),max = max(y2),n=length(n)/2)
x4 <- c(x2,x3)
y4 <- c(y2,y3)
z4 <- as.vector(matrix(1,nrow=length(x4)))
#plot class "A" derivation
plot(x1,y1,pch=18,type="l",col="Red", lwd=2)
points(x2,y2)
points(x3,y3,pch=18,col="Blue")
legend(x = 65,y=65,legend = c("true","sampled","false"),
col = c("Red","Black","Blue"),lty = c(1,-1,-1),pch=c(-1,1,18))
Izinkan saya menjelaskan apa yang sedang terjadi di sini. Gambar di bawah ini menunjukkan data pelatihan untuk kelas "1". Kelas "2" adalah seragam acak di atas domain dan rentang yang sama. Anda dapat melihat bahwa "informasi" dari "1" sebagian besar adalah spiral, tetapi telah rusak dengan materi dari "2". Memiliki 33% dari data Anda yang rusak dapat menjadi masalah bagi banyak alat yang pas. Theil-Sen mulai menurun sekitar 29%. ( tautan )
Sekarang kami memisahkan informasi, hanya memiliki gagasan tentang apa itu noise.
#Create "B" class of uniform noise
x5 <- runif(min = min(x4),max = max(x4),n=length(x4))
y5 <- runif(min = min(y4),max = max(y4),n=length(x4))
z5 <- 2*z4
#assemble data into frame
data <- data.frame(c(x4,x5),c(y4,y5),as.factor(c(z4,z5)))
names(data) <- c("x","y","z")
#train random forest - I like h2o, but this is textbook Breimann
fit.rf <- randomForest(z~.,data=data,
ntree = 1000, replace=TRUE, nodesize = 20)
data2 <- predict(fit.rf,newdata=data[data$z==1,c(1,2)],type="response")
#separate class "1" from training data
idx1a <- which(data[,3]==1)
#separate class "1" from the predicted data
idx1b <- which(data2==1)
#show the difference in classes before and after RF based filter
plot(data[idx1a,1],data[idx1a,2])
points(data[idx1b,1],data[idx1b,2],col="Red")
Inilah hasil yang pas:
Saya sangat suka ini karena dapat menunjukkan kekuatan dan kelemahan dari metode yang layak untuk masalah yang sulit pada saat yang sama. Jika Anda melihat di dekat pusat Anda dapat melihat bagaimana ada lebih sedikit penyaringan. Skala informasi geometris kecil dan hutan acak tidak ada. Ia mengatakan sesuatu tentang jumlah node, jumlah pohon, dan kepadatan sampel untuk kelas 2. Ada juga "celah" dekat (-50, -50), dan "jet" di beberapa lokasi. Namun, secara umum, penyaringannya layak.
Bandingkan dengan SVM
Berikut adalah kode yang memungkinkan perbandingan dengan SVM:
#now to fit to svm
fit.svm <- svm(z~., data=data, kernel="radial",gamma=10,type = "C")
x5 <- seq(from=min(x2),to=max(x2),by=1)
y5 <- seq(from=min(y2),to=max(y2),by=1)
count <- 1
x6 <- numeric()
y6 <- numeric()
for (i in 1:length(x5)){
for (j in 1:length(y5)){
x6[count]<-x5[i]
y6[count]<-y5[j]
count <- count+1
}
}
data4 <- data.frame(x6,y6)
names(data4) <- c("x","y")
data4$z <- predict(fit.svm,newdata=data4)
idx4 <- which(data4$z==1,arr.ind=TRUE)
plot(data4[idx4,1],data4[idx4,2],col="Gray",pch=20)
points(data[idx1b,1],data[idx1b,2],col="Blue",pch=20)
lines(x1,y1,pch=18,col="Green", lwd=2)
grid()
legend(x = 65,y=65,
legend = c("true","from RF","From SVM"),
col = c("Green","Blue","Gray"),lty = c(1,-1,-1),pch=c(-1,20,15),pt.cex=c(1,1,2.25))
Ini menghasilkan gambar berikut.
Ini adalah SVM yang layak. Abu-abu adalah domain yang dikaitkan dengan kelas "1" oleh SVM. Titik-titik biru adalah sampel yang terkait dengan kelas "1" oleh RF. Filter berbasis RF berkinerja sebanding dengan SVM tanpa dasar yang dipaksakan secara eksplisit. Dapat dilihat bahwa "data ketat" di dekat pusat spiral jauh lebih "rapat" diselesaikan oleh RF. Ada juga "pulau-pulau" menuju "ekor" di mana RF menemukan hubungan yang tidak dimiliki SVM.
Saya terhibur. Tanpa latar belakang, saya melakukan salah satu hal awal yang juga dilakukan oleh kontributor yang sangat baik di lapangan. Penulis asli menggunakan "distribusi referensi" ( tautan , tautan ).
SUNTING:
Terapkan FOREST acak ke model ini:
Sementara user777 memiliki pemikiran bagus tentang CART yang menjadi elemen dari hutan acak, premis dari hutan acak adalah "kumpulan ensemble pelajar yang lemah". CART dikenal sebagai pembelajar yang lemah tetapi tidak ada yang dekat dengan "ansambel". "Ensemble" meskipun dalam hutan acak dimaksudkan "dalam batas sejumlah besar sampel". Jawaban user777, di sebar, menggunakan setidaknya 500 sampel dan yang mengatakan sesuatu tentang keterbacaan manusia dan ukuran sampel dalam kasus ini. Sistem visual manusia (itu sendiri ansambel peserta didik) adalah sensor dan pengolah data yang luar biasa dan menemukan nilai yang memadai untuk kemudahan pemrosesan.
Jika kita mengambil bahkan pengaturan default pada alat acak-hutan, kita dapat mengamati perilaku peningkatan kesalahan klasifikasi untuk beberapa pohon pertama, dan tidak mencapai tingkat satu pohon sampai ada sekitar 10 pohon. Awalnya kesalahan tumbuh pengurangan kesalahan menjadi stabil di sekitar 60 pohon. Maksud saya dengan stabil
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
Yang menghasilkan:
Jika alih-alih melihat "pembelajar lemah minimum" kita melihat "ansambel lemah minimum" yang disarankan oleh heuristik yang sangat singkat untuk pengaturan default alat, hasilnya agak berbeda.
Catatan, saya menggunakan "garis" untuk menggambar lingkaran yang mengindikasikan tepi di atas perkiraan. Anda dapat melihat bahwa itu tidak sempurna, tetapi jauh lebih baik daripada kualitas seorang pembelajar tunggal.
Pengambilan sampel asli memiliki 88 sampel "interior". Jika ukuran sampel ditingkatkan (memungkinkan ansambel diterapkan) maka kualitas aproksimasi juga meningkat. Jumlah pelajar yang sama dengan 20.000 sampel membuat kecocokan yang lebih baik.
Informasi input berkualitas jauh lebih tinggi juga memungkinkan evaluasi jumlah pohon yang sesuai. Inspeksi konvergensi menunjukkan bahwa 20 pohon adalah jumlah minimum yang cukup dalam kasus khusus ini, untuk mewakili data dengan baik.