ランダムフォレストはチューニングして最適化する。
チューニングは決定木を最適化する方法。
ランダムフォレストの場合は、決定木の数と特徴量(説明変数)の数を最適化する。
- ランダムフォレストのパッケージのインストールと準備
- ランダムフォレストの最適化のために例題として使用するデータ
- ランダムフォレストを最適化(チューニング)する
- ランダムフォレストの最適化のために決定木の数を変えてやってみる
- まとめ
ランダムフォレストのパッケージのインストールと準備
最初に一回だけパッケージのインストールをする。
install.packages("randomForest")
呼び出して使えるように準備する。
library(randomForest)
ランダムフォレストの最適化のために例題として使用するデータ
MASSパッケージのfglデータを使う。
fglはForensic Glass Fragmensのデータで、法医学におけるガラス片のデータ。
RIという屈折率Refractive Indexと7種類の金属の酸化物のデータで、ガラスのタイプを識別するという課題。
ガラスのタイプは10列目のデータ。
library(MASS) head(fgl)
table(fgl$type)
先頭から5行を見てみるとこんな感じ。
> head(fgl) RI Na Mg Al Si K Ca Ba Fe type 1 3.01 13.64 4.49 1.10 71.78 0.06 8.75 0 0.00 WinF 2 -0.39 13.89 3.60 1.36 72.73 0.48 7.83 0 0.00 WinF 3 -1.82 13.53 3.55 1.54 72.99 0.39 7.78 0 0.00 WinF 4 -0.34 13.21 3.69 1.29 72.61 0.57 8.22 0 0.00 WinF 5 -0.58 13.27 3.62 1.24 73.08 0.55 8.07 0 0.00 WinF 6 -2.04 12.79 3.61 1.62 72.97 0.64 8.07 0 0.26 WinF
ガラスのタイプは6種類。
> table(fgl$type) WinF WinNF Veh Con Tabl Head 70 76 17 13 9 29
通常のランダムフォレストを実行してみる。
set.seed(2) fgl.rf <- randomForest(type ~ ., data=fgl) fgl.rf varImpPlot(fgl.rf)
結果は以下の通り、説明変数は3つで、エラー率は21.5%
randomForest()のデフォルトは全説明変数の数(9つ)の平方根なので、ピッタリ合っている。
> fgl.rf Call: randomForest(formula = type ~ ., data = fgl) Type of random forest: classification Number of trees: 500 No. of variables tried at each split: 3 OOB estimate of error rate: 21.5% Confusion matrix: WinF WinNF Veh Con Tabl Head class.error WinF 62 6 2 0 0 0 0.1142857 WinNF 12 58 1 3 1 1 0.2368421 Veh 7 3 7 0 0 0 0.5882353 Con 0 3 0 9 0 1 0.3076923 Tabl 0 2 0 0 7 0 0.2222222 Head 1 3 0 0 0 25 0.1379310
ジニ不純度の減少量で見る重要な変数3つは、マグネシウムとアルミニウムと屈折率。
ジニ不純度が大きく下がる変数が、識別に役立つ重要な変数。
ランダムフォレストを最適化(チューニング)する
tuneRF()を使う。
()内のdoBest=Tは最適な決定木をobjectとして返すオプション。
set.seed(2) fgl.res <- tuneRF(fgl[,-10], fgl[,10], doBest=T) fgl.res varImpPlot(fgl.res)
結果はエラー率19.16%になった。
説明変数は2つに減った。
> fgl.res <- tuneRF(fgl[,-10], fgl[,10], doBest=T) mtry = 3 OOB error = 22.43% Searching left ... mtry = 2 OOB error = 21.5% 0.04166667 0.05 Searching right ... mtry = 6 OOB error = 25.7% -0.1458333 0.05 > fgl.res Call: randomForest(x = x, y = y, mtry = res[which.min(res[, 2]), 1]) Type of random forest: classification Number of trees: 500 No. of variables tried at each split: 2 OOB estimate of error rate: 19.16% Confusion matrix: WinF WinNF Veh Con Tabl Head class.error WinF 62 6 2 0 0 0 0.1142857 WinNF 9 62 1 1 2 1 0.1842105 Veh 7 4 6 0 0 0 0.6470588 Con 0 2 0 10 0 1 0.2307692 Tabl 0 1 0 0 8 0 0.1111111 Head 1 3 0 0 0 25 0.1379310
tuneRF()では、説明変数がいくつの時にエラー率が一番小さくなるかが自動的に図示される。
ジニ不純度の減少量で見る重要な変数上位 2 つは、マグネシウムとアルミニウム。
ランダムフォレストの最適化のために決定木の数を変えてやってみる
最後にntreeをデフォルトの500から2000に増やしてエラー率の変化を見てみる。
set.seed(2) fgl.rf2 <- randomForest(type ~ ., data=fgl, mtry=2, ntree=2000) fgl.rf2 plot(fgl.rf2)
最終的なエラー率は19.63%と大きくは改善しなかった。
> fgl.rf2 Call: randomForest(formula = type ~ ., data = fgl, mtry = 2, ntree = 2000) Type of random forest: classification Number of trees: 2000 No. of variables tried at each split: 2 OOB estimate of error rate: 19.63% Confusion matrix: WinF WinNF Veh Con Tabl Head class.error WinF 62 6 2 0 0 0 0.1142857 WinNF 10 62 1 1 1 1 0.1842105 Veh 7 4 6 0 0 0 0.6470588 Con 0 3 0 9 0 1 0.3076923 Tabl 0 1 0 0 8 0 0.1111111 Head 1 3 0 0 0 25 0.1379310
黒の実線がエラー率。
それ以外はクラスエラー率。
デフォルトの500個でほぼ収束しているのが見て取れる。
まとめ
ランダムフォレストをチューニング(最適化)してみた。
統計ソフトRのrandomForestパッケージにあるtuneRF()で実行できる。
よりエラー率が低い決定木を作成することに成功した。
コメント