র্যান্ডম অরণ্যগুলি খুব কমই একটি কালো বাক্স। এগুলি সিদ্ধান্ত গাছের উপর ভিত্তি করে, যার ব্যাখ্যা খুব সহজ:
#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, এই গাছটি পর্যবেক্ষণটিকে "অন্যান্য" হিসাবে শ্রেণিবদ্ধ করে। যদি এটি ৪.৯৯ এর বেশি হয় তবে এটি পর্যবেক্ষণটিকে "ভার্জিনিকা" হিসাবে শ্রেণিবদ্ধ করে। এলোমেলো অরণ্য এমন অনেক গাছের সংগ্রহ সহজ, যেখানে প্রত্যেককে ডেটা একটি এলোমেলো উপসেটে প্রশিক্ষিত হয়। প্রতিটি গাছ তারপরে প্রতিটি পর্যবেক্ষণের চূড়ান্ত শ্রেণিবিন্যাসের উপর "ভোট" দেয়।
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
আপনি আরএফ থেকে পৃথক গাছগুলিও টেনে আনতে পারেন এবং তাদের কাঠামোটি দেখতে পারেন। 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
এই টেবিলটি প্রতিটি ভেরিয়েবলকে অপসারণের ফলে মডেলের যথার্থতা হ্রাস করে represents অবশেষে, কালো বাক্সে কী চলছে তা দেখতে আপনি এলোমেলো বন মডেল থেকে আরও অনেক প্লট তৈরি করতে পারেন:
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)])
তারা কী প্রদর্শিত হবে সে সম্পর্কে আরও ভাল ধারণা পেতে আপনি এই ফাংশনগুলির প্রত্যেকের জন্য সহায়তা ফাইলগুলি দেখতে পারেন।