PyCaret のクリエイターが明かした秘密とは？

>※2021/09/25：「PyCaretで「Titanicデータセット」の前処理を実行して出力してみた」にy_trainの出力についても追記

##「あなたがPyCaretで間違えている5つのこと」
　

https://towardsdatascience.com/5-things-you-are-doing-wrong-in-pycaret-e01981575d2a

これは [**towardsdatascience.com**]( 
https://towardsdatascience.com/) に掲載されたPyCaretクリエイターによる記事（Nov.2020）です。

　
すこし記事の内容から離れますが、
わたしは、**PyCaretで実行した前処理の結果を確認したり、書き出したりする方法を探していました。**

「いろんな前処理ができるようになるんだ！」と意気込んではおりますが、まだまだヒヨッコなので、前処理の初手はPyCaretの力を借り、データ理解を助けてくれるであろうデシジョンツリーの描画、とにかくここまではチャチャっとやりたいからです。
※データ理解が効率的にできるかは、これにかかってる？！

少し話が逸れましたが、
なんと、冒頭の記事のなかに私の望みが載っているではありませんか！ということで、その内容を紹介させていただくものです。



##「PyCaretで間違えている5つのこと」とは？
記事にある5つのことととうのは以下です。

>- **👉compare_modelsは思っている以上にやるよ！**
- **👉scikit-learnのモデルだけに限定されている？**
- **👉pull( )関数って知ってます？**
- **👉PyCaretはブラックボックスだと思ってるんじゃない？**
- **👉実験のログを取っていないでしょ？**

私の望みは、4つ目の「**👉PyCaretはブラックボックスだと思ってるんじゃない？**」です。
「**👉compare_modelsは思っている以上にやるよ！**」にも興味を持ちましたので、この2つだけを取り上げたいと思います。
※他も気になる方は、ソースを確認してくださいね。

##👉compare_modelsは思っている以上にやるよ！
compare_models では、ライブラリ内のモデルを交差検証（クロスバリデーション）含め自動で比較が行われます。
compare_modelsの結果は、Ver.2.0から best_modelの結果だけではなく、上位 何位までのモデルの結果を返すかが設定できるようになりました。
これは n_select = で設定でき、デフォルトは 1 となっています。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/c009d6e7-3eac-6520-4347-883f467d542a.png)

例えば、TOP3（上位3つのモデル）を設定する場合、n_select=3 とすることで、TOP3のモデルの結果を得ることができます。例えば、以下のようになります。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/eb34484a-e391-3dd8-e0f9-911c49a91deb.png)

これらのモデルを使用して、診断プロットを作成したり、必要に応じて予測に使用することができます。例えば、以下のようになります。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/ccbb64e9-9032-c215-b903-4bffa4c8a836.png)


##👉 PyCaretはブラックボックスだと思ってるんじゃない？
「すべての前処理は舞台裏で行われているからアクセスできない。setupの結果を確認することなんてできないんだ」
・・・これは真実ではありません。

PyCaretにはget_configとset_configという2つの関数があり、トレーニングセットからモデルのコンディションまで、すべてのバックグラウンドにアクセスして変更することができます。
help(get_config)を呼び出すと、どの変数にアクセスできるかを確認できます。

```:
help(get_config)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/4f325099-c30d-cae5-8e9c-10de65ba2e84.png)
例えば、X_train変換データセットにアクセスするには、次のように記述します。

```:
get_config('X_train')
```
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/efc52cc1-5afe-d327-bb17-cea0f660116f.png)

環境変数の変更は、set_configを使用します。pull、get_config、set_configの3つの関数を使えば、かなり高度なワークフローを作ることができます。
例えば、1つのホールドアウトセットに依存するのではなく、ホールドアウトセットをN回サンプリングして、平均化したパフォーマンス基準を評価することができます。

```:
import numpy as np
Xtest = get_config('X_test')
ytest = get_config('y_test')

AUC = []

