たった数行で機械学習体験(前編)。PyCaretを詳しく解説。データセット準備から複数モデルの精度比較まで。

#unseen dataに関して
PyCaretを勉強していると、unseen dataをテストデータと勘違いしそうですが、unseen dataはテストデータではあるのですが詳しく説明すると、

トレーニングデータで予測モデルを作成
トレーニングデータにテストデータを組み合わせて最終予測モデルを作成
最後に、そのモデルにunseen dataを入力して、モデルの精度を確認

という流れになります。

#はじめに
2020年4月16日にオープンソースのPython機械学習ライブラリ"PyCaret 1.0.0"がリリースされたので、pipでインストールしてみます。

PyCaretは、欠損値の補完やハイパーパラメータの調整などが自動で行われる。なので、機械学習のステップが数行で実現してしまう事が特徴。機械学習の中身に詳しくなくても、簡単にモデルを作成し比較できます。

[Binary Classification Tutorial (CLF101) - Level Beginner](https://github.com/pycaret/pycaret/blob/master/Tutorials/Binary%20Classification%20Tutorial%20Level%20Beginner%20-%20%20CLF101.ipynb)を参考にして、Google Colabを使って実装してみます。

#PyCaretのインストール
Google ColabかAzure Notebooksでは、以下のコードでインストールします。

執筆時点のversionは、1.0.0です。
1.0.1では、compare_modelsでトレーニングされたモデルを返す予定みたい。
>Return models from compare_models. Currently compare_models() donot return any trained model object.

```code.py
! pip install pycaret
```

Google Colabを用いる場合、以下のコードを実行する事で、インタラクティブな表示をする事ができます。

```code.py
from pycaret.utils import enable_colab
enable_colab()
```

#データセットの準備
Pycaretは、いくつかのデータセットを用意してくれており、get_data()で使用できます(インターネットに接続している必要があります)。

使えるデータセットは、[pycaret/datasets/](https://github.com/pycaret/pycaret/tree/master/datasets)に格納されており、多クラス分類だとワインの等級やアヤメ、バイナリ分類だと、がんや心臓病が挙げられます。


チュートリアルでは、台湾において、2005年4月から9月までのクレジットカードの支払情報データセットを使っており、性別、最終学歴、結婚の有無、過去の支払い状況、これまでの支払い履歴や請求明細などが含まれます。

Target Columnは、Default payment (1=yes, 0=no)になるので、バイナリ分類になります。バイナリ分類とは、合格か不合格か、陽性か陰性かの2値のクラス分類となります。


```code.py
from pycaret.datasets import get_data
dataset = get_data('credit')
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/7d0b7d01-0632-9531-167a-3eb2c9db36b6.png)



データセットの数を確認してみます。

```code.py
#check the shape of data
dataset.shape
```

結果
>(24000, 24)


次に、5%をUnseen Dataにします。このデータセットでは、1200のデータが予測モデルの作成には使用されません。チュートリアルをみると、トレイン/テストの分割と混雑しないでくださいとあります。(訓練データとテストデータの分割は、setup()の関数で行います。)
>This should not be confused with a train/test split as this particular split is performed to simulate a real life scenario.



```code.py
data = dataset.sample(frac=0.95, random_state=786)
data_unseen = dataset.drop(data.index).reset_index(drop=True)
data.reset_index(drop=True, inplace=True)

print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))
```

結果
>Data for Modeling: (22800, 24)
Unseen Data For Predictions: (1200, 24)

#PyCaret環境のセッティング
setup()で、PyCaretの環境を初期化します。
setup()では、2つの必須パラメータがあり、pandasデータフレームと、ターゲット列の名前の設定です。他のパラメータはオプションになります。今回は、session_idを指定しています。これは、再現性をもたせる為に使います。指定しない場合は、疑似乱数が発行されます。

setup()実行後は、データ型を自動的に推論します。常に正しく推論されるとは限らないので、setup()実行後は、特徴量と推測されたデータ型が表示されます。全てのデータ型が正しく識別された事を確認したら、Enterキーを押して続行するか、quitを入力して終了させます。


```code.py
from pycaret.classification import *
exp_clf101 = setup(data = data, target = 'default', session_id=123)
```

元のデータに欠損値がある場合、Trueとして表示されます。この実験では、データセットに欠損値はありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/610769ef-32e8-4264-2470-ee54d62d7b41.png)

>Sampled Data	(22800, 24)
Transformed Train Set	(15959, 90)

に注目してみます。
訓練用のデータセットの特徴量は、元のデータセットの特徴量から増えている事が分かります。
これは、自動的にカテゴリ変数にしたからです。
>Categorical Features	9

となっており、この9つの特徴量がカテゴリ変数に変換されました。
ここまで自動でやってくれるのは本当にすごいですね。

訓練データは70%、テストデータを30%にしたので
>Sampled Data	(22800, 24)
Transformed Train Set	(15959, 90)
Transformed Test Set	(6841, 90)

このような分割になります。

#モデルの比較

ライブラリ内のすべてのモデルでトレーニングし、10-fold交差検証を用いて、精度や再現性、F1スコアを計算し、比較する事ができます。
例えば、F1scoreを重要視する場合は、LightGBMを使おうって感じになりますね。

```code.py
compare_models()
```

デフォルトでは、精度の順にソートされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/c2c354e0-b880-3ed5-416d-42a58985ac5a.png)

例えば、recallの順でソートしたい、5-fold交差検証をしたいというオプションを追加したい場合は、以下のコードを実行します。

```code.py
compare_models(sort = 'Recall', fold = 5)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/fc307cc0-3ad7-a178-9b94-72a7cf7f9c6b.png)

#まとめ
この記事では、モデルの比較まで行いました。
次は、モデルを作成し評価をしたいと思います。