Pycaretチュートリアル_二値分類

# Introduction
色々な機械学習モデルを簡単に比較できるライブラリPycaretについて基本的な使用方法をまとめる。
今回は2値分類問題に適用する。

開発環境
- VScode/Jupyter

バージョン
- Python: 3.8.13
- pycaret: 2.3.10

参考サイト
- [Binary Classification Tutorial (CLF101) - Level Beginner](https://nbviewer.org/github/pycaret/pycaret/blob/master/tutorials/Binary%20Classification%20Tutorial%20Level%20Beginner%20-%20%20CLF101.ipynb#Binary-Classification-Tutorial-(CLF101)---Level-Beginner)

# パッケージインポート
```py
import pycaret
from pycaret.classification import *

pycaret.__version__
```

# データの取得
`get_data()`でpycaretライブラリに用意されているcreditデータを取得
目的変数はdefault(債務不履行の有無)
使用可能なデータ一覧：[pycaret/datasets](https://github.com/pycaret/pycaret/tree/1eff59610b86f3719688570c4b4f0cf6a4de933c/datasets/)

```py
from pycaret.datasets import get_data
dataset = get_data('credit')
print(dataset.shape)
```
<details>
<summary>Out:</summary>

![dataset.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/cbbf714f-65cb-131a-71ba-7cc368dde571.png)
</details>

全データの10%を未知データとして用意

```py
data = dataset.sample(frac=0.90, random_state=0)
data_unknown = dataset.drop(data.index)
data.reset_index(inplace=True, drop=True)
data_unknown.reset_index(inplace=True, drop=True)
print('Data for modeling: ' + str(data.shape))     #Data for modeling: (21600, 24)
print('Data for test: ' + str(data_unknown.shape)) #Data for test: (2400, 24)
```

# データの前処理
`set()`関数を使ってデータの前処理を実行
以下の引数が最低限必要
`set(data=訓練データフレーム,target=目的変数)`
session_idは乱数シード値であるため再現性を保つために設定しておくと良い

`set()`関数を実行すると各説明変数のデータ型が表示される
表示内容を見て問題なければEnterキーを押す
問題がある場合はquitを入力してEnterを押す
本来ならデータ型が正しいかを判断し問題があれば引数の調整を行うが、それには経験が必要なため今回はスルー

セットアップが完了すると色々な情報が表示される
最低限以下を確認しておくと良い
- 2.Target Type: Binary(二値分類)かMulticlass(多クラス分類)かを判定
- 3.Label Encoded: 目的変数のエンコードをしたか
- 4.Original Data: データの形状を表示
- 5.Missing Values: 元データに欠損値があるかを判定
- 6.Numeric Features: 数値型の説明変数の数
- 7.Categorical Features: カテゴリー型の説明変数の数
- 11.Transformed Train Set: 訓練データの形状。ラベルエンコーディングにより変数の数が増えている。
- 12.Transformed Test Set: テストデータの形状
- 15.Fold Generator: 交差検証の方法
- 16.Fold Number: 交差検証の回数

このあと行うモデル比較ではデフォルトでは上記の15と16に表示した方法と回数で交差検証が行われる

```py
exp = setup(data = data, target = 'default', session_id=1)
```

<details>
<summary>Out:</summary>

![exp1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/76f941ec-ab47-c055-717a-c468382c4dcb.png)

![exp2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/d3aa433a-327d-bc94-e60e-66aa2987632a.png)
</details>

# モデル比較
`compare_models()`でモデルの比較を実行
デフォルトでは交差検証を10回の平均値をAccuracyが高い順に表示
最も精度が良かったモデルが返却される
```py
best_model = compare_models()
print(best_model)
```
<details>
<summary>Out:</summary>

![compare_model.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/768fc7e1-06e7-f2a1-1a1c-58a69d947973.png)
</details>



# モデル作成
`create_model()`を利用してモデルを作成
使用可能なモデルは`models()`で確認可能

```py
models()
```

<details>
<summary>Out:</summary>

![model.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/d727c2d4-37a3-7acb-5724-714ad7f7b17a.png)
</details>

```py
ridge = create_model('ridge')
ridge
```

<details>
<summary>Out:</summary>

![create_model.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/d72aeb20-8774-1e0e-a2b6-0a1f05212b5e.png)
</details>

# モデルチューニング
`tune_model()`でハイパーパラメータのチューニングを実行

```py
tuned_ridge = tune_model(ridge)
tuned_ridge
```
<details>
<summary>Out:</summary>

![tune_model.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/8ccae651-6f9e-ffa9-2a71-621b217f4d7c.png)
</details>

# モデルプロット
`plot_model()`で様々な評価グラフが確認可能
`evaluate_model()`では`plot_model()`で表示可能なすべてのグラフを表示し切り替えることが可能

```py
plot_model(tuned_ridge, plot='confusion_matrix')
```
<details>
<summary>Out:</summary>

![plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/2c837efb-069a-bce1-5c85-9ec0d2ec7794.png)
</details>

```py
evaluate_model(tuned_ridge)
```
<details>
<summary>Out:</summary>

![eval.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/37d06c3e-fd32-cdc4-a953-d51f9614e8bd.png)
</details>

# テストデータの予測/ホールド・アウト法
`predict_model()`でテストデータの予測精度を確認
テストデータは`setup()`メソッドで用意したデータ
交差検証の結果と乖離があれば過学習の疑いあり

```py
predict_model(tuned_ridge)
```
<details>
<summary>Out:</summary>

![pred.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/f82f8322-ad64-05a1-e00f-7494c4d08f34.png)
</details>

# モデル最終版を作成
`finalize_model()`で全訓練データを使用しモデルを作成

```py
final_ridge = finalize_model(tuned_ridge)
predict_model(final_ridge)
```
<details>
<summary>Out:</summary>

![pred_final.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/f20bfe48-e6a6-68ca-0f3c-8ab011643184.png)
</details>

# 未知データの予測
事前に用意しておいた未知データに対する予測を実施
データフレーム内のLabelが予測値でscoreは確率を示す

pycaret.utils内の`check_metric()`で評価指標の算出ができる

```py
unknown_predict = predict_model(final_ridge, data=data_unknown)
unknown_predict
```

<details>
<summary>Out:</summary>

![pred_un.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/d5eb209c-d240-711c-d5ba-a992122c6bee.png)
</details>

```py
from pycaret.utils import check_metric
check_metric(unknown_predict['default'], unknown_predict['Label'], metric = 'Accuracy')  # 0.8112
```

# モデルの保存
`save_model()`でモデルを保存
```py
save_model(final_ridge, 'final_ridge') 
```

<details>
<summary>Out:</summary>

![save.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/931058/5ee1bbb8-dfe9-0bee-eb91-9c774640b1aa.png)
</details>

# モデルのロード
`load_model()`でモデルのロード
```py
load_model = load_model('final_ridge')
```

# Conclusion
Pycaretの基本的な使い方を二値分類タスクを例にまとめた。
今後多クラス分類や回帰、高度な前処理などについてもまとめようと思う。

# メソッド一覧
- `get_data()` データ取得
- `set()` データの前処理
- `compare_models()` モデル比較
- `models()` 使用可能モデルの表示
- `create_model()` モデル作成
- `tune_model()` ハイパーパラメータチューニング
- `plot_model()` モデル評価のプロット（指定する）
- `evaluate_model()` モデル評価のプロット（すべて）
- `predict_model()` 予測値の算出
- `finalize_model()` 全訓練データでモデル作成
- `check_metric()`評価指標の算出
- `save_model()` モデルの保存
- `load_model()` モデルのロード