for i in np.random.randint(0,1000,size=10):
    Xtest_sampled = Xtest.sample(n = 100, random_state = i)
    ytest_sampled = ytest[Xtest_sampled.index]
    set_config('X_test', Xtest_sampled)
    set_config('y_test', ytest_sampled)
    predict_model(dt);
    AUC.append(pull()['AUC'][0])

>>> print(AUC)

[Output]: [0.8182, 0.7483, 0.7812, 0.7887, 0.7799, 0.7967, 0.7812, 0.7209, 0.7958, 0.7404]

>>> print(np.array(AUC).mean())

[Output]: 0.77513
```

　
##PyCaretで「Titanicデータセット」の前処理を実行して出力してみた

前処理（setup）結果の出力とcsvへのエクスポートを実際にやってみました。

- 実行環境は**Google colab**です


**■ タイタニックのデータセットについて**

以下サイト（Kaggle）の「train.csv」を使わせていただいた。

https://www.kaggle.com/c/titanic/data

<details><summary>**タイタニックデータセットの項目と内容**</summary><div>

>|項目|内容|
|:-----------|:------------------|
|PassengerId|乗客ユニークID|
|Survived|生存フラグ（0=死亡,1=生存）|
|Pclass|チケットクラス（1=上級,2=中級,3=下級）|
|Name|乗客名|
|Sex|性別（male=男性,female＝女性）|
|Age|年齢|
|SibSp|同乗している兄弟,配偶者の数|
|parch|同乗している親,子供の数|
|ticket|チケット番号|
|fare|料金|
|cabin|客室番号|
|Embarked|出港地（C=Cherbourg,Q=Queenstown,S=Southampton）|

</div></details>


**前処理前のデータ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/d781b29b-6654-321f-9791-57eac721e4a9.png)

```:PyCaretで実行したsetup
from pycaret.classification import setup

clf = setup(data=train_data, target="Survived", session_id=123,  # 環境の初期化
            numeric_imputation="mean", categorical_imputation="mode",
            ignore_features = ['Name'],
            ordinal_features = {'Pclass':['3','2','1']}
            )
```
```:以下の実行が必要でした（X_trainというデータフレーム格納）
from pycaret.datasets import get_data
from pycaret.classification import *
X_train = get_config('X_train')
```
```:X_trainを確認
X_train
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/2d0ddac9-6812-d5cd-7203-eb9b6ccd6d66.png)

```:csvエクスポート
X_train.to_csv("setup.csv", index=False)
```
※2021/09/25追記
y_trainもgetしないといけませんね。y_train = get_config('y_train') も追加して
train = pd.concat([X_train,y_train],axis=1) などとしてから、train.to_csv("setup.csv", index=False) とすればいけると思います。
 


よかったぁ。できたぁ。
前処理後の結果をみると、もう少し前処理指示をしっかり与えた方がよさそうにも思えますが、これは楽ちんですね。


私は、デシジョンツリーが好きで、特に [**dtreeviz**](https://github.com/parrt/dtreeviz) にはまっています。デシジョンツリーは欠損値にも対応・・・とよく聞くのですが、 [**dtreeviz**](https://github.com/parrt/dtreeviz) は欠損値あると描けないんですよね・・・私が何か間違ってるのかなぁ。

https://qiita.com/hima2b4/items/04380f160ef6c4193f14


##参考サイト
>PyCaret：PyCaretは、機械学習のワークフローを自動化する、オープンソースの機械学習ライブラリです。機械学習の実験サイクルを高速化し、生産性を向上させるエンドツーエンドの機械学習・モデル管理ツールです。
他のオープンソースの機械学習ライブラリと比較して、数百行のコードを数語のみで置き換えることができますので、実験は指数関数的に速く、効率的になります。


https://www.pycaret.org

https://www.github.com/pycaret/pycaret

https://pycaret.readthedocs.io/en/latest

https://pycaret.readthedocs.io/en/latest/api/classification.html#pycaret.classification.get_config

https://medium.datadriveninvestor.com/pycaret-a-faster-way-to-build-machine-learning-models-d4cbce6a6633