機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング

本コンテンツは機械学習入門講座を各所でやっている内容の一部を、受講者の皆様の予習・復習のために公開しているものです。対象読者は、Pythonをやったことがほとんどない方やつまづいてしまっている方でも概ね実行できるようになるレベルで書いています。解説は講座でそれなりに詳しくしているため、コードにコメントする以上の説明はあまり記述していません。

各コードはJupyterシリーズやiPythonで記述しながら実行できるように記述しています。

AI/DX/機械学習/Pythonのアドバイザリー、社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)

# 機械学習入門シリーズ記事

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. [機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール](https://qiita.com/mychaelstyle/items/d5506f372219b162c8c8) -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. [機械学習入門 vol.6 回帰 - 線形回帰](https://qiita.com/mychaelstyle/items/a12882a75d348952b1b9) -> 講座第4回に相当
1. 機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. [機械学習入門 vol.9 判別（分類）](https://qiita.com/mychaelstyle/items/34ca447a625c752dbfda) -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

# 機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング

ランダムフォレストはアンサンブル学習の一つで、回帰にも判別にも利用できる機械学習アルゴリズムです。今回では、ランダムフォレスト回帰の実装であるRandomForestRegressorを利用して学習・予測をしてみたのちにハイパーパラメータのチューニングを行なって精度向上を図る方法を実践してみます。

```python
# ランダムフォレスト回帰をインポート
from sklearn.ensemble import RandomForestRegressor
# 絶対平均誤差のインポート
from sklearn.metrics import mean_absolute_error

# 学習時間と合計点数を取り出し
data_x = df.loc[:,'国語':'社会']
data_y = df['週の学習時間']
# データをトレーニング用と検証用に分割
train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2)
# ランダムフォレスト回帰インスタンス
forest = RandomForestRegressor()
# ランダムフォレストで学習
forest.fit(train_x, train_y)
```

上記でトレーニングは終了です。ランダムフォレストでは学習に利用したパラメータの寄与度（重要度・貢献度）を表示して、どのパラメータが学習に影響があったのかを0-1の値で見ることができます。

```python
# パラメータの寄与度を表示
print(forest.feature_importances_)
```

前回同様に平均絶対誤差をみて精度を確認してみましょう。

```python
# テストデータを予測する
predicteds = forest.predict(test_x)
predicteds
# 精度検証
mean_absolute_error(test_y, predicteds)
```

講座内でやった、折れ線グラフでサンプルごとの予測・正解の値がどれだけずれているのか可視化してみましょう。

```python
import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(20,10))
plt.plot(test_y.values,label="True")
plt.plot(predicteds, label="Predicted")
plt.legend()
plt.title('比較')
plt.xlabel('サンプル番号')
plt.ylabel('時間')
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28471/e67d2e80-6509-011d-0086-75599c6acab8.png)

## ハイパーパラメータのチューニング

RandomForestRegressorの事前パラメータについては講座で説明しました。GridSearchCVクラスを利用して、ハイパーパラメータの組み合わせを実行して精度高く学習できた機械学習モデルを取り出す手順を実行してみましょう。

```python
# GridSearchCVをインポート
from sklearn.model_selection import GridSearchCV
# 試したいハイパーパラメータを各々に配列で用意
params = {
    'n_estimators'  : [4, 8, 16, 32],
    'max_depth' : [8, 16, 32, 64],
    'n_jobs': [-1]
}
```

GridSearchCVクラスでfitをコールしトレーニングします。

```python
# GridSearchCVにランダムフォレストと試行パラメータを
# 渡してインスタンス作成
cv = GridSearchCV(
    RandomForestRegressor(),
    params,
    verbose=2
)
# トレーニング
cv.fit(train_x, train_y)
```
トレーニングが完了したモデルインスタンスがGridSearchCVクラスに格納されているので取り出して利用してみます。

```python
# もっとも精度が良かったモデルを取り出して予測
forest = cv.best_estimator_
preds = forest.predict(test_x)
# 精度検証
mean_absolute_error(test_y, preds)
```

# 機械学習入門シリーズ記事

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. [機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール](https://qiita.com/mychaelstyle/items/d5506f372219b162c8c8) -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. [機械学習入門 vol.6 回帰 - 線形回帰](https://qiita.com/mychaelstyle/items/a12882a75d348952b1b9) -> 講座第4回に相当
1. 機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. [機械学習入門 vol.9 判別（分類）](https://qiita.com/mychaelstyle/items/34ca447a625c752dbfda) -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

AI/DX/機械学習/Pythonのアドバイザリー、社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)