- ランダムフォレスト(Random forest)とは何か
- ランダムフォレスト(Random forest)のアルゴリズム
- ランダムフォレストに決定木が使われる理由
- pythonでのナイーブベイズの実装
ランダムフォレスト(Random forest)とは?
ランダムフォレストは、決定木を複数個利用し、多数決を取って予測するモデルです。
ランダムフォレストは分類と回帰のどちらの問題にも利用することができます。
言葉だけだと分かりづらいので、以下にランダムフォレストの分類のイメージを示します。
まず、決定木のモデルをたくさん用意し、それぞれに問題の予測をさせます。
決定木が出した予想を集計し、多数決(一番予測されたものの多かった答え)の結果がランダムフォレストの予測です。
このように複数の学習モデルの結果を組み合わせるテクニックをアンサンブル学習といいます。
![ロボくん](https://nisshingeppo.com/ai/wp-content/uploads/2020/03/ロボくん.jpg)
ランダムフォレストは、一人で考えて結果を出すのではなく、みんなで相談して多数決で答えを出す民主主義な手法だね。
そもそも決定木とはなんだっけ??という人は下の記事を参考にしてみてください。
![](https://nisshingeppo.com/ai/wp-content/uploads/2021/04/決定木とは?分類木、回帰木の違いも分かりやすく解説-160x90.jpg)
ランダムフォレストのアルゴリズム
ランダムフォレストでは、アンサンブル学習のバギング(ブートストラップ集約)を使っています。
アンサンブル学習を詳しく知りたい人は以下の記事をご覧ください。
![](https://nisshingeppo.com/ai/wp-content/uploads/cocoon-resources/blog-card-cache/f83cbaf20e8c32ac695b5288d1303e73.png)
具体的なアルゴリズムは3ステップで行われます。
- 学習データからN個のデータ集合を取り出す(ブートストラップ法 + 特徴量の選択)
- 取り出したデータ集合を使って決定木をN個生成する
- N個の決定機の予測値の平均を取って、最終的な予測値とする
1. 学習データからN個のデータ集合を取り出す(ブートストラップ法 + 特徴量の選択)
決定木をN個作るために学習データをN個に分けます。
学習データにブートストラップ法と特徴量の選択の2段階でデータ群を作成していきます。
ブートストラップ法では学習データをランダムに抽出(重複可)してデータ群を作成し、
その後に特徴量をランダムに選択することで多様性のあるデータ群を作成することが可能です。
![ロボくん](https://nisshingeppo.com/ai/wp-content/uploads/2020/03/ロボくん.jpg)
データを分けることで、多種多様な決定木を作るんだね。
同じデータ群から決定木を作ってしまうと似たような推測をするモデルができてしまい、多数決を取る意味がなくなってしまうよ。
2. 取り出したデータ集合を使って決定木をN個生成する
取り出したデータ集合に対してそれぞれ決定木を作成します。
決定木の構築アルゴリズムは以下の記事に詳細が説明されています。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JTVCJUU1JTg1JUE1JUU5JTk2JTgwJTVEJUU1JTg4JTlEJUU1JUJGJTgzJUU4JTgwJTg1JUUzJTgxJUFFJUU1JTg4JTlEJUU1JUJGJTgzJUU4JTgwJTg1JUUzJTgxJUFCJUUzJTgyJTg4JUUzJTgyJThCJUU1JTg4JTlEJUU1JUJGJTgzJUU4JTgwJTg1JUUzJTgxJUFFJUUzJTgxJTlGJUUzJTgyJTgxJUUzJTgxJUFFJUU2JUIxJUJBJUU1JUFFJTlBJUU2JTlDJUE4JUU1JTg4JTg2JUU2JTlFJTkwJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz1lYzNlYjIxOWU0YWE2ZGQ3OGRlZjc1NzU0NDY3NTNhMA&mark-x=120&mark-y=96&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDAzMDAwbWFuSlBZJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0yN2ZkMzA5YzdkYmZkY2UyOTQxYzJkYzJjNDNmOWUzYw&blend-x=120&blend-y=445&blend-mode=normal&txt64=aW4gUCZEIOKAkyBQbGFubmluZyBhbmQgRGV2ZWxvcG1lbnQg4oCTIA&txt-width=972&txt-clip=end%2Cellipsis&txt-color=%233A3C3C&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=134&txt-y=546&s=a38c50a3e07a7e364eb99eafb826cb34)
3. N個の決定機の予測値の平均を取って、最終的な予測値とする
ランダムフォレストではN個の決定木の予測値の単純平均を取っています。
変数の定義
- y: ランダムフォレストの予測値
- x: 決定木の予測値
- N: 決定木の数
単純平均なので以下のような数式で計算することができます。
$$y = \frac{1}{N} \sum_{n=1}^{N}x_n $$どうしてランダムフォレストでは決定木を使うの?
アンサンブル学習のバギングは、複雑なモデル(分散大・バイアス小)を複数組み合わせて誤差を減らすという考え方をしています。
複雑なモデルはデータに柔軟にフィットできる一方で、過学習が起こりやすいというデメリットがあります。
過学習するとデータの外れ値による影響を受けやすいのですが、たくさんのモデルを使い平均を取ることでこのデメリットをなくせるのではないかと考えられています。。
決定木は複雑なモデルの代表例であり、バギングと相性が良いためランダムフォレストというモデルが生まれました。
また、決定木は「処理が高速」、「インプットのデータ型を問わない」、「スケーリングしやすい」といった特徴もあり、バギングに向いている機械学習モデルと言うことができます。
ランダムフォレストをpythonで実装
必要ライブラリのインポート
from sklearn.datasets import load_wine from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score
データの生成
#データ生成 data = load_wine() X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3)
ランダムフォレストのモデルで学習する
#ランダムフォレストで分類する model = RandomForestClassifier() model.fit(X_train, y_train)#学習 y_pred = model.predict(X_test)#推定 accuracy_score(y_pred, y_test)
結果は
0.9814814814814815
となり、98%の分類精度となりました。
まとめ
ランダムフォレストとは何かをまとめると以下の3つの特徴を持つモデルです。
- 決定木を用いたアンサンブル学習(バギング)のモデル
- 分類と回帰問題のどちらにも用いることができるモデル
- シンプルなモデルが元になっているので、結果の透明性があるモデル
コメント