ป่าสุ่มนั้นไม่ค่อยมีกล่องดำ พวกมันอยู่บนพื้นฐานของต้นไม้ตัดสินใจซึ่งง่ายต่อการตีความ:
#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) *
ถ้า Petal.Length <4.95 ต้นไม้นี้จัดประเภทการสังเกตเป็น "อื่น ๆ " ถ้ามันมากกว่า 4.95 มันจัดประเภทการสังเกตว่า "virginica" ฟอเรสต์แบบสุ่มนั้นเป็นชุดของต้นไม้จำนวนมากที่แต่ละต้นได้รับการฝึกฝนเกี่ยวกับชุดย่อยของข้อมูล ต้นไม้แต่ละต้นนั้น "โหวต" ในการจำแนกขั้นสุดท้ายของการสังเกตแต่ละครั้ง
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 คือ virginica อย่างที่คุณเห็นป่าสุ่มเป็นแบบอย่างที่ดีแม้ในชุดทดสอบ
นอกจากนี้ฟอเรสต์แบบสุ่มจะคำนวณการวัดความสำคัญของตัวแปรต่าง ๆ ซึ่งสามารถให้ข้อมูลได้มาก:
> 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)])
คุณสามารถดูไฟล์วิธีใช้สำหรับแต่ละฟังก์ชั่นเหล่านี้เพื่อรับทราบข้อมูลที่ดีขึ้นเกี่ยวกับสิ่งที่แสดง