ランダムフォレストはほとんどブラックボックスではありません。それらは非常に簡単に解釈できる決定木に基づいています。
#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)
![プロット](https://i.stack.imgur.com/glkbe.png)
変数(花びらと花びらの長さと幅)を0〜1の範囲に正規化しました。応答も0-1です。0はotherで、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)])
これらの各機能のヘルプファイルを表示して、表示される内容をよりよく理解できます。