Ccmmutty logo
Commutty IT
7 min read

数行のコードで機械学習ができる PyCaret のチュートリアルを試してみた クラスタリング

https://cdn.magicode.io/media/notebox/3341ebe4-c1ea-4ed2-82f2-a70fa7df3973.jpeg
前回の記事に引き続き、 PyCaret のチュートリアルを試してみたいと思います。
今回はクラスタリング(Clustering Tutorial (CLU101) - Level Beginner)に沿って試してみたいと思います。

PyCaret とは

PyCaret is an open-source, low-code machine learning library in Python that automates machine learning workflows. https://pycaret.org/
と公式に記載あるように、わずかなコード量で実装できる Python の機械学習のライブラリです。

クラスタリングのチュートリアル

クラスタリングとは

クラスタリングは、データ間の類似度に基づいてグループ分けしていく手法です。
以下のような使い方があるらしいです。
  • 購入履歴や興味に基づく顧客セグメンテーションを行い、ターゲットを絞ったマーケティングキャンペーンを設計する。
  • タグ、トピック、ドキュメントのコンテンツに基づいてドキュメントを複数のカテゴリにクラスタリングする。
  • 社会科学や生命科学の実験結果を分析し、データから自然なグループ分けやパターンを見出す。
今回のチュートリアルは3つ目のケースに該当すると思います。
それでは、チュートリアルに沿って進めていきたいと思います。
Magicode 上で進めますが、 一部のグラフ表示ができない(plolty が magicode で動作する方法がわからない)ので、手元で試す場合には、 colab など別の環境での実施をおすすめします。

PyCaret のインストール

python
!pip install pycaret

