MENU

R でランダムフォレストを最適化する方法

ランダムフォレストはチューニングして最適化する。

チューニングは決定木を最適化する方法。

ランダムフォレストの場合は、決定木の数と特徴量(説明変数)の数を最適化する。

>>もう統計で悩むのは終わりにしませんか? 

↑期間・数量限定で無料プレゼント中!

目次

ランダムフォレストのパッケージのインストールと準備

最初に一回だけパッケージのインストールをする。

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つは、マグネシウムとアルミニウムと屈折率。

ジニ不純度が大きく下がる変数が、識別に役立つ重要な変数。

>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

ランダムフォレストを最適化(チューニング)する

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()で実行できる。

よりエラー率が低い決定木を作成することに成功した。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

リサーチクエスチョン探し?データ分析?論文投稿?、、、で、もう悩まない!

第1章臨床研究ではなぜ統計が必要なのか?計画することの重要性
  • 推定ってどんなことをしているの?
  • 臨床研究を計画するってどういうこと?
  • どうにかして標本平均を母平均に近づけられないか?
第2章:研究目的をどれだけ明確にできるのかが重要
  • データさえあれば解析でどうにかなる、という考え方は間違い
  • 何を明らかにしたいのか? という研究目的が重要
  • 研究目的は4種類に分けられる
  • 統計専門家に相談する上でも研究目的とPICOを明確化しておく
第3章:p値で結果が左右される時代は終わりました
  • アメリカ統計協会(ASA)のp値に関する声明で指摘されていること
  • そうは言っても、本当に有意差がなくてもいいの…?
  • なぜ統計専門家はp値を重要視していないのか
  • 有意差がない時に「有意な傾向があった」といってもいい?
  • 統計を放置してしまうと非常にまずい
第4章:多くの人が統計を苦手にする理由
  • 残念ながら、セミナー受講だけで統計は使えません。
  • インプットだけで統計が使えない理由
  • どうやったら統計の判断力が鍛えられるか?
  • 統計は手段なので正解がないため、最適解を判断する力が必要
第5章:統計を使えるようになるために今日から何をすれば良いか?
  • 論文を読んで統計が使えるようになるための5ステップ
第6章:統計を学ぶために重要な環境
  • 統計の3つの力をバランスよく構築する環境

以下のボタンをクリックして、画面に出てくる指示に従って、必要事項を記入してください。

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

統計解析が趣味

コメント

コメントする

目次