ランダムフォレストとは機械学習のアルゴリズムの1つで、学習用のデータをランダムにサンプリングして多数の決定木を作成し、作成した決定木をもとに多数決で結果を決める方法です。精度、汎用性が高く扱いやすい分析手法です。
ランダムフォレストの特徴
ランダムフォレストを実行するためにパッケージrandomForestを使います。また、データはRに組み込みのデータセットTitanicを使います。
ここでは、どのような属性の人がタイタニックで生き残ったかといったモデルを作成します。また、本分析手法はランダムに並べたりする箇所があるため、実際にコードを動かしてみた結果とここに書かれている結果とやや異なるところがでくるかもしれません。
# ライブラリの読み込み
library(randomForest)
# データの整形と確認
z <- data.frame(Titanic)
titanic.data <- data.frame(
Class = rep(z$Class, z$Freq),
Sex = rep(z$Sex, z$Freq),
Age = rep(z$Age, z$Freq),
Survived = rep(z$Survived, z$Freq)
)
head(titanic.data)
## Class Sex Age Survived
## 1 3rd Male Child No
## 2 3rd Male Child No
## 3 3rd Male Child No
## 4 3rd Male Child No
## 5 3rd Male Child No
## 6 3rd Male Child No
ランダムフォレストでのチューニング(モデルに対して任意に指定する値)箇所は、分岐に使う変数の数(mtry)です。適当なmtryを求めるためにtuneRF()関数を使います。OOB error(誤判別率)が一番低くなるmtryを採用します。
titanic.tune <- tuneRF(
titanic.data[,-4], # 説明変数
titanic.data[,4], # 目的変数
doBest = T) #分岐に使う変数の数(mtry)を求めるフラグ
## mtry = 1 OOB error = 21.63%
## Searching left ...
## Searching right ...
## mtry = 2 OOB error = 21.22%
## 0.01890756 0.05
分析の実行にはrandomForest()関数を使用します。チューニングで求めたmtry(tuneRF()結果は、オブジェクトの$mtryに入っています)はこの関数の引数に代入します。
titanic.rf <- randomForest( # 予測、分類器の構築
Survived ~ ., # モデル式
data = titanic.data, # データ
mtry = titanic.tune$mtry) # 分岐に使う変数の数
titanic.rf
##
## Call:
## randomForest(formula = Survived ~ ., data = titanic.data, mtry = titanic.tune$mtry)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 20.95%
## Confusion matrix:
## No Yes class.error
## No 1470 20 0.01342282
## Yes 441 270 0.62025316
出力結果の読み方
それぞれの説明変数の重要度を求めるためにimportance()関数を使います。出力結果のMeanDecreaseGiniは、説明変数の影響度の大きさです。
rank <- data.frame(importance(titanic.rf)) # 重要度のリストをデータフレームに変換
rank$factor <- rownames(rank) # 行名になっている要因をデータフレームに追加
rank <- rank[order(rank[,1], decreasing=T),] # 重要度(偏回帰係数的なもの)順に並び替え
rownames(rank) <- 1:nrow(rank) # ランキングを行名にする
rank
## MeanDecreaseGini factor
## 1 186.20273 Sex
## 2 73.13773 Class
## 3 12.89348 Age
重要度の大きさをグラフに描画するためにvarImpPlot()関数を使います。
varImpPlot(titanic.rf)
「データから価値を創造する」一般社団法人データマーケティングラボラトリー
Copyright© DML All Rights Reserved.