Collecting pycaret
Downloading pycaret-2.3.10-py3-none-any.whl (320 kB) [?25l |█ | 10 kB 15.3 MB/s eta 0:00:01 |██ | 20 kB 16.4 MB/s eta 0:00:01 |███ | 30 kB 15.7 MB/s eta 0:00:01 |████ | 40 kB 10.5 MB/s eta 0:00:01 |█████▏ | 51 kB 6.4 MB/s eta 0:00:01 |██████▏ | 61 kB 7.4 MB/s eta 0:00:01 |███████▏ | 71 kB 7.3 MB/s eta 0:00:01 |████████▏ | 81 kB 7.3 MB/s eta 0:00:01 |█████████▏ | 92 kB 8.1 MB/s eta 0:00:01 |██████████▎ | 102 kB 8.3 MB/s eta 0:00:01 |███████████▎ | 112 kB 8.3 MB/s eta 0:00:01 |████████████▎ | 122 kB 8.3 MB/s eta 0:00:01 |█████████████▎ | 133 kB 8.3 MB/s eta 0:00:01 |██████████████▎ | 143 kB 8.3 MB/s eta 0:00:01 |███████████████▍ | 153 kB 8.3 MB/s eta 0:00:01 |████████████████▍ | 163 kB 8.3 MB/s eta 0:00:01 |█████████████████▍ | 174 kB 8.3 MB/s eta 0:00:01 |██████████████████▍ | 184 kB 8.3 MB/s eta 0:00:01 |███████████████████▍ | 194 kB 8.3 MB/s eta 0:00:01 |████████████████████▌ | 204 kB 8.3 MB/s eta 0:00:01 |█████████████████████▌ | 215 kB 8.3 MB/s eta 0:00:01 |██████████████████████▌ | 225 kB 8.3 MB/s eta 0:00:01 |███████████████████████▌ | 235 kB 8.3 MB/s eta 0:00:01 |████████████████████████▋ | 245 kB 8.3 MB/s eta 0:00:01 |█████████████████████████▋ | 256 kB 8.3 MB/s eta 0:00:01 |██████████████████████████▋ | 266 kB 8.3 MB/s eta 0:00:01 |███████████████████████████▋ | 276 kB 8.3 MB/s eta 0:00:01 |████████████████████████████▋ | 286 kB 8.3 MB/s eta 0:00:01 |█████████████████████████████▊ | 296 kB 8.3 MB/s eta 0:00:01 |██████████████████████████████▊ | 307 kB 8.3 MB/s eta 0:00:01 |███████████████████████████████▊| 317 kB 8.3 MB/s eta 0:00:01 |████████████████████████████████| 320 kB 8.3 MB/s [?25h
Requirement already satisfied: seaborn in /srv/conda/envs/notebook/lib/python3.7/site-packages (from pycaret) (0.11.2) Collecting Boruta
Downloading Boruta-0.3-py3-none-any.whl (56 kB) [?25l |█████▉ | 10 kB 30.1 MB/s eta 0:00:01 |███████████▋ | 20 kB 39.4 MB/s eta 0:00:01 |█████████████████▍ | 30 kB 50.0 MB/s eta 0:00:01 |███████████████████████▏ | 40 kB 57.5 MB/s eta 0:00:01 |█████████████████████████████ | 51 kB 63.0 MB/s eta 0:00:01 |████████████████████████████████| 56 kB 14.9 MB/s [?25hRequirement already satisfied: pandas in /srv/conda/envs/notebook/lib/python3.7/site-packages (from pycaret) (1.1.5) Collecting pyod
Downloading pyod-1.0.0.tar.gz (118 kB) [?25l |██▊ | 10 kB 30.1 MB/s eta 0:00:01 |█████▌ | 20 kB 37.7 MB/s eta 0:00:01 |████████▎ | 30 kB 45.2 MB/s eta 0:00:01 |███████████ | 40 kB 51.7 MB/s eta 0:00:01 |█████████████▉ | 51 kB 55.5 MB/s eta 0:00:01 |████████████████▌ | 61 kB 61.1 MB/s eta 0:00:01 |███████████████████▎ | 71 kB 63.7 MB/s eta 0:00:01 |██████████████████████ | 81 kB 65.7 MB/s eta 0:00:01 |████████████████████████▉ | 92 kB 69.4 MB/s eta 0:00:01 |███████████████████████████▋ | 102 kB 69.7 MB/s eta 0:00:01 |██████████████████████████████▍ | 112 kB 69.7 MB/s eta 0:00:01 |████████████████████████████████| 118 kB 69.7 MB/s [?25h Preparing metadata (setup.py) ... [?25l
-
 done [?25h
Collecting imbalanced-learn==0.7.0
Downloading imbalanced_learn-0.7.0-py3-none-any.whl (167 kB) [?25l |██ | 10 kB 33.1 MB/s eta 0:00:01 |████ | 20 kB 39.6 MB/s eta 0:00:01 |█████▉ | 30 kB 49.6 MB/s eta 0:00:01 |███████▉ | 40 kB 56.5 MB/s eta 0:00:01 |█████████▉ | 51 kB 61.5 MB/s eta 0:00:01 |███████████▊ | 61 kB 67.4 MB/s eta 0:00:01 |█████████████▊ | 71 kB 71.0 MB/s eta 0:00:01 |███████████████▊ | 81 kB 71.0 MB/s eta 0:00:01 |█████████████████▋ | 92 kB 74.3 MB/s eta 0:00:01 |███████████████████▋ | 102 kB 66.6 MB/s eta 0:00:01 |█████████████████████▋ | 112 kB 66.6 MB/s eta 0:00:01 |███████████████████████▌ | 122 kB 66.6 MB/s eta 0:00:01 |█████████████████████████▌ | 133 kB 66.6 MB/s eta 0:00:01 |███████████████████████████▌ | 143 kB 66.6 MB/s eta 0:00:01 |█████████████████████████████▍ | 153 kB 66.6 MB/s eta 0:00:01 |███████████████████████████████▍| 163 kB 66.6 MB/s eta 0:00:01 |████████████████████████████████| 167 kB 66.6 MB/s [?25h
Collecting pyyaml<6.0.0 Downloading PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl (636 kB) [?25l |▌ | 10 kB 26.8 MB/s eta 0:00:01 |█ | 20 kB 33.0 MB/s eta 0:00:01 |█▌ | 30 kB 38.3 MB/s eta 0:00:01 |██ | 40 kB 41.3 MB/s eta 0:00:01 |██▋ | 51 kB 44.3 MB/s eta 0:00:01 |███ | 61 kB 48.7 MB/s eta 0:00:01 |███▋ | 71 kB 52.0 MB/s eta 0:00:01 |████▏ | 81 kB 54.7 MB/s eta 0:00:01 |████▋ | 92 kB 57.3 MB/s eta 0:00:01 |█████▏ | 102 kB 59.6 MB/s eta 0:00:01 |█████▋ | 112 kB 59.6 MB/s eta 0:00:01 |██████▏ | 122 kB 59.6 MB/s eta 0:00:01 |██████▊ | 133 kB 59.6 MB/s eta 0:00:01 |███████▏ | 143 kB 59.6 MB/s eta 0:00:01 |███████▊ | 153 kB 59.6 MB/s eta 0:00:01 |████████▎ | 163 kB 59.6 MB/s eta 0:00:01 |████████▊ | 174 kB 59.6 MB/s eta 0:00:01 |█████████▎ | 184 kB 59.6 MB/s eta 0:00:01 |█████████▉ | 194 kB 59.6 MB/s eta 0:00:01 |██████████▎ | 204 kB 59.6 MB/s eta 0:00:01 |██████████▉ | 215 kB 59.6 MB/s eta 0:00:01 |███████████▎ | 225 kB 59.6 MB/s eta 0:00:01 |███████████▉ | 235 kB 59.6 MB/s eta 0:00:01 |████████████▍ | 245 kB 59.6 MB/s eta 0:00:01 |████████████▉ | 256 kB 59.6 MB/s eta 0:00:01 |█████████████▍ | 266 kB 59.6 MB/s eta 0:00:01 |██████████████ | 276 kB 59.6 MB/s eta 0:00:01 |██████████████▍ | 286 kB 59.6 MB/s eta 0:00:01 |███████████████ | 296 kB 59.6 MB/s eta 0:00:01 |███████████████▍ | 307 kB 59.6 MB/s eta 0:00:01 |████████████████ | 317 kB 59.6 MB/s eta 0:00:01 |████████████████▌ | 327 kB 59.6 MB/s eta 0:00:01 |█████████████████ | 337 kB 59.6 MB/s eta 0:00:01 |█████████████████▌ | 348 kB 59.6 MB/s eta 0:00:01 |██████████████████ | 358 kB 59.6 MB/s eta 0:00:01 |██████████████████▌ | 368 kB 59.6 MB/s eta 0:00:01 |███████████████████ | 378 kB 59.6 MB/s eta 0:00:01 |███████████████████▋ | 389 kB 59.6 MB/s eta 0:00:01 |████████████████████ | 399 kB 59.6 MB/s eta 0:00:01 |████████████████████▋ | 409 kB 59.6 MB/s eta 0:00:01 |█████████████████████ | 419 kB 59.6 MB/s eta 0:00:01 |█████████████████████▋ | 430 kB 59.6 MB/s eta 0:00:01 |██████████████████████▏ | 440 kB 59.6 MB/s eta 0:00:01 |██████████████████████▋ | 450 kB 59.6 MB/s eta 0:00:01 |███████████████████████▏ | 460 kB 59.6 MB/s eta 0:00:01 |███████████████████████▊ | 471 kB 59.6 MB/s eta 0:00:01 |████████████████████████▏ | 481 kB 59.6 MB/s eta 0:00:01 |████████████████████████▊ | 491 kB 59.6 MB/s eta 0:00:01 |█████████████████████████▏ | 501 kB 59.6 MB/s eta 0:00:01 |█████████████████████████▊ | 512 kB 59.6 MB/s eta 0:00:01 |██████████████████████████▎ | 522 kB 59.6 MB/s eta 0:00:01 |██████████████████████████▊ | 532 kB 59.6 MB/s eta 0:00:01 |███████████████████████████▎ | 542 kB 59.6 MB/s eta 0:00:01 |███████████████████████████▉ | 552 kB 59.6 MB/s eta 0:00:01 |████████████████████████████▎ | 563 kB 59.6 MB/s eta 0:00:01 |████████████████████████████▉ | 573 kB 59.6 MB/s eta 0:00:01
|█████████████████████████████▍ | 583 kB 59.6 MB/s eta 0:00:01 |█████████████████████████████▉ | 593 kB 59.6 MB/s eta 0:00:01 |██████████████████████████████▍ | 604 kB 59.6 MB/s eta 0:00:01 |██████████████████████████████▉ | 614 kB 59.6 MB/s eta 0:00:01 |███████████████████████████████▍| 624 kB 59.6 MB/s eta 0:00:01 |████████████████████████████████| 634 kB 59.6 MB/s eta 0:00:01 |████████████████████████████████| 636 kB 59.6 MB/s [?25hRequirement already satisfied: IPython in /srv/conda/envs/notebook/lib/python3.7/site-packages (from pycaret) (7.31.1)
Collecting mlflow Downloading mlflow-1.25.1-py3-none-any.whl (16.8 MB) [?25l | | 10 kB 36.2 MB/s eta 0:00:01 | | 20 kB 45.9 MB/s eta 0:00:01 | | 30 kB 56.7 MB/s eta 0:00:01 | | 40 kB 64.3 MB/s eta 0:00:01 | | 51 kB 69.7 MB/s eta 0:00:01 |▏ | 61 kB 75.8 MB/s eta 0:00:01 |▏ | 71 kB 66.9 MB/s eta 0:00:01 |▏ | 81 kB 70.9 MB/s eta 0:00:01 |▏ | 92 kB 63.3 MB/s eta 0:00:01 |▏ | 102 kB 56.0 MB/s eta 0:00:01 |▏ | 112 kB 56.0 MB/s eta 0:00:01 |▎ | 122 kB 56.0 MB/s eta 0:00:01 |▎ | 133 kB 56.0 MB/s eta 0:00:01 |▎ | 143 kB 56.0 MB/s eta 0:00:01 |▎ | 153 kB 56.0 MB/s eta 0:00:01 |▎ | 163 kB 56.0 MB/s eta 0:00:01 |▎ | 174 kB 56.0 MB/s eta 0:00:01 |▍ | 184 kB 56.0 MB/s eta 0:00:01 |▍ | 194 kB 56.0 MB/s eta 0:00:01 |▍ | 204 kB 56.0 MB/s eta 0:00:01 |▍ | 215 kB 56.0 MB/s eta 0:00:01 |▍ | 225 kB 56.0 MB/s eta 0:00:01 |▌ | 235 kB 56.0 MB/s eta 0:00:01 |▌ | 245 kB 56.0 MB/s eta 0:00:01 |▌ | 256 kB 56.0 MB/s eta 0:00:01 |▌ | 266 kB 56.0 MB/s eta 0:00:01 |▌ | 276 kB 56.0 MB/s eta 0:00:01 |▌ | 286 kB 56.0 MB/s eta 0:00:01 |▋ | 296 kB 56.0 MB/s eta 0:00:01 |▋ | 307 kB 56.0 MB/s eta 0:00:01 |▋ | 317 kB 56.0 MB/s eta 0:00:01 |▋ | 327 kB 56.0 MB/s eta 0:00:01 |▋ | 337 kB 56.0 MB/s eta 0:00:01 |▋ | 348 kB 56.0 MB/s eta 0:00:01 |▊ | 358 kB 56.0 MB/s eta 0:00:01 |▊ | 368 kB 56.0 MB/s eta 0:00:01 |▊ | 378 kB 56.0 MB/s eta 0:00:01 |▊ | 389 kB 56.0 MB/s eta 0:00:01 |▊ | 399 kB 56.0 MB/s eta 0:00:01 |▉ | 409 kB 56.0 MB/s eta 0:00:01 |▉ | 419 kB 56.0 MB/s eta 0:00:01 |▉ | 430 kB 56.0 MB/s eta 0:00:01 |▉ | 440 kB 56.0 MB/s eta 0:00:01 |▉ | 450 kB 56.0 MB/s eta 0:00:01 |▉ | 460 kB 56.0 MB/s eta 0:00:01 |█ | 471 kB 56.0 MB/s eta 0:00:01 |█ | 481 kB 56.0 MB/s eta 0:00:01 |█ | 491 kB 56.0 MB/s eta 0:00:01 |█ | 501 kB 56.0 MB/s eta 0:00:01 |█ | 512 kB 56.0 MB/s eta 0:00:01 |█ | 522 kB 56.0 MB/s eta 0:00:01 |█ | 532 kB 56.0 MB/s eta 0:00:01 |█ | 542 kB 56.0 MB/s eta 0:00:01 |█ | 552 kB 56.0 MB/s eta 0:00:01 |█ | 563 kB 56.0 MB/s eta 0:00:01 |█ | 573 kB 56.0 MB/s eta 0:00:01 |█▏ | 583 kB 56.0 MB/s eta 0:00:01 |█▏ | 593 kB 56.0 MB/s eta 0:00:01 |█▏ | 604 kB 56.0 MB/s eta 0:00:01 |█▏ | 614 kB 56.0 MB/s eta 0:00:01 |█▏ | 624 kB 56.0 MB/s eta 0:00:01 |█▏ | 634 kB 56.0 MB/s eta 0:00:01 |█▎ | 645 kB 56.0 MB/s eta 0:00:01 |█▎ | 655 kB 56.0 MB/s eta 0:00:01 |█▎ | 665 kB 56.0 MB/s eta 0:00:01 |█▎ | 675 kB 56.0 MB/s eta 0:00:01 |█▎ | 686 kB 56.0 MB/s eta 0:00:01 |█▎ | 696 kB 56.0 MB/s eta 0:00:01 |█▍ | 706 kB 56.0 MB/s eta 0:00:01 |█▍ | 716 kB 56.0 MB/s eta 0:00:01 |█▍ | 727 kB 56.0 MB/s eta 0:00:01 |█▍ | 737 kB 56.0 MB/s eta 0:00:01 |█▍ | 747 kB 56.0 MB/s eta 0:00:01 |█▌ | 757 kB 56.0 MB/s eta 0:00:01 |█▌ | 768 kB 56.0 MB/s eta 0:00:01 |█▌ | 778 kB 56.0 MB/s eta 0:00:01 |█▌ | 788 kB 56.0 MB/s eta 0:00:01 |█▌ | 798 kB 56.0 MB/s eta 0:00:01 |█▌ | 808 kB 56.0 MB/s eta 0:00:01 |█▋ | 819 kB 56.0 MB/s eta 0:00:01 |█▋ | 829 kB 56.0 MB/s eta 0:00:01 |█▋ | 839 kB 56.0 MB/s eta 0:00:01 |█▋ | 849 kB 56.0 MB/s eta 0:00:01 |█▋ | 860 kB 56.0 MB/s eta 0:00:01 |█▋ | 870 kB 56.0 MB/s eta 0:00:01 |█▊ | 880 kB 56.0 MB/s eta 0:00:01 |█▊ | 890 kB 56.0 MB/s eta 0:00:01 |█▊ | 901 kB 56.0 MB/s eta 0:00:01 |█▊ | 911 kB 56.0 MB/s eta 0:00:01
|█▊ | 921 kB 56.0 MB/s eta 0:00:01 |█▉ | 931 kB 56.0 MB/s eta 0:00:01 |█▉ | 942 kB 56.0 MB/s eta 0:00:01 |█▉ | 952 kB 56.0 MB/s eta 0:00:01 |█▉ | 962 kB 56.0 MB/s eta 0:00:01 |█▉ | 972 kB 56.0 MB/s eta 0:00:01 |█▉ | 983 kB 56.0 MB/s eta 0:00:01 |██ | 993 kB 56.0 MB/s eta 0:00:01 |██ | 1.0 MB 56.0 MB/s eta 0:00:01 |██ | 1.0 MB 56.0 MB/s eta 0:00:01 |██ | 1.0 MB 56.0 MB/s eta 0:00:01 |██ | 1.0 MB 56.0 MB/s eta 0:00:01 |██ | 1.0 MB 56.0 MB/s eta 0:00:01 |██ | 1.1 MB 56.0 MB/s eta 0:00:01 |██ | 1.1 MB 56.0 MB/s eta 0:00:01 |██ | 1.1 MB 56.0 MB/s eta 0:00:01 |██ | 1.1 MB 56.0 MB/s eta 0:00:01 |██ | 1.1 MB 56.0 MB/s eta 0:00:01 |██▏ | 1.1 MB 56.0 MB/s eta 0:00:01 |██▏ | 1.1 MB 56.0 MB/s eta 0:00:01 |██▏ | 1.1 MB 56.0 MB/s eta 0:00:01 |██▏ | 1.1 MB 56.0 MB/s eta 0:00:01 |██▏ | 1.1 MB 56.0 MB/s eta 0:00:01 |██▏ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▎ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▎ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▎ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▎ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▎ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▎ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▍ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▍ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▍ | 1.2 MB 56.0 MB/s eta 0:00:01 |██▍ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▍ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▌ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▌ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▌ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▌ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▌ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▌ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▋ | 1.3 MB 56.0 MB/s eta 0:00:01 |██▋ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▋ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▋ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▋ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▋ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▊ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▊ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▊ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▊ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▊ | 1.4 MB 56.0 MB/s eta 0:00:01 |██▊ | 1.5 MB 56.0 MB/s eta 0:00:01 |██▉ | 1.5 MB 56.0 MB/s eta 0:00:01 |██▉ | 1.5 MB 56.0 MB/s eta 0:00:01 |██▉ | 1.5 MB 56.0 MB/s eta 0:00:01 |██▉ | 1.5 MB 56.0 MB/s eta 0:00:01 |██▉ | 1.5 MB 56.0 MB/s too many strings
colab では、以下の様にインストールしました。
!pip install pycaret==2.3.10 markupsafe==2.0.1 pyyaml==5.4.1 -qq
後続の from pycaret.classification import * の部分でエラーが発生してしまったので、 stack overflowの記事を参考にしました。
一応 Colab mode を有効にします。
python
from pycaret.utils import enable_colab
enable_colab()

Colab mode enabled.

データの取得

PyCaret で取得できる Mice Protein Expression というデータを使っていきます。
ざっくりとした理解ですが、マウスのクラスタリングです。
(普通/ダウン症) x (学習刺激あり/無し) x (治療薬の投与のあり/無し) の8つの区分( class )あるマウスのデータセットのようです。
元のデータはこちらとのことです。
Classes:
c-CS-s: control mice, stimulated to learn, injected with saline (9 mice)
c-CS-m: control mice, stimulated to learn, injected with memantine (10 mice)
c-SC-s: control mice, not stimulated to learn, injected with saline (9 mice)
c-SC-m: control mice, not stimulated to learn, injected with memantine (10 mice)

t-CS-s: trisomy mice, stimulated to learn, injected with saline (7 mice)
t-CS-m: trisomy mice, stimulated to learn, injected with memantine (9 mice)
t-SC-s: trisomy mice, not stimulated to learn, injected with saline (9 mice)
t-SC-m: trisomy mice, not stimulated to learn, injected with memantine (9 mice)
python
from pycaret.datasets import get_data
dataset = get_data('mice')

MouseID DYRK1A_N ITSN1_N BDNF_N NR1_N NR2A_N pAKT_N pBRAF_N pCAMKII_N pCREB_N ... pCFOS_N SYP_N H3AcK18_N EGR1_N H3MeK4_N CaNA_N Genotype Treatment Behavior class
0 309_1 0.503644 0.747193 0.430175 2.816329 5.990152 0.218830 0.177565 2.373744 0.232224 ... 0.108336 0.427099 0.114783 0.131790 0.128186 1.675652 Control Memantine C/S c-CS-m
1 309_2 0.514617 0.689064 0.411770 2.789514 5.685038 0.211636 0.172817 2.292150 0.226972 ... 0.104315 0.441581 0.111974 0.135103 0.131119 1.743610 Control Memantine C/S c-CS-m
2 309_3 0.509183 0.730247 0.418309 2.687201 5.622059 0.209011 0.175722 2.283337 0.230247 ... 0.106219 0.435777 0.111883 0.133362 0.127431 1.926427 Control Memantine C/S c-CS-m
3 309_4 0.442107 0.617076 0.358626 2.466947 4.979503 0.222886 0.176463 2.152301 0.207004 ... 0.111262 0.391691 0.130405 0.147444 0.146901 1.700563 Control Memantine C/S c-CS-m
4 309_5 0.434940 0.617430 0.358802 2.365785 4.718679 0.213106 0.173627 2.134014 0.192158 ... 0.110694 0.434154 0.118481 0.140314 0.148380 1.839730 Control Memantine C/S c-CS-m

5 rows × 82 columns

取得したデータセットをモデル作成用( data )と予測用( data_unseen )とに95:5に分けます。
python
data = dataset.sample(frac=0.95, random_state=786)
data_unseen = dataset.drop(data.index)

data.reset_index(drop=True, inplace=True)
data_unseen.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: (1026, 82) Unseen Data For Predictions: (54, 82)

前処理

setup() を使って前処理をします。
実行すると、投入したデータの型のチェックを自動で実施してくれます。
問題なければ、カーソルをあわせ、 Enter を押します。
python
from pycaret.clustering import *

exp_clu101 = setup(data, normalize = True, 
                   ignore_features = ['MouseID'],
                   session_id = 123)

Description Value
0 session_id 123
1 Original Data (1026, 82)
2 Missing Values True
3 Numeric Features 77
4 Categorical Features 4
5 Ordinal Features False
6 High Cardinality Features False
7 High Cardinality Method None
8 Transformed Data (1026, 91)
9 CPU Jobs -1
10 Use GPU False
11 Log Experiment False
12 Experiment Name cluster-default-name
13 USI 85ca
14 Imputation Type simple
15 Iterative Imputation Iteration None
16 Numeric Imputer mean
17 Iterative Imputation Numeric Model None
18 Categorical Imputer mode
19 Iterative Imputation Categorical Model None
20 Unknown Categoricals Handling least_frequent
21 Normalize True
22 Normalize Method zscore
23 Transformation False
24 Transformation Method None
25 PCA False
26 PCA Method None
27 PCA Components None
28 Ignore Low Variance False
29 Combine Rare Levels False
30 Rare Level Threshold None
31 Numeric Binning False
32 Remove Outliers False
33 Outliers Threshold None
34 Remove Multicollinearity False
35 Multicollinearity Threshold None
36 Remove Perfect Collinearity False
37 Clustering False
38 Clustering Iteration None
39 Polynomial Features False
40 Polynomial Degree None
41 Trignometry Features False
42 Polynomial Threshold None
43 Group Features False
44 Feature Selection False
45 Feature Selection Method classic
46 Features Selection Threshold None
47 Feature Interaction False
48 Feature Ratio False
49 Interaction Threshold None
Missing Values 、Original Data や Transformed Data など処理の前後の情報などが表示されます。
Original Data は shape (1026, 82) つまり、1026 samples と 82 features でしたが、 setup() の前処理によって、Transformed Data は(1026, 92)になりました。
これは、 class などのいくつかの特徴量を自動でエンコーディングしてくれたためです。

モデルの作成

create_model() を使ってモデルを作っていきます。
ここでは、 kmeans のモデルを作成してきます。
python
kmeans = create_model('kmeans')

Silhouette Calinski-Harabasz Davies-Bouldin Homogeneity Rand Index Completeness
0 0.1187 137.5261 2.0715 0 0 0
python
print(kmeans)

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300, n_clusters=4, n_init=10, n_jobs=-1, precompute_distances='deprecated', random_state=123, tol=0.0001, verbose=0)
初期値 n_clusters=4 で実行したので、4つのクラスに分類するモデルができました。
pycaret.clustering では、以下の9種類が使えるとのことです。
python
models()

Name Reference
ID
kmeans K-Means Clustering sklearn.cluster._kmeans.KMeans
ap Affinity Propagation sklearn.cluster._affinity_propagation.Affinity...
meanshift Mean Shift Clustering sklearn.cluster._mean_shift.MeanShift
sc Spectral Clustering sklearn.cluster._spectral.SpectralClustering
hclust Agglomerative Clustering sklearn.cluster._agglomerative.AgglomerativeCl...
dbscan Density-Based Spatial Clustering sklearn.cluster._dbscan.DBSCAN
optics OPTICS Clustering sklearn.cluster._optics.OPTICS
birch Birch Clustering sklearn.cluster._birch.Birch
kmodes K-Modes Clustering kmodes.kmodes.KModes
詳細は
To see the complete list of models in the library please see docstring or use models function. とのことです。

モデルを使って分類

作成した k-means のモデルを使って分類していきます。
assign_model() を使います。
python
kmean_results = assign_model(kmeans)
kmean_results.head()

MouseID DYRK1A_N ITSN1_N BDNF_N NR1_N NR2A_N pAKT_N pBRAF_N pCAMKII_N pCREB_N ... SYP_N H3AcK18_N EGR1_N H3MeK4_N CaNA_N Genotype Treatment Behavior class Cluster
0 3501_12 0.344930 0.626194 0.383583 2.534561 4.097317 0.303547 0.222829 4.592769 0.239427 ... 0.455172 0.252700 0.218868 0.249187 1.139493 Ts65Dn Memantine S/C t-SC-m Cluster 3
1 3520_5 0.630001 0.839187 0.357777 2.651229 4.261675 0.253184 0.185257 3.816673 0.204940 ... 0.496423 0.155008 0.153219 NaN 1.642886 Control Memantine C/S c-CS-m Cluster 0
2 3414_13 0.555122 0.726229 0.278319 2.097249 2.897553 0.222222 0.174356 1.867880 0.203379 ... 0.344964 0.136109 0.155530 0.185484 1.657670 Ts65Dn Memantine C/S t-CS-m Cluster 2
3 3488_8 0.275849 0.430764 0.285166 2.265254 3.250091 0.189258 0.157837 2.917611 0.202594 ... 0.390880 0.127944 0.207671 0.175357 0.893598 Control Saline S/C c-SC-s Cluster 1
4 3501_7 0.304788 0.617299 0.335164 2.638236 4.876609 0.280590 0.199417 4.835421 0.236314 ... 0.470932 0.245277 0.202171 0.240372 0.795637 Ts65Dn Memantine S/C t-SC-m Cluster 3

5 rows × 83 columns

一番右に新しく Cluster の列が追加されました。
また、一番左の MouseID ですが、これは setup() の際に ignore_features = ['MouseID'], で除外しているので、クラスタリングの特徴量からは除外されています。

モデルのプロット

plot_model() を使ってクラスタリングの結果を可視化していきます。

PCA plot

plot_model(kmeans)
# magicode 上で実行すると固まります。
こちらは、 ploty でこんな感じで描画されます。

Elbow plot

python
plot_model(kmeans, plot = 'elbow')

findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
<Figure size 576x396 with 1 Axes>
この例だと、 5 が適切なクラスタの数だと提案してくれています。
(モデルを作り直すのが面倒なので、今回はそのまま4分類で進めます。)

Silhouette Plot

python
plot_model(kmeans, plot = 'silhouette')

<Figure size 576x396 with 1 Axes>

Distribution Plot

それぞれのクラスタにどれくらいの量のデータがあるかを見ていきます。
plot_model(kmeans, plot = 'distribution') #to see size of clusters
# magicode 上で実行すると固まります。
こちらは、 ploty でこんな感じで描画されます。
claster 3 のデータの数が一番多いことがわかります。
さらに、 引数に feature を追加すると、より細かく確認することができます。
plot_model(kmeans, plot = 'distribution', feature = 'class')
# magicode 上で実行すると固まります。
こちらは、 ploty でこんな感じで描画されます。
class t-SC-mc-SC-m は Cluster 3 に分類されるデータが多いことがわかります。
plot_model(kmeans, plot = 'distribution', feature = 'CaNA_N')
# magicode 上で実行すると固まります。
こちらは、 ploty でこんな感じで描画されます。

予測用のデータにモデルを使い予測する

予測用に取り分けておいたデータ data_unseen に対して、作成した k-means のモデルを使い予測をします。 predict_model() を使います。
python
unseen_predictions = predict_model(kmeans, data=data_unseen)
unseen_predictions.head()

MouseID DYRK1A_N ITSN1_N BDNF_N NR1_N NR2A_N pAKT_N pBRAF_N pCAMKII_N pCREB_N ... SYP_N H3AcK18_N EGR1_N H3MeK4_N CaNA_N Genotype Treatment Behavior class Cluster
0 309_6 0.447506 0.628176 0.367388 2.385939 4.807635 0.218578 0.176233 2.141282 0.195188 ... 0.439833 0.116657 0.140766 0.142180 1.816389 Control Memantine C/S c-CS-m Cluster 2
1 311_3 0.704633 0.802537 0.350110 2.467733 5.548400 0.205323 0.165058 2.107281 0.171401 ... 0.454509 0.111089 0.157731 0.158543 1.404481 Control Memantine C/S c-CS-m Cluster 2
2 321_4 0.505093 0.695549 0.376029 2.915585 5.917957 0.226734 0.174271 2.663039 0.190038 ... 0.591586 0.131515 0.188391 NaN 1.699260 Control Memantine C/S c-CS-m Cluster 0
3 3415_12 0.429133 0.563175 0.258429 2.028151 3.542553 0.214075 0.176759 3.165139 0.167430 ... 0.371618 0.118223 0.171071 0.173702 1.405727 Control Memantine C/S c-CS-m Cluster 1
4 3415_15 0.373648 0.471165 0.257909 1.860032 2.938526 0.218262 0.150380 2.610132 0.142571 ... 0.277665 0.086785 0.126537 0.112690 0.790975 Control Memantine C/S c-CS-m Cluster 1

5 rows × 83 columns

Cluster 列が追加され、分類がされていることがわかります。

モデルの保存

save_model() を使い、モデルを保存します。
python
save_model(kmeans,'Final KMeans Model')

Transformation Pipeline and Model Successfully Saved
(Pipeline(memory=None, steps=[('dtypes', DataTypes_Auto_infer(categorical_features=[], display_types=True, features_todrop=['MouseID'], id_columns=[], ml_usecase='regression', numerical_features=[], target='UNSUPERVISED_DUMMY_TARGET', time_features=[])), ('imputer', Simple_Imputer(categorical_strategy='most frequent', fill_value_categorical=None, fill_value_numer... ('fix_perfect', 'passthrough'), ('clean_names', Clean_Colum_Names()), ('feature_select', 'passthrough'), ('fix_multi', 'passthrough'), ('dfs', 'passthrough'), ('pca', 'passthrough'), ['trained_model', KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300, n_clusters=4, n_init=10, n_jobs=-1, precompute_distances='deprecated', random_state=123, tol=0.0001, verbose=0)]], verbose=False), 'Final KMeans Model.pkl')

モデルのロード

load_model() を使い、先ほど保存したモデルをロードします。
python
saved_kmeans = load_model('Final KMeans Model')

Transformation Pipeline and Model Successfully Loaded
ロードしたモデルを使い、分類します。
python
new_prediction = predict_model(saved_kmeans, data=data_unseen)
new_prediction.head()

MouseID DYRK1A_N ITSN1_N BDNF_N NR1_N NR2A_N pAKT_N pBRAF_N pCAMKII_N pCREB_N ... SYP_N H3AcK18_N EGR1_N H3MeK4_N CaNA_N Genotype Treatment Behavior class Cluster
0 309_6 0.447506 0.628176 0.367388 2.385939 4.807635 0.218578 0.176233 2.141282 0.195188 ... 0.439833 0.116657 0.140766 0.142180 1.816389 Control Memantine C/S c-CS-m Cluster 2
1 311_3 0.704633 0.802537 0.350110 2.467733 5.548400 0.205323 0.165058 2.107281 0.171401 ... 0.454509 0.111089 0.157731 0.158543 1.404481 Control Memantine C/S c-CS-m Cluster 2
2 321_4 0.505093 0.695549 0.376029 2.915585 5.917957 0.226734 0.174271 2.663039 0.190038 ... 0.591586 0.131515 0.188391 NaN 1.699260 Control Memantine C/S c-CS-m Cluster 0
3 3415_12 0.429133 0.563175 0.258429 2.028151 3.542553 0.214075 0.176759 3.165139 0.167430 ... 0.371618 0.118223 0.171071 0.173702 1.405727 Control Memantine C/S c-CS-m Cluster 1
4 3415_15 0.373648 0.471165 0.257909 1.860032 2.938526 0.218262 0.150380 2.610132 0.142571 ... 0.277665 0.086785 0.126537 0.112690 0.790975 Control Memantine C/S c-CS-m Cluster 1

5 rows × 83 columns

以上、 PyCaret のクラスタリングのチュートリアルでした。
可視化も簡単にできて便利そうです。

Discussion

コメントにはログインが必要です。