Hutan Acak bukan kotak hitam. Mereka didasarkan pada pohon keputusan, yang sangat mudah ditafsirkan:
#Setup a binary classification problem
require(randomForest)
data(iris)
set.seed(1)
dat <- iris
dat$Species <- factor(ifelse(dat$Species=='virginica','virginica','other'))
trainrows <- runif(nrow(dat)) > 0.3
train <- dat[trainrows,]
test <- dat[!trainrows,]
#Build a decision tree
require(rpart)
model.rpart <- rpart(Species~., train)
Ini menghasilkan pohon keputusan sederhana:
> model.rpart
n= 111
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 111 35 other (0.68468468 0.31531532)
2) Petal.Length< 4.95 77 3 other (0.96103896 0.03896104) *
3) Petal.Length>=4.95 34 2 virginica (0.05882353 0.94117647) *
Jika Petal. Panjang <4,95, pohon ini mengklasifikasikan pengamatan sebagai "lain." Jika lebih besar dari 4,95, itu mengklasifikasikan pengamatan sebagai "virginica." Hutan acak adalah kumpulan sederhana dari banyak pohon seperti itu, di mana masing-masing dilatih pada bagian acak data. Setiap pohon kemudian "memberikan suara" pada klasifikasi akhir dari setiap pengamatan.
model.rf <- randomForest(Species~., train, ntree=25, proximity=TRUE, importance=TRUE, nodesize=5)
> getTree(model.rf, k=1, labelVar=TRUE)
left daughter right daughter split var split point status prediction
1 2 3 Petal.Width 1.70 1 <NA>
2 4 5 Petal.Length 4.95 1 <NA>
3 6 7 Petal.Length 4.95 1 <NA>
4 0 0 <NA> 0.00 -1 other
5 0 0 <NA> 0.00 -1 virginica
6 0 0 <NA> 0.00 -1 other
7 0 0 <NA> 0.00 -1 virginica
Anda bahkan dapat menarik pohon secara individu dari rf, dan melihat strukturnya. Formatnya sedikit berbeda dari rpart
model, tetapi Anda bisa memeriksa setiap pohon jika Anda mau dan melihat bagaimana memodelkan data.
Selain itu, tidak ada model yang benar-benar kotak hitam, karena Anda dapat memeriksa respons yang diprediksi vs respons aktual untuk setiap variabel dalam dataset. Ini adalah ide yang bagus terlepas dari model apa yang Anda bangun:
library(ggplot2)
pSpecies <- predict(model.rf,test,'vote')[,2]
plotData <- lapply(names(test[,1:4]), function(x){
out <- data.frame(
var = x,
type = c(rep('Actual',nrow(test)),rep('Predicted',nrow(test))),
value = c(test[,x],test[,x]),
species = c(as.numeric(test$Species)-1,pSpecies)
)
out$value <- out$value-min(out$value) #Normalize to [0,1]
out$value <- out$value/max(out$value)
out
})
plotData <- do.call(rbind,plotData)
qplot(value, species, data=plotData, facets = type ~ var, geom='smooth', span = 0.5)
Saya telah menormalkan variabel (panjang dan lebar sepal dan petal) ke rentang 0-1. Responsnya juga 0-1, di mana 0 adalah lainnya dan 1 adalah virginica. Seperti yang Anda lihat, hutan acak adalah model yang baik, bahkan pada set tes.
Selain itu, hutan acak akan menghitung berbagai ukuran variabel penting, yang bisa sangat informatif:
> importance(model.rf, type=1)
MeanDecreaseAccuracy
Sepal.Length 0.28567162
Sepal.Width -0.08584199
Petal.Length 0.64705819
Petal.Width 0.58176828
Tabel ini menunjukkan seberapa banyak menghapus setiap variabel mengurangi akurasi model. Terakhir, ada banyak plot lain yang dapat Anda buat dari model hutan acak, untuk melihat apa yang terjadi di dalam kotak hitam:
plot(model.rf)
plot(margin(model.rf))
MDSplot(model.rf, iris$Species, k=5)
plot(outlier(model.rf), type="h", col=c("red", "green", "blue")[as.numeric(dat$Species)])
Anda dapat melihat file bantuan untuk masing-masing fungsi ini untuk mendapatkan gambaran yang lebih baik tentang apa yang ditampilkan.