【機械学習】Pycaretでモデル比較が爆速化！？インストール方法〜可視化まで


#内容と想定読者
Pycaretを使ってみようと思ったときのメモになります。
やることは回帰(regression)です。
導入から分析までの流れをメモしました。
初めてPycaretを触る方の一助になればと思います。
# Pycaretのインストール
pipで行けるんだろーなとか思ってやったらエラー。
原因を解消するより仮想環境を作る方が簡単そうだったのでそうしました。
ってことで、ターミナルを開いて、condaで仮想環境の作成。
今回は仮想環境名PyCaret、Pythonバージョンは3.6で作成しました。

```terminal:仮想環境作る
conda create --name PyCaret python=3.6  
```
作成した環境に移動。

```terminal:作成した仮想環境へ移動
conda activate PyCaret 
```
pycaretのインストール

```terminal:pycaretのインストール
pip install pycaret
```
これで完了。（pycaretいらんってなったら、仮想環境ごと削除）

<b>自分はJupyter Notebookを使いたいので、次の設定も行いました。</b>

1. Anaconda Navigator を開いて、Application on で作成した仮想環境を選択。
![スクリーンショット 2021-12-04 15.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/b998b94a-d3c8-fe00-6a36-175a50921ac1.png)

2. Jupyter Notebook をインストール
![スクリーンショット 2021-12-04 15.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/6ddd07f9-9685-53b7-4a05-b5dd53bfe090.png)
インストールが完了したら、 Jupyter Notebook を起動。

# Pycaretの呼び出しとlightGBM周りのエラー
上記の手順でPycaretのインストールに成功したので、早速Pycaretを使っていきたいところですが、まだもうちょっとインストールしないといけないものがあります。それがlightgbmとlibompとbrewになります。

<b>＜↓なんでこれらが必要なのか気になる人向け↓＞</b>
pycaretはいくつかのモデルを自動で生成し、モデル毎のテスト結果を比較出力ができます。その際、デフォルトでlightgbmが呼ばれるのでインストールしておかないとエラーになります。また、lightgbmは並列処理を行うのでそのためにlibompが必要になります。ただ、このlibompがbrew経由でのインストールになるので、brewも合わせてインストールが必要になります。
<b>＜説明終わり＞></b>

ってことでインストールします。

```terminal:lightgbmのインストール
pip install lightgbm
```

brewは公式サイトからダウンロード用URLをとってきて、実行する。
これめっちゃ時間かかります。
![スクリーンショット 2021-12-04 16.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/7f55c6de-8a16-d681-98c2-43325f7ccfbd.png)

```terminal:brewのインストール
/bin/bash -c "$(curl -fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

brewがインストールできたので、それを使ってlibompのインストール

```terminal:libompのインストール
brew install libomp
```

以下簡単な動作確認。

```python:jupyter_notebookを開いて、以下を実行
import pycaret
```
これで pycaret がインポートできたら下準備はおしまいです。

#ようやく本編？〜分析開始！〜
ってなことで、importまでもなかなか大変だったわけですが、ここから実際に使っていこうと思います。
今回はBostonデータを使った家賃予想をやってみたいと思います。（有名なやつですね）
色々なサイトでBostonデータに対して高精度となるようなパラメーターの調整やらなんやらされてると思いますが、
この記事ではそんなことは目指しません。なんとなく触ってみる。そんな感じです。

では、まずデータの取得から

```python3:sample.py
from pycaret.regression import *
from pycaret.datasets import get_data

