랜덤 포레스트는 거의 블랙 박스가 아닙니다. 의사 결정 트리를 기반으로하며 해석하기 매우 쉽습니다.
#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)
변수 (sepal 및 petal length 및 width)를 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)])
이러한 각 기능에 대한 도움말 파일을보고 표시되는 내용을 더 잘 이해할 수 있습니다.