超便利なAutoMLライブラリPycaretを触ってみました

# pycaretについて
AutoMLライブラリだそうです。AutoMLというと、datarobotなどの高価なツールを思い浮かべましたが、これはpythonで使えるオープンソースライブラリで無料です。  

なんといっても、短いコードでできる！のが利点です。scikit-learnも非常にシンプルでわかりやすいのですが、複数のアルゴリズムを試したいときはそれなりにコードが長くなります。

これが、pycaretならscikit-learnはもちろん、XGboostやlightBGMなど人気のアルゴリズムをサクッと実行できて比較検討できます。

# 実行環境
python 3.10.14
vscode
macbook M1
> python 3.11以降は対応していませんでした（2024年10月現在)。pyenvで3.10.14をインストールして実行しました。  

# 実際のコード
pycaretの公式チュートリアルを参考に実行しました。

## データのインポート
まず、テスト用のデータをインポートします。
```python
### load sample dataset from pycaret dataset module
from pycaret.datasets import get_data
data = get_data('insurance')
```
中身はこんな感じ。
```python
	age	sex	bmi	children	smoker	region	charges
0	19	female	27.900	0	yes	southwest	16884.92400
1	18	male	33.770	1	no	southeast	1725.55230
2	28	male	33.000	3	no	southeast	4449.46200
3	33	male	22.705	0	no	northwest	21984.47061
4	32	male	28.880	0	no	northwest	3866.85520
```
最初にセットアップが必要です。読み込んだデータと目的変数としてchargesカラムを指定します。
```python
# import pycaret regression and init setup
from pycaret.regression import *
s = setup(data, target = 'charges', session_id = 123)
```
セットアップすると、以下のように設定情報が表示されます。欠損値の処理もデフォルトでやってくれます。引数を指定すれば細かく調整もできるようですが、今回は割愛。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768377/078869b2-294f-70a9-e2b0-28e7901b2955.png">

複数のモデルで学習、比較して、最もスコアの良いモデルをbestに格納します。ここでも引数を指定すれば、比較したいモデルを指定したりできますが、一旦デフォルトのままです。
```python
# compare baseline models
best = compare_models()
```
比較結果が表示されます。各モデルによるスコアを複数の指標で一気に計算してくれます。これ、たった一行でこれだけの数のモデルと指標を一気に計算できるのは本当にありがたいです。

<img width='500' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768377/967235f8-71f4-71ef-e619-e3d01890c513.png'>

Gradient Boosting Regressorが最もスコアが良かったので、best変数に自動で格納されますが、手動でモデルを指定したい場合は以下のコードを実行すればOKです。
```python
best = create_model('gbr') 
```
同時に交差検証もやってくれます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768377/2177a8e9-0fea-d150-c567-d3abfc9452a7.png">

グラフの描画も一発です。
```python
# plot residuals
plot_model(best, plot = 'residuals')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768377/2be2bb54-e5d4-d95a-ff1d-61aa25d8eeb8.png)

```python
# plot error
plot_model(best, plot = 'error')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768377/e166af52-0bb5-bfb4-04ef-0c02e22ab1af.png)

```python
# plot feature importance
plot_model(best, plot = 'feature')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768377/47407ae2-bd05-898f-e626-2fd1261c5996.png)

これで良さそうなら下記のコードで予測します。
```python
# predict on test set
holdout_pred = predict_model(best)
```
```python
# show predictions df
holdout_pred.head()
```
```python
age	sex	bmi	children	smoker	region	charges	prediction_label
650	49	female	42.680000	2	no	southeast	9800.888672	10681.513104
319	32	male	37.334999	1	no	northeast	4667.607422	8043.453463
314	27	female	31.400000	0	yes	southwest	34838.871094	36153.097686
150	35	male	24.129999	1	no	northwest	5125.215820	7435.516853
336	60	male	25.740000	0	no	southeast	12142.578125	14676.544334
```

# まとめ
pycaretを使用して回帰予測をしてみました。前処理、複数のモデルでの学習、評価指標の算出、交差検証、可視化など一連のタスクを超短いコードで実装できて感動しました。
本業でも使用してみましたが、コードの可読性も高く、それなりに精度も出るので、軽めのタスクには十分すぎるほどでした。
kaggleなどのコンペで初手でとりあえず使ってみても良さそうですね。 
今後も活用していきたいと思います。