AutoML／PyCaretでK-meansクラスタリングを実行する

# はじめに

筆者はこれまでいくつかデータ分析関連の記事を投稿してきました。
その際、データ収集・整形に始まり、特徴量の設計～モデルの作成（含むハイパーパラメータのチューニング）～予測精度の確認～特徴量重要度の確認などなど、基本的には筆者でCodeを書いて実行してきました。

が、めんどくさがり屋な筆者としては、正直言ってもっと楽してデータ分析したいと感じていました。。。

そんなお悩みを解決するのが、<b><font color="#ff0000">機械学習のプロセスを自動化する技術、AutoML</font></b>です。
AutoMLの概要・仕組みなどは既存の記事に任せるとして、大手ベンダさんらがAutoMLツールを提供しており、データサイエンティストの初心者から熟練者まで利用を検討すべきものになりつつあります。
（初心者は機械学習を気軽に利用できるし、熟練者はとりあえずの特徴量探索やアルゴリズム適用に利用できる）

そこで、本稿では<b><font color="#ff0000">AutoMLツールの１つ、PyCaret[^1]を筆者が使うまでの軌跡とK-meansクラスタリングの実行例</font></b>をお届けします。

## 本稿で紹介すること

- PyCaretのインストール
- 環境の各種情報
- PyCaretの実行（クラスタリング）

## 本稿で紹介しないこと

- WSL2のインストール
- DockerCEのインストール
- JupyterHubのインストール＆環境設定
- AutoMLの全般

# PyCaretのインストール

結論から言うと、、、<b><font color="#ff0000">PyCaret公式コンテナイメージを使いましょう。</font></b>これが最も簡単で安全な方法です。

というのも、、、筆者はいろいろな環境の組み合わせで試しました。
- Windows 10／Python 3.9
- Ubuntu 18／Python 3.9
- Ubuntu 18／Python 3.8

下記のPIPコマンドを利用したインストール[^2]を試みたのですが、、、

```shell
pip install pycaret
```

PyCaretの依存ライブラリが多いからか、インストールすら失敗したり、インストールは成功したように見えてTutorialで実行エラーが発生したりでなかなか上手くゆかない。

そして、インストールに手間取っているうちに、なんとPyCaretのメジャーVer.が上がってしまいました。（2系→3系）
同時に、Dockerコンテナイメージでの提供があることを知りました。赤字部分、、、ありがたいですね。

> <h3>Option 3: Docker</h3>
> <font color="#ff0000">Docker creates virtual environments with containers that keep a PyCaret installation separate from the rest of the system.</font> PyCaret docker comes pre-installed with a Jupyter notebook. It can share resources with its host machine (access directories, use the GPU, connect to the Internet, etc.). The PyCaret Docker images are always tested for the latest major releases.

https://pycaret.gitbook.io/docs/get-started/installation

# 環境の各種情報

改めて、筆者の環境、Dockerコンテナイメージ内部のソフトウェアを以下にまとめます。

:::note info
筆者は、Windows 11のホスト上で**WSL2／Ubuntu**を起動しています。
:::

- Ubuntu 20.04.6 LTS
- Docker CE 23.0.1

https://apps.microsoft.com/store/detail/ubuntu-20045-lts/9MTTCL66CPXJ?hl=en-gb&gl=gb

:::note info
更に筆者は、WSL2／Ubuntuのホスト上で**PyCaret全部入りDockerコンテナ**を起動しています。
:::

- Ubuntu 22.04.2 LTS
- Python 3.8.16
- pip 23.0.1
- pycaret 3.0.0

コンテナイメージはコチラ。

https://hub.docker.com/r/pycaret/full

以下コマンドを実行してコンテナイメージを取得可能です。

```shell
$ docker pull pycaret/full:latest
```

いつものように、JupyterHubからPyCaret全部入りDockerコンテナを起動しています。
が、以下コマンドを実行してDockerコンテナを起動することも当然可能です。

```shell
$ docker run -d -it --name pycaret -p 8888:8888 pycaret/full:latest
```

# PyCaretの実行（クラスタリング）

本家[^1]で公開されているチュートリアルを実行しました。

https://pycaret.gitbook.io/docs/get-started/tutorials

:::note info
以下、K-meansでクラスタリングを実行する例[^3]です。
学習～可視化までを抜粋して記載しています。
:::

```python
# loading sample dataset from pycaret dataset module
from pycaret.datasets import get_data
data = get_data('jewellery')

# import pycaret clustering and init setup
from pycaret.clustering import *
s = setup(data, session_id = 123)

# train kmeans model
kmeans = create_model('kmeans')

# assigns cluster labels to the training data
kmeans_cluster = assign_model(kmeans)
kmeans_cluster

# plot pca cluster plot 
plot_model(kmeans, plot = 'cluster')

# plot elbow
plot_model(kmeans, plot = 'elbow')

# plot silhouette
plot_model(kmeans, plot = 'silhouette')

evaluate_model(kmeans)
```

## いろいろな可視化

学習アルゴリズムに加えて、可視化手法（プロット）がいくつか提供されています。
（内部的には、Plotlyも使われているようです。）

２次元平面分布、エルボー法、シルエット分析あたりは必ずと言ってよいほど実行するので、かなり強力ですね。

```python
# plot pca cluster plot 
plot_model(kmeans, plot = 'cluster')
```

![cluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/c397948c-2b6c-efb9-42e9-79c9dccef239.png)

```python
# plot elbow
plot_model(kmeans, plot = 'elbow')
```

![elbow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/3111ff62-54b2-4782-09a7-97e1788e8297.png)

```python
# plot silhouette
plot_model(kmeans, plot = 'silhouette')
```

![silhouette.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/cd8b9b18-f34d-e3f0-cc80-4cb3578c614a.png)

最後、evaluate_model関数を実行すると、利用可能な可視化手法（プロット）がまとめて表示されます。
上部、Plot Type: の並びにあるボタンを押下して表示を切り替えます。

```python
evaluate_model(kmeans))
```

初期表示は、「Pipeline」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/59e6a57a-8038-083d-9edc-a29cdc2fdd1e.png)

「Cluster t-SNE (3d)」ボタンを押下すると、t-SNEで（次元圧縮されて）３次元空間分布が出現します。
手作業でコツコツと作るの大変なのですが、サクサクっと裏で作ってくれてありがたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/5a230c93-6f5d-aee0-04cf-ad0898e41b20.png)

# まとめ

本稿ではクラスタリングのみを取り上げましたが、他のチュートリアルも実行しており、かなり強力でした。
一方、サンプルデータの実行ですら筆者の環境（マシンSpec、CPU：8C/8T、MEM：32GB）でもCPU使用率が100%になった瞬間もあったので、ユースケースやデータ次第ではマシンSpecも要求される印象です。

[^1]: PyCaret 3.0 - Docs | https://pycaret.gitbook.io/docs/
[^2]: pycaret · PyPI | https://pypi.org/project/pycaret/
[^3]: Tutorial - Clustering.ipynb | https://github.com/pycaret/pycaret/blob/master/tutorials/Tutorial%20-%20Clustering.ipynb