PyCaret2.0 (pycaret-nightly)を試してみた

# はじめに
* PyCaret2.0が、Nightlyビルド版で公開されており、試してみました。
* PyCaret自体については、以前投稿させて頂いた下記もご確認ください。

https://qiita.com/shnchr/items/bdd4810b3477aa977413

* v2では下記のように、不均衡データに対しての前処理が追加されているようなので、試してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/7f06bf3d-5b21-adc5-7a87-99a0a5765273.png)

# 試し方
* pipしてください。

```shell
pip install pycaret-nightly
```

* pipすると、version 2.0.0を試すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/f12d8d88-3937-21e2-53cf-d0213d090cd4.png)


# 試す
## 不均衡データに対する前処理
* v2では、2値分類での不均衡（正例、負例の一方がごく少数）データに対する前処理が追加されています。
* 指定方法は簡単で、setupする際の引数にて、**fix_imbalance=True** を指定します。

```python
from pycaret.classification import *
exp1 = setup(
    data, 
    target = 'default',
    fix_imbalance=True # この行を追加
)
````

* この指定により、不均衡データに対する前処理が実施されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/b808a705-625c-08cd-6010-3a59d83b1b64.png)

## 実施される前処理(SMOTE)
* 上記画像のとおり、SMOTE(**S**ynthetic **M**inority **O**ver-sampling **TE**chnique)がデフォルトの様です。
* SMOTEについては、Qiitaにも解説記事ありますのでリンクさせていただきます。
  * [データ拡張：少数データをSMOTEで増やしてみる](https://qiita.com/ps010/items/38880fad0b8e71464a54)
  * [解説編：オーバーサンプリング手法解説 (SMOTE, ADASYN, Borderline-SMOTE, Safe-level SMOTE)](https://qiita.com/eigs/items/8ae0970afe188a1124d1)

## 他の前処理
* 冒頭の記事にあったとおり、**ADASYN**や**RandomOverSampler**等にも対応しているようです。
* 内部的には、v2（Nightlyビルド版）では、[依存ライブラリ](https://github.com/pycaret/pycaret/blob/dev-1.0.1/requirements.txt#L31)に、[imbalanced-learn](https://imbalanced-learn.readthedocs.io/en/stable/)が追加されています。
* docstringにも下記の記述がありますね。

```
fix_imbalance_method: obj, default = None
When fix_imbalance is set to True and fix_imbalance_method is None, 'smote' is applied 
by default to oversample minority class during cross validation. This parameter
accepts any module from 'imblearn' that supports 'fit_resample' method.
```

## 他の前処理の指定方法
* 上記のdocstringの指示のとおり、imblearnのclassを指定してみたいと思います。
* imblearn.over_samplingから指定するover_samplingアルゴリズムをimportして指定します。

```python
from pycaret.classification import *
from imblearn.over_sampling import ADASYN, BorderlineSMOTE, KMeansSMOTE, RandomOverSampler, SMOTE, SMOTENC, SVMSMOTE
exp1 = setup(
    data, 
    target = 'default',
    fix_imbalance=True,
    fix_imbalance_method=ADASYN() # この行で指定
)
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/12d10db9-9b2c-002b-6dd7-9f8407af8882.png)

## 指定できたアルゴリズム
* 下記の通りです。
 * [imblearn.over_sampling.ADASYN](https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.ADASYN.html#imblearn-over-sampling-adasyn)
 * [imblearn.over_sampling.BorderlineSMOTE](https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.BorderlineSMOTE.html#imblearn-over-sampling-borderlinesmote)
 * [imblearn.over_sampling.KMeansSMOTE](https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.KMeansSMOTE.html#imblearn-over-sampling-kmeanssmote)
 * [imblearn.over_sampling.RandomOverSampler](https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.RandomOverSampler.html#imblearn-over-sampling-randomoversampler)
 * [imblearn.over_sampling.SMOTE](https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.SMOTE.html#imblearn-over-sampling-smote) ※デフォルト
 * [imblearn.over_sampling.SVMSMOTE](https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.SVMSMOTE.html#imblearn-over-sampling-svmsmote)

# モデル評価時の表示上の工夫
* 不均衡データに対する前処理の実装と共に、精度一覧上にMCC(Matthews相関係数)が追加されています。
* 少数（マイノリティ）クラスを正例としている場合では、F-measureでも良いのですが、そういった考慮ができていない状況でも、MCCは不均衡データに対する学習精度を正しく評価できるので良いですね。
* 不均衡データ時の、F-measureとMCCの関係性は[こちらのブログ](https://www.datarobot.com/jp/blog/matthews-correlation-coefficient/)が参考になるのでリンクさせていただきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/5ff9de42-4251-5292-36bd-839495d552e1.png)

# 最後に
* 今回は、v2の不均衡データに対する対応をご紹介しました。
* これ以外にも、[mlflow](https://mlflow.org/)への対応等が計画されているようで、v2の正式リリースが楽しみです。
* 雑な記事となりましたが、最後までお付き合い頂きありがとうございます。

# 関連記事
https://qiita.com/shnchr/items/bdd4810b3477aa977413

https://qiita.com/shnchr/items/c999e471ba940dacfe94

https://qiita.com/shnchr/items/be21f10748a14a2b3b40