data_set = get_data("boston")
```
![スクリーンショット 2021-12-05 19.15.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/7c2891f6-6851-c2ec-fd31-0f2104e49e1b.png)
続いて、pycaret独特のsetupってのを行います。
まぁ簡単に言うと前処理なんですが、pycaretを使って分析を行うにはsetupは必須作業です。
デフォルトでも、特徴量のデータタイプ推定、IDや日付データの削除、欠損値の補完、train_test_split、乱数シード設定、データサンプリングを行ってくれます。（詳しくは公式サイト：https://pycaret.org/setup/）
もちろんデフォルトで設定されていないものはオプション指定可能です。
今回は多重共線性の項目だけオプション設定してみてます。

```python3:sample.py
exp = setup(data_set, target='medv', remove_multicollinearity=True)
```
![スクリーンショット 2021-12-05 19.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/136682e3-f46c-b556-76df-9e7ce1b3a110.png)
そうすると各特徴量に対して、推定されるデータタイプが返されます。
一応目視で間違いないかを確認して、問題なければEnter。今回は問題なさそうなのでEnterでsetupを完了させます。
問題があればquitを入力し、手動で調整が必要です。（公式サイト：https://pycaret.org/setup/）
![スクリーンショット 2021-12-05 19.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/67aea7ad-6505-8f99-16a3-4b30c2b3e283.png)

さて、ここから従来の分析であればいくつかのモデルを試して、モデルを選定していくって感じになるかと思います。
↑この作業めんどくさくないですか？

pycaretには、モデル比較用の関数が用意されており、これがめちゃくちゃ便利！！

```python3:sample.py
compare_models()
```
この一文で複数のモデルでスコアを算出してくれます！
（ちなみにデータを入れんでいいの？と言われそうですが、どのデータを対象にするかなどはsetupで設定が完了しているみたいです。）
ってことで今回の結果はこんな感じ。
![スクリーンショット 2021-12-05 19.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/e71bb27b-d838-f90c-f660-7d87422344bf.png)
 <b>※各モデルごとに必要なパラメータはデフォルト値</b>
Modelのところには分析モデルが書かれていて、MAEから右のところはスコア。結果も見やすくていいですね。

今回は回帰なのでR2が大きいExtra Tree を使って話を進めます。
モデルは以下のように選択します。

```python3:sample.py
model = create_model("et")
```
モデル比較結果の一番左の値を引数に取る感じです。
ちなみに、compare_models()の返り値はbestモデル（結果の一番上のやつ）になってるので、
model = compare_models() ってな感じで受けてもいいかもです。

本来は、上位三つくらいのモデルに対してパラメータ調整とかやって精度を高めた上で
どのモデルを採用するかを検討すべきなんでしょうけど、今回はやりません。

次はハイパーパラメータのチューニングですね。やっちゃいましょう！

```python3:sample.py
tuned_model = tune_model(model)
```
![スクリーンショット 2021-12-05 19.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/37f01333-386f-0c01-9912-7e8ef6a21bd0.png)

はい！これでハイパーパラメータのチューニングも完了！！！
と言いたいところですが、よく見てみるとチューニング前後でR2スコアが下がってしまっていることに気づきます。
compare_models()を行った時のスコアは0.86669ですよね。
（この辺は乱数のせいじゃない？と思う方もいるとは思いますが、setup時に乱数シードの設定をしているので何度やってもこの結果は変わりません。）

今回のハイパーパラメータチューニングは、デフォルト値ではうまく行きませんでした。

仕方ないので、ここはいつも通り？引数を設定してあげましょ〜。

```python3:sample.py
import numpy as np
params = {'max_depth':np.random.randint(1,(len(data.columns)*.85),20),
          "max_features": np.random.randint(1, len(data.columns),20),
          "min_samples_leaf": [2,3,4,5,6],
}
tuned_custom_model = tune_model(model, custom_grid = params)
```
![スクリーンショット 2021-12-05 20.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/509f0826-48a7-52ca-e579-bbc1e1930cc9.png)

そうすると少しですが、R2スコアが大きくなったのが確認できますね。（元々は0.86669）
まぁ、これが最適です！なんては到底言えないですが、、、
グリッドサーチするための引数を渡すことでハイパーパラメータの調整もできるよーってことがわかったのでOKとします。

#結果の可視化
主に、plot_modelとevaluate_modelの二つで結果の確認が可能

```python3:sample.py
plot_model(tuned_custom_model)
```
![スクリーンショット 2021-12-05 20.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/bf3a97fb-5835-c439-4689-5e916f91dca1.png)

evaluate_model()では、グラフ上のボタンを押すことで様々な特徴量を確認することができる。

```python3:sample.py
evaluate_model(tuned_custom_model)
```
![スクリーンショット 2021-12-05 23.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/fe604897-bb95-573e-ca8b-069cd530bf0e.png)

#予測精度の確認
predict_model()を使うことで予測精度の確認ができます。
特にデータは指定していませんが、setup時にトレーニングデータとテストデータに分けられているので、問題なし！
ちなみに、predict_modelではテストデータが使われます。

```python3:sample.py
predict_model(tuned_custom_model)
```
![スクリーンショット 2021-12-05 23.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507532/2ed7fa65-cc3b-8695-bd8b-692d228c8d8a.png)

スクロールバーで一番右にすると予測結果（Label）と正解データ(medv)が確認できます。
R2も0.8459と言うことで過学習も特にして無さそうな感じかなー、まずまずって感じですかね。

#振り返り（個人の感想）
と言うことで、まずはここまで読んでいたただいてありがとうございます。
pycaretのインストール、モデル構築/予測をやってみました。個人的にはすごく便利だなーといった印象でした。
ただ、pycaretも一応前処理を行ってくれますが、pycaretに入れるデータの前処理はpandas等で行った方がいいのかなーと思いました。
（欠損値補間で平均が入るのですが、個人的にはラベル別の平均値とかを入れたいので）

「pandasでインプットデータを整えて、pycaretに渡す」
こんな感じになるのかな〜、まぁ使いやすいように使えってことですね。

以上、お疲れ様でした！