Python機械学習!ランダムフォレストの概要とsklearnコード

  • このエントリーをはてなブックマークに追加

機械学習アルゴリズムの1つ、ランダムフォレストは決定木分析とアンサンブル学習を用いた汎化性能の高い分析手法です。ここではランダムフォレストを理解するための概要説明と、Python/scikit-learnによるコード習得を目標とします。

こんにちは。wat(@watlablog)です。機械学習シリーズ!今回はランダムフォレストの概要説明を行い、scikit-learnで計算できるようになることを目指します

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

ランダムフォレストとは?

ランダムフォレスト(Random Forest)とは、決定木を複数作成し、分類問題であれば多数決、回帰問題であれば平均をとって予測を行う手法です。

ランダムフォレストを理解するためには、決定木分析の理解が必要不可欠です。まだ決定木分析について曖昧な点がある方は「Python/sklearnで決定木分析!分類木の考え方とコード」に概要を書きましたので、是非読んでみて下さい。

決定木というのは以下の図のように、ある特徴量について条件分岐を繰り返して分類等の分析を行う手法でした。

この決定木は複雑な分析を行うことが可能でかつ人間が理解しやすい手法ですが、過学習オーバーフィッティング)を起こしやすいという欠点があります。

決定木の例

決定木の過学習しやすさを軽減し、より汎化能力を高めようと考案されたものの1つが決定木を複数作成するランダムフォレストという分析手法です。

決定木を複数作成する」とは、以下の図のイメージです。多様性を持った多数の木から答えを1つに決定する様子はまるで民主主義のようですね。

ランダムフォレストのイメージ

ランダムフォレスト分析は決定木をいかに複数作るかという所がキーポイントになります。

ランダムフォレストのアンサンブル学習

アンサンブル学習とは?

アンサンブル学習とは、複数のモデルを使用して結果を予測する機械学習のテクニックです。

単一の決定木モデルと異なりランダムフォレストは複数の決定木を作るため、アンサンブル学習をしていると言えます。

バギングとは?

アンサンブル学習の代表的な方法にバギングという手法があります。

バギングはデータセットからサブデータセットを抽出し、抽出したサブデータセットを再度本体に戻してから再度抽出…というブートストラップと呼ばれる復元抽出を繰り返して複数の学習をさせる手法です(バギング(BAGGING)は、Bootstrap AGGregatINGの略)。

データの抽出規則については様々な手法があるみたいですが、ランダムフォレストは元のトレーニング用データセットからランダムに複数の特徴量を選び、決定木の分岐ノードの条件式に使用するとのこと。

ランダムに抽出することで、多様性を高めることができ、結果として汎化性能が高くなるという狙いがあるそうです。

ディープラーニングG検定ジェネラリスト問題集」のP66の解説に書いてあるように、「ランダムフォレストとは決定木とバギングを組み合わせた手法」と言ってしまっても良いのかな?(→本も疑うタイプなので…)
ちょっと言葉の用法が正しいか自信が無いので、実践データ分析に慣れたらこの辺を再確認します!

注目の新資格「G検定」の問題集!業界の第一人者+AI時代の教育機関によるわかりやすい解説!!

ランダムフォレストのハイパーパラメータ

各機械学習アルゴリズムはエンジニアが事前に値を調整しないと精度が高くならないハイパーパラメータを持ち、ランダムフォレストの場合の例外はありません。

以下にscikit-learnで調整可能なランダムフォレストの主なハイパーパラメータを示します。本当はさらに細かく沢山ありますが、個人的な主観で絞っているため、全て見たいという方は以下のscikit-learnの公式ページをご確認下さい。

公式)sklearn.ensemble.RandomForest:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

ランダムフォレストならではの設定でn_estimatorsがありますが、これは何本の決定木を作るかという設定です。デフォルトが100なので通常はそのくらい作るのでしょうか。

その他criterionは不純度評価指標のことで、デフォルトがジニ係数です。その他エントロピーもありますがこの辺りの解説は「Python/sklearnで決定木分析!分類木の考え方とコード」に記載しましたので是非ご確認下さい。

Python/scikit-learnのランダムフォレストで分類するコード

全コード

それではここから実際に手を動かしてランダムフォレストを使ってみましょう!

scikit-learnを使えば驚くほど簡単にランダムフォレストによる分析が可能です。以下にサンプルの全コードを示します。

importで「from sklearn.ensemble import RandomForestClassifier」とあるように、ランダムフォレストはアンサンブル学習の分野に入っています。

当ブログの恒例として、サンプルのトレーニングデータ生成(わざわざPandas形式で作ってみたり)している部分やグラフ表示部分が長いですが、ランダムフォレストによる分類部分はほんのちょっとです。

使い方も他のscikit-learn機械学習アルゴリズムと全く同じなので、各アルゴリズムでデータフォーマットを区別する必要もなく簡単に使えてしまえます。

実行結果

上記コードを実行すると以下の結果を得ます。決定境界を見ると、決定木の特徴としてかなり非線形な線が得られました。このような分類が可能な分類器でさらに汎化性能が高くなる条件が出せれば、強力な道具として使えそうですね。

ランダムフォレストの分類結果

まとめ

本記事では機械学習アルゴリズムの1つであるランダムフォレストについて概要を記載しました。

基本的な分類アルゴリズムは決定木なので大部分は前回の決定木の記事を参照頂ければと思います。

特にランダムフォレストのキーワードはアンサンブル学習で、バギングの際にサブデータセットをランダムに選ぶ所に特徴があります。

ハイパーパラメータもイメージしやすく、今後様々なデータに対してどう効いてくるのかを試せたらと思います。

ついにアンサンブル学習を学び始めました!詳細は専門書を購入して読んだ方がよさそうですが、なんとなくのイメージは掴めたと思います!

SNSでもご購読できます。

コメント

コメントを残す

*