PyCaretでSIGNATEのコンペに参加してみる！

# はじめに

こんにちは！株式会社会社エイアイフィールドに新卒で入社した傍示です。現在はフロントエンドの開発を主に担当させて頂いております。この記事は[株式会社エイアイフィールドアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/aifield)の18日目の記事です。この記事ではローコード機械学習ライブラリ「PyCaret」を用いて[SIGNATE](https://signate.jp/)のコンペに挑戦していきます。

# PyCaretとは

「PyCaret」とは、様々な種類の機械学習モデルの検証を数行で行ってくれるライブラリです。

回帰や分類、クラスタリング、自然言語処理など幅広いタスクに対応しており学習コストも低いので、データサイエンス初学者の方が「まずは何らかのデータ分析をしてみたい」場合にはまず試してもらいたいライブラリです。

[公式サイト](https://pypi.org/project/pycaret/)

# 動作環境

・PyCaret 2.3.5
・Google Colabratory

PyCaretはローカルで実行しようとするとPythonのバージョンなど環境によって、環境構築につまづくことが多いです。

筆者も中々苦労したので今回はGoogleアカウントがあれば誰でも同じ環境でデータ分析を行える[Google Colabratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を利用します。

# 今回参加するデータ分析コンペ

今回はSIGANTEにある[【練習問題】健診データによる肝疾患判定 ](https://signate.jp/competitions/265)にPyCaretで挑戦します。

このコンペは健康診断の数値の結果から肝疾患の有無を判断するモデルを作成する分類コンペとなっています。

データ概要
課題種別：分類
データ種別：多変量
学習データサンプル数：891
説明変数の数：10
欠損値：有り 

# 今回のコード

今回の分析に用いたコードです。
14行でデータの読み込みから予測結果の出力まで出来ました！
同じことをPycaretなしで実行しようとすると100行以上はコードを書く必要があると思うので、ここまで簡単に実装できてびっくりしています。

### PyCaretのインストール
下記のコードを実行してインストールします。

```python
!pip install pycaret
```

### ライブラリのインポート
csv読み込み用の`pandas`と`PyCaret`をインポートします。

今回は分類問題なので`pycaret.classification`を指定しています。
回帰問題の場合は`pycaret.regression`を利用します。

その他クラスタリングや、自然言語処理、異常値検知などのタスクに用いることも出来ます。

```python
import pandas as pd
from pycaret.classification import *
```

### データの読み込み
今回利用するデータセットを読み込みます。
今回はファイルを直接アップロードする形式を利用しています。

```python
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
submit = pd.read_csv("sample_submit.csv",header=None)

# データの表示
train.head()
```

![Inked無題_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/18e02c04-6dd6-f1e3-9f46-73c56b9ff324.jpeg)
赤丸で囲んだ部分にcsvファイルをドロップアンドドラッグでアップロードするとGoogle Colabratory上で利用することが出来ます。


・出力結果
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/59ad6853-66be-e732-2e1b-8d084ed0a433.png)

今回利用するデータセットの中身になります。
目的変数はdiseaseで、0のときに肝疾患なし、1のときに肝疾患あるとなっています。

### 前処理
データ分析は8割が前処理と言われるほど、前処理のタスクは重要でその分コード数も多くなります。
しかし**PyCaretでは前処理も1行で行ってくれます！**
setup()の引数dataに利用するデータ、targetに目的変数を指定することで最適な前処理を行ってくれます。

```python
exp_clf101 = setup(data = train, target = "disease", session_id = 123)
```

### モデル比較
モデルを比較し精度の良いモデルを選択したいと思います。
モデルの比較も下記の1行で行うことができます！
評価指標やモデルを一覧で確認できるので便利ですね。

```python
compare_models()
```
データフレームの下に表示されているのが今回一番精度が良かったモデルとそのモデルで用いているパラメータとなります。今回は**Extra Trees Classifier**が一番精度が高かったみたいです。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/04f14fc0-898a-d500-ba51-6876751f5644.png)


### モデル選択
モデルを選択してモデリングを行います。今回は先程一番精度が良かったExtra Trees Classifierを使用します。

```python
model = create_model("et")
```

選択したモデルに対して10分割してクロスバリデーションを行った結果が出力されます。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/42725c6c-b6ba-7b86-d5df-58ef122f0619.png)

### モデルの検証

```python
evaluate_model(model)
```
完成したモデルに対してモデルの特性をROC曲線、混合行列など様々な指標で確認することができます。

・**ROC曲線**
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/08fc756b-2036-1522-2f58-7da86d4997f3.png)

・**混合行列**
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/dcab06e5-88af-69ae-b68b-a131695ac725.png)

・**Prediction Error**
実際のクラス毎に、Positive/Negativeのどちらに予測をしたかを表示されます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/9898a0c5-78d0-ab0d-6157-a24fb1437aad.png)


### 予測と提出ファイルを作成

finalize_model()関数で使用するモデルを確定させ、predict_model()関数に今回の予測対象であるtestデータを読み込んで予測を行います。

resultの`Label`列に予測結果が格納されるのでそれをsubmit用ファイルに代入してcsvを出力すれば終了です。
本当に全然コードを書いていないのに予測ファイルまで完成出来たのでびっくりしています。

```
# 予測
final_model = finalize_model(model)
result = predict_model(final_model, data = test)

#提出ファイル作成
submit[1] = result['Label']
submit.to_csv('submit_pycaret.csv',index=False,header=False)
```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/10bd3b25-eed9-ab88-f60b-e5aefe76639f.png)

# 結果
AUC：0.9126912　92位/496人中
![signate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297884/bcaf4ef7-51e2-c6da-3ab1-e8cd529418fb.png)

今回のPyCaretのモデルでAUCが0.91以上となり、順位も上位20%に入れる結果となりました！
コンペにおけるBaselineとして十分活用できると思います。

# おわりに

今回はPyCaretでSIGNATEのコンペに挑戦してみました。
とても使いやすく、精度も十分出せるので実務にも十分活用できると思います！

環境構築の部分もGoogle colabratoryを使うことで省略できるのでぜひ気軽に使ってみてください。