Rastgele Ormanlar pek kara kutu değildir. Yorumlanması çok kolay olan karar ağaçlarına dayanırlar:
#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)
Bu basit bir karar ağacına neden olur:
> 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) *
Petal.Length <4.95 ise, bu ağaç gözlemi "diğer" olarak sınıflandırır. 4.95'ten büyükse, gözlemi “virginica” olarak sınıflandırır. Rastgele bir orman, her biri verinin rastgele bir alt kümesinde eğitildiği, bu tür birçok ağacın toplanması basittir. Her ağaç daha sonra her gözlemin son sınıflandırmasına "oy verir".
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
Tek tek ağaçları rf'den bile çıkarabilir ve yapılarına bakabilirsiniz. Biçim, rpart
modellerden biraz farklıdır , ancak istediğinizde her bir ağacı inceleyebilir ve verileri nasıl modellediğini görebilirsiniz.
Ayrıca, hiçbir model tam anlamıyla kara bir kutu değildir, çünkü veri kümesindeki her değişken için öngörülen yanıtları ve gerçek yanıtları inceleyebilirsiniz. Ne tür bir model oluşturduğunuzdan bağımsız olarak bu iyi bir fikirdir:
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)
Değişkenleri (sepal ve petal uzunluk ve genişlik) 0-1 aralığına normalleştirdim. Tepki ayrıca 0-1, ki burada 0 diğer ve 1 virginica'dır. Gördüğünüz gibi rastgele orman, test setinde bile iyi bir model.
Ek olarak, rastgele bir orman, çok bilgilendirici olabilen çeşitli değişken önem derecesini hesaplayacaktır:
> importance(model.rf, type=1)
MeanDecreaseAccuracy
Sepal.Length 0.28567162
Sepal.Width -0.08584199
Petal.Length 0.64705819
Petal.Width 0.58176828
Bu tablo, her değişkeni kaldırmanın modelin doğruluğunu ne kadar azalttığını gösterir. Son olarak, kara kutuda neler olup bittiğini görmek için rastgele bir orman modelinden yapabileceğiniz birçok çizim var:
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)])
Ne gösterdikleri hakkında daha iyi bir fikir edinmek için bu işlevlerin her biri için yardım dosyalarını görüntüleyebilirsiniz.