PyCaretで自動的に機械学習をやってみる

機械学習の勉強を始めたのですが、覚えることが多くてたいへんです…　楽ができるのではと思い、PyCaretに挑戦してみました。PyCaretは機械学習を自動化するライブラリです。

今回はPyCaretをつかって、Kaggleのタイタニック問題を解いてみます。Notebookはこちらです。
https://www.kaggle.com/code/kysd2023/automl-for-titanic

さて、Kaggleのアカウントをまだ作ってない方は、[Kaggleで始める機械学習入門](https://qiita.com/k-ysd/items/9f8edeb6c22e8ec69e0e)を参考にアカウントを作ってみてください。まず[タイタニック問題のページ](https://www.kaggle.com/competitions/titanic/code)を開き、Codeタブで「+New Notebook」を選択します。生成されるNotebookには既に訓練データと評価データが設定済みなので、このNotebookにコードを記載して進めます。

![pycaret01_newnotebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/84736424-8c17-dab3-cefb-bd6d6593aed5.png)

まずはPyCaretのインストールです。多少エラーが出るかもしれませんが、とりあえず気にせず進めます。ここで数分かかるので気長に待ちます。

```python
# PyCaretのインストール
!pip install pycaret
```

次にデータを読み込みます。これはどんなやり方でも共通ですね。

```python
# データ読み込み
import pandas as pd
train_df = pd.read_csv("/kaggle/input/titanic/train.csv")
test_df = pd.read_csv("/kaggle/input/titanic/test.csv")
train_df
```

![pycaret02_data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/5e49bbc8-3507-28c4-1aa1-5dd0883b8773.png)

ではPyCaretをセットアップします。ここで欠損値の扱いの指定や、データ型の設定ができるのですが、今回は何もせずにとりあえず進めます。タイタニック問題の目的は生存したかどうかを予測することにあるので、目的変数として「Survived」を指定します。

```python
# PyCaretセットアップ
from pycaret.classification import setup
clf = setup(data=train_df, target="Survived", ignore_features = None)
```
![pycaret03_setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/fadd40bb-0ad6-0ac6-d1ea-bc9c53130966.png)


次がPyCaretの面白いところだと思うんですが、様々なモデルを一気に比較します。ロジスティクス回帰が最も精度と高いとされたので、これを使います。

```python
# モデルの比較
from pycaret.classification import compare_models
best_model = compare_models() 
```

![pycaret04_models.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/eeb75de2-dbe7-353c-6164-4ad509a44dcd.png)

次にハイパーパラメータを最適化します。ハイパーパラメータとは、学習前に人が決めておくパラメータです。これを自動で決めてくれるのは助かりますね。

```python
# パイパーパラメータの最適化
from pycaret.classification import tune_model
tuned_model = tune_model(best_model)
```

![pycaret05_hyperparameters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/d92e7198-653c-166b-182e-97b266f9fc52.png)

次にできたモデルを評価します。最も重要な特徴量は名前でした…　そんなわけ無いだろうと思いますが、とりあえずこのまま進めます。

```python
# モデルの評価
from pycaret.classification import plot_model
plot_model(tuned_model, plot="feature") 
```

![pycarete06_features.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/9c2b174c-6156-399d-d4d0-413b9734669c.png)

モデルを確定し、テストデータで予測を行います。

```python
# モデルの確定
from pycaret.classification import finalize_model
final_model = finalize_model(tuned_model)

# 予測
from pycaret.classification import predict_model
pred_df = predict_model(final_model, data=test_df)
```

提出用データを作成します。

```python
# 提出用データ作成
submission_df = pd.DataFrame({
        "PassengerId": pred_df["PassengerId"],
        "Survived": pred_df["prediction_label"].astype(int)
    })

path="/kaggle/working/submission.csv"
submission_df.to_csv(path, index=False)
print(f"Submission exported to {path}")
```

提出用データができたら、note右側の「Submit」ボタンを押して提出してください。しばらくするとスコアが計算されます。

![pycaret07_submit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/bb81675e-4273-49cb-e7b8-56c1098d2d78.png)


ということで、あまりうまく行ってないのではと思いますが、チュートリアルでタイタニック問題に取り組んだときよりは若干スコアが上がっています（0.76→0.78）。

自動的に解けるとはいえ、訓練データのデータ型指定や欠損値処理が重要そうですね。それでは今回のチャレンジは以上にします。お疲れ様でした。