ランダムフォレストによる分類に寄与した変数の分析

 Rでランダムフォレストを実行するには、randomForestパッケージのrandomForest関数を使います。なお、今回は、kernlabパッケージのspamを用いて、スパムメールの分類実験を行います。

# 実験データの読み込み
library(kernlab)
data(spam)
# 乱数の設定
set.seed(1)
# ランダムフォレストの実行
library(randomForest)
(rf.model <- randomForest(type ~ ., data = spam, ntree = 100, proximity = TRUE))

 上記のスクリプトを実行すると、以下のような結果が得られます。OOBによって推定された誤判別率が4.52%ですので、正判別率は95.48%となります。

Call:
 randomForest(formula = type ~ ., data = spam, ntree = 100, proximity = TRUE) 
               Type of random forest: classification
                     Number of trees: 100
No. of variables tried at each split: 7

        OOB estimate of  error rate: 4.52%
Confusion matrix:
        nonspam spam class.error
nonspam    2710   78  0.02797704
spam        130 1683  0.07170436

 先ほど計算したproximityに基づいて、個体間の類似度を多次元尺度法で視覚化するには、MDSplot関数を使います。以下の図では、spamで、がnonspamを表しています。

# 個体間の類似度を多次元尺度法で視覚化
MDSplot(rf.model, spam$type)

f:id:langstat:20140420143859p:plain

 そして、分類に寄与した変数を視覚化するには、varImpPlot関数を使います。

# 分類に寄与した変数を視覚化
varImpPlot(rf.model)

f:id:langstat:20140420143904p:plain

 上の図を見ると、nonspamとspamの分類において、charExclamationという変数が最も寄与していることが分かります。ただ、このcharExclamationという変数がnonspamとspamのどちらに特徴的なのか(=高い頻度で現れているのか)という情報は、この図からは得られません。そこで、partialPlot関数を使って、部分従属プロットを描きます。

# 描画する変数の数を指定
x <- 10
# 変数名の取得
variable.names <- colnames(spam)
# 寄与度の高い変数の番号を取得
rk <- order(rf.model$importance, decreasing = TRUE)[1 : x]
# 描画エリアの設定
par(mfrow = c(2, 5))
# 部分従属プロットの描画
for(i in rk)
partialPlot(rf.model, spam, variable.names[i], main = variable.names[i], xlab = variable.names[i], ylab = "Partial Dependency", col = "red")

f:id:langstat:20140420143908p:plain

 この図では、縦軸の値が高いほど、そのメールが第1群(nonspam)である可能性が高く、逆に縦軸の値が低いほど、第2群(spam)である可能性が高いということを表しています。つまり、ごくごく簡単に言い換えると、赤い線が右肩下がりの変数(charExclamationなど)は第2群(spam)で多く用いられている変数であり、逆に赤い線が右肩上がりの変数(hp)は第1群(nonspam)で多く用いられている変数であると言えます。
 また、各変数の頻度分布に関しては、boxplot関数を使って、箱ひげ図で視覚化することも可能です。

# 描画エリアの設定
par(mfrow = c(2, 5))
# 箱ひげ図の描画
for(i in rk)
boxplot(spam[, i] ~ spam$type, main = names(spam)[i], col = "green")

f:id:langstat:20140420143913p:plain

(2017年9月23日追記)なお、本記事の内容につきましては、以下の書籍でより詳しく解説しています。ご興味をお持ちの方は、そちらもご参照頂ければ幸いに存じます。