रैंडम वन शायद ही कोई ब्लैक बॉक्स हो। वे निर्णय पेड़ों पर आधारित हैं, जिनकी व्याख्या करना बहुत आसान है:
#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)
इसका परिणाम एक साधारण निर्णय वृक्ष में होता है:
> 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) *
यदि पेटल.लम्बी <4.95, यह पेड़ अवलोकन को "अन्य" के रूप में वर्गीकृत करता है। यदि यह 4.95 से अधिक है, तो यह अवलोकन को "वर्जिनिका" के रूप में वर्गीकृत करता है। एक यादृच्छिक जंगल कई ऐसे पेड़ों का एक संग्रह है, जहां प्रत्येक को डेटा के यादृच्छिक सबसेट पर प्रशिक्षित किया जाता है। प्रत्येक पेड़ तो प्रत्येक अवलोकन के अंतिम वर्गीकरण पर "वोट" करता है।
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
आप rf से अलग-अलग पेड़ों को भी खींच सकते हैं, और उनकी संरचना को देख सकते हैं। प्रारूप rpart
मॉडल की तुलना में थोड़ा अलग है , लेकिन आप प्रत्येक पेड़ का निरीक्षण कर सकते हैं यदि आप चाहते थे और देखें कि यह डेटा को कैसे मॉडलिंग कर रहा है।
इसके अलावा, कोई भी मॉडल वास्तव में एक ब्लैक बॉक्स नहीं है, क्योंकि आप डेटासेट में प्रत्येक चर के लिए वास्तविक प्रतिक्रियाओं बनाम अनुमानित प्रतिक्रियाओं की जांच कर सकते हैं। यह एक अच्छा विचार है कि आप किस प्रकार के मॉडल का निर्माण कर रहे हैं:
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)
मैंने चर (सेपाल और पंखुड़ी की लंबाई और चौड़ाई) को 0-1 की सीमा तक सामान्य कर दिया है। प्रतिक्रिया भी 0-1 है, जहां 0 अन्य है और 1 वर्जिन है। जैसा कि आप देख सकते हैं यादृच्छिक वन एक अच्छा मॉडल है, यहां तक कि परीक्षण सेट पर भी।
इसके अतिरिक्त, एक यादृच्छिक वन चर महत्व के विभिन्न माप की गणना करेगा, जो बहुत जानकारीपूर्ण हो सकता है:
> importance(model.rf, type=1)
MeanDecreaseAccuracy
Sepal.Length 0.28567162
Sepal.Width -0.08584199
Petal.Length 0.64705819
Petal.Width 0.58176828
यह तालिका दर्शाती है कि प्रत्येक चर को हटाने से मॉडल की सटीकता कम हो जाती है। अंत में, कई अन्य भूखंड हैं जिन्हें आप यादृच्छिक वन मॉडल से बना सकते हैं, यह देखने के लिए कि ब्लैक बॉक्स में क्या चल रहा है:
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)])
आप इन कार्यों में से प्रत्येक के लिए मदद फ़ाइलों को देख सकते हैं कि वे क्या प्रदर्शित करते हैं, इसका एक बेहतर विचार प्राप्त करने के लिए।