R Random Forest ランダムフォレスト

現在は時系列解析にプライオリティを置いているが、前勉強した機械学習の手法があったので復習を兼ねて載せる。

こちらで、決定木(Decision Tree)のモデル作成と評価を行った。その精度を高めるために開発されたランダムフォレストという機械学習の手法の一種を使ってみる。

ランダムフォレストとは、以下のようにサンプルデータから多数の決定木を作成し、その多数決で予測を行うモデルである。(図は昔使ったパワポから抜粋)

f:id:nakhirot:20130704023429p:plain

RではrandomForest関数によって、このモデルを作成可能。データは以前も使ったhttp://archive.ics.uci.edu/ml/datasets/Spambase に掲載されているspamメールの特徴をまとめたデータ。以下は前回のコードの続き。

library(randomForest)
train_rf <- randomForest(type~., data=train_dat, mtry=ncol(train_dat)-1)
print(train_rf) #データはこちらで用いたものと同じ

attributes(train_rf)
par(ps=20) #フォント調整
plot(train_rf)

training dataを対象に木の数を増やしていくとエラーレートが減少していることがわかる。(緑線はspam mailのerror rate、赤線はnonspam mailのerror rate)

f:id:nakhirot:20130704025608p:plain

varImpPlot関数を使えば、どの変数がspamメールであるか否かへの寄与が大きかったかが相対的にわかる。

train_rf$importance
varImpPlot(train_rf) #Variable Improtanceのグラフ

 

f:id:nakhirot:20130704025754p:plain

上記によると"Dollar"という文字の数がspammailか否かに強く影響していることがわかる。最後に、validation dataを用いて精度を検証。通常の決定木による予測モデルと結果を比較。結論としては、サンプリングを繰り返しその結果を合成したモデルは精度が向上することがわかる。 

##混同行列
vali_rfp <- predict(train_rf,vali_dat[,-58])

(vali_rft<- table(vali_dat[,58], vali_rfp))
(accuracyTraining_rf <- sum(diag(vali_rft))/sum(vali_rft)) #精度(正解率)
(FPR_rf <- vali_rft[1,2]/sum(vali_rft[1,])) #False Positive Rate
(FNR_rf <- vali_rft[2,1]/sum(vali_rft[2,])) #False Negative Rate

print(c(accuracyTraining,accuracyTraining_rf)) #精度(右の数値がRandom forest)
print(c(FPR,FPR_rf)) #FPR(右の数値がRandom forest)
print(c(FNR,FNR_rf)) #FNR(右の数値がRandom forest)

##R-squared
#カテゴリカル変数同士の相関係数をpolychorを用いて求める
(R_rf <- polychor(vali_dat$type,vali_rfp,ML=TRUE))
(R_rf_sq <- R_rf^2)
print(c(R_sq,R_rf_sq)) #R^2(右の数値がRandom forest)