読者です 読者をやめる 読者になる 読者になる

drilldripper’s blog

機械学習とソフトウェア開発を頑張ってます

ランダムフォレストの理論と重要な特徴量の選定

Python 機械学習

ランダムフォレストと決定木学習

ランダムフォレストを理解するためには、決定木学習の手法について理解する必要があります。まず最初に決定木学習の理論について説明します。

決定木学習

決定木は親から順に条件分岐を辿っていくことで、結果を得る手法です。下は決定木のイメージです。

決定木学習とはデータの応じて上の図のような決定木を構成し、分類を行う機械学習の手法のことを指します。 f:id:drilldripper:20161005074636p:plain

決定木学習は、データの種類に応じて決定木を成長させていきます。 決定木の分類条件は、データを分類したときの情報利得IG(Infomation Gain)が最大になるようにすることです。情報利得は式(1)で表されます。

{IG(D_p, f) = I(D_p) - \sum_{j=1}^{m}\frac{N_j}{N_p}I(D_j)}\tag{1}

{D_p}は親のデータ、{N}はノード、{j}は注目しているデータを表します。 {m}は木を分割するノード数です。一般的に決定木は二分木として実装されるので、ほとんどの場合は{m=2}となります。

{I}は不純度という指標で、含まれるデータに偏りがあるほど大きな値になります。不純度の計算にはエントロピー、ジニ不純度、分類誤差などが用いられます。今回はエントロピーを使って説明をします。式(2)にエントロピーの式を示します。

{I_H(t) =  -\sum_{i=1}^{c}p(i|t)\log_2 p(i|t)}\tag{2}

{p(i|t)}はデータ数tの中に含まれているデータ数iの割合を表します。

エントロピーはデータのばらつきが大きいほど大きな値となります。例えばサンプル数100個のデータを分類したとき、左の木に100個、右の木に0個に分類すると、エントロピーは最も大きな値である1になります。逆にエントロピーが最も小さくなるのは、左右の木に50個ずつ分類したときで、エントロピーは0になります。

式(1)の{I}エントロピー{I_h}を代入することで情報利得の計算を行います。

ランダムフォレスト

ランダムフォレストは決定木を複数組み合わせて、各決定木の予測結果を多数決することによって結果を得ます。*1

以下にアルゴリズムを示します。

  1. ランダムにデータを抽出する*2

  2. 決定木を成長させる

  3. 1,2ステップを指定回繰り返す

  4. 予測結果を多数決することによって分類閾値(ラベル)を決定する。

ランダムフォレストはパラメータが非常に簡単になるという利点があります。主要なパラメータはサンプリング数と決定木を成長させる際に使用する特徴量の数だけです。決定木の特徴量数は一般的にサンプル数をnとしたときに{\sqrt n} にすると良いと言われています。*3

ランダムフォレストのメリットとデメリット

メリット

  • 特徴量のスケーリングが必要ない(SVMなどの分類手法では必要になる)
  • 考慮するパラメータが少ない
  • 並列化が容易
  • どの特徴量が重要かを知ることができる

デメリット

  • 複雑なデータではSVMなどの分類手法に比べて汎化性能が下がる

Scikit-learnを使って特徴量の重要度にアクセスする

Scikit-learnにはランダムフォレストの実装されています。今回はこの実装を使ってデータを分類行って、特徴量の重要度を調べてみます。 使用する学習データはアヤメの計測データであるIrisデータセットです。以下にソースコードと結果を示します。

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
import numpy as np
iris = datasets.load_iris()
feature_names = iris.feature_names

forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)
forest.fit(iris.data,iris.target)
importances = forest.feature_importances_
print("{0:<20}".format ("feature names"), "importances")

for (feature_name, importance) in zip(feature_names, importances):
    print("{0:<20}".format (feature_name), importance)
feature names        importances
sepal length (cm)    0.0980144976191
sepal width (cm)     0.0232983974998
petal length (cm)    0.439861958314
petal width (cm)     0.438825146567

結果をみるとpetal length(花弁の長さ)が最も重要な指標であり、sepal width( がく片の幅)が最も重要度の低い指標であることがわかります。 この結果は、SVMなどの機械学習アルゴリズムの特徴量選択の参考にすることができます。

参考文献

*1:弱学習器を組み合わせてロバストな学習器を作ることをアンサンブル学習と呼びます

*2:重複を許さないブートストラップ標本の抽出を行う

*3:ただしデータに依存するので、必ずしもこの値が良いというわけではありません