Random Forestの仕組みを理解する ― 決定木との違いとアンサンブル学習

今回はRandom Forest(ランダムフォレスト)の仕組みについて学習した。

これまで決定木(Decision Tree)を学習し、過学習(Overfitting)がどのように起こるかを確認してきた。今回はその弱点をどのように改善しているのかを理解することが目的である。

今回もChatGPTを講師兼壁打ち相手として活用しながら、「なぜそうなるのか」を意識して学習を進めた。


これまでのおさらい

前回までに、Titanicデータセットを用いて決定木の学習を行った。

max_depthを制限しない場合は学習データには非常に高い精度を示す一方、未知データに対する精度は低下することを確認した。

train accuracy : 約97.9%
test accuracy  : 約76.0%

これは学習データをほぼ丸暗記してしまった典型的な過学習である。


Random Forestを試してみる

今回はRandom Forestを使用し、5分割交差検証(Cross Validation)で評価した。

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

rf = RandomForestClassifier(
n_estimators=100,
random_state=42
)

scores = cross_val_score(
rf,
X,
y,
cv=5
)

print(scores)
print(scores.mean())

実行結果は以下のようになった。

[0.75977654 0.81460674 0.85393258 0.79213483 0.84831461]
0.8137530600715586

 


コードを一行ずつ理解する

RandomForestClassifier

Random Forestは名前の通り「決定木をたくさん集めたモデル」である。

今回は

n_estimators=100

を指定している。

最初は「100とは何だろう?」と思っていたが、これは100本の決定木を作成するという意味だった。

最初は「木を100本作るだけで精度が上がるのか?」と疑問に思ったが、仕組みを理解すると納得できた。

cross_val_score()

cross_val_score()は交差検証を行う関数である。

cv=5を指定すると、データを5分割し、それぞれをテストデータとして評価する。

  • 1回目:①をテスト、②〜⑤で学習
  • 2回目:②をテスト、①・③〜⑤で学習
  • 5回目:⑤をテスト、①〜④で学習

その5回分のAccuracyが配列として返され、最後に平均値を計算している。


決定木とRandom Forestの違い

最初は、Random Forestは「決定木を100本作るだけ」だと思っていた。

しかしChatGPTとの対話を通して、「同じ決定木を100本作っても意味がない」という点を理解できた。

もし100本とも全く同じ木であれば、100本とも同じ予測をするだけで、多数決をしても結果は変わらない。

Random Forestでは、各決定木が少しずつ異なるデータ・異なる特徴量を使って学習することで、それぞれ違う判断を行う。

その結果、多数決によって個々の木の誤りを打ち消すことができる。


疑問に思ったこと

学習中に一つ疑問が浮かんだ。

「100本の決定木を作るとして、それぞれの木の深さ(max_depth)はどこで決まるのだろう?」という点である。

確認したところ、何も指定しなければ

max_depth=None

となり、各決定木は可能な限り深く成長する。

ただしRandom Forestでは各木が異なるデータを学習するため、1本の決定木ほど過学習しにくくなっている。

もちろん、以下のように指定すれば全ての決定木に同じ深さ制限を与えることもできる。

RandomForestClassifier(
    n_estimators=100,
    max_depth=5,
    random_state=42
)

理解度確認として考えたこと

講師役のChatGPTから次の質問を受けた。

RandomForestClassifier(
    n_estimators=1,
    max_depth=None
)

これはどのようなモデルになるだろうか。

自分なりの答えは、

  • 決定木を1本だけ作る
  • max_depth=Noneなので学習データをほぼ丸暗記しようとする
  • つまりRandom Forestではなく、ほぼ通常の決定木と同じ振る舞いになる

というものだった。

このやり取りを通じて、Random Forestの本質は「決定木を大量に作ること」ではなく、「少しずつ異なる決定木を多数作り、多数決によって精度を向上させること」であると理解できた。


今回の学び

  • n_estimatorsは決定木の本数を表す
  • Random Forestは決定木の集合(アンサンブル学習)である
  • 交差検証はモデルの性能をより公平に評価できる
  • Random Forestでは各決定木が異なるデータ・特徴量で学習する
  • 多数決だけではなく、「異なる木を作ること」が重要である

次回

ここまでで代表的な機械学習アルゴリズムを一通り触ることができた。

次回からは特徴量エンジニアリングに入り、モデルそのものよりも「どのような特徴量を作るか」に焦点を当てて学習を進める予定である。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA