ランダムフォレストの概要

概要

“Pythonではじめる機械学習”のランダムフォレストの写経。

ランダムフォレストは決定木のアンサンブル法の1つ。異なる複数の決定木をランダムに発生させて平均をとることで、個々の決定木の過剰適合を打ち消すという考え方。

実行例

以下は、scikit-learnのランダムフォレストのモデルRandomForestClassifiermoonsデータセットをクラス分類した例で、ランダムに生成された5つの木とそれらを平均したランダムフォレストの決定領域を示している。

以下は実装コードで、draw_decision_field()draw_tree_boundary()はコードを省略。

上の例でn_estimatorsの数を1から9まで増やしていったときの様子を示す。徐々に細かい枝が取り払われて、境界が滑らかになっていく様子がわかる。

ランダムフォレストの考え方

概要

ランダムフォレストの大まかな手順は以下の通り。

  1. 訓練/ランダムフォレストの構築
    1. 決定木の数を指定する
    2. 決定木の数の分だけ、訓練データからランダムにデータを生成する
    3. 各決定木を学習させる
  2. 予測段階
    1. 予測したいデータの特徴量を与える
    2. その特徴量に対して各決定木がクラス分類
    3. 各決定木の分類結果の多数決でクラスを決定

ランダムフォレストの構築

決定木の数

決定木の数をRandomForestClassifiern_estimatorsパラメーターで、構築する決定木の数を指定する。

決定木に与えるデータの生成

各決定木に与えるデータセットをランダムに設定。特徴量の一部または全部を選び、各特徴量のデータをブートストラップサンプリングによってランダムに選び出す。

RandomForestClassifierでは、選ぶ特徴量の数をmax_featuresで指定し、各特徴量のデータをブートストラップサンプリングで選ぶかどうかをbootstrap(=True/False)で設定する。これらの乱数系列をrandom_stateパラメーターで指定する。

冒頭の事例の場合、特徴量は2つなので常にいずれも選び、bootstrapはデフォルトのTrue、決定木の数を3つ、乱数系列を3と指定している。

ランダムフォレストによる予測

ある特徴量セットを持つデータのクラスを予測する。与えられたデータに対して、各決定木がクラスを判定し、その結果の多数決でそのデータのクラスを決定する。

クラス分類でランダムフォレストが多数決で任意の点のクラスを決定する様子を確認する。以下は10個のmoonsデータセットに対して3つの分類木を適用した例。

訓練後のランダムフォレストにおいて、各点のクラスが多数決で決められていることが、以下の図で確認できる。

cancerデータによる確認

精度

breast_cancerデータに対してランダムフォレストを適用する。100個の決定木を準備し、他のパラメーターはデフォルトのままで実行する。

このコードの前半の実行結果は以下の通りで、訓練データに対して完全適合し、テストデータに対しても97.2%の精度を示している。

【注】決定木の数による違い

n_estimatorの数によって、テストスコアが違ってくるが、このケースでは100以上決定木の数を多くしてもテストスコアは向上しない。

  • n_estimators = 10 → 0.951
  • n_estimators = 50 → 0.965
  • n_estimators ≥ 100 → 0.972

特徴量重要度

後半の実行結果は以下のように表示される。単独の決定木による特徴量重要度と比べて全ての特徴量が0以上の重要度となっている。決定木の時に最重要であったworst radiusも重要度が高いが、worst perimeterが最も重要度が高く、worst concave pointsやconcave pointsも重要度が高い。

今後の課題

  • ランダムフォレストにおける特徴量重要度の意義
  • n_jobsの効果
  • RandomForestClassifierrandom_stateによる違い
  • max_featuresmax_depthmin_samples_leafなどの影響
    • デフォルトはmax_features=sqrt(n_features)、max_depth=None(all)、min_samples_leaf=1

 

コメントを残す

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