前回の記事に引き続き、 PyCaret のチュートリアルを試してみたいと思います。
今回はクラスタリング(Clustering Tutorial (CLU101) - Level Beginner)に沿って試してみたいと思います。
PyCaret is an open-source, low-code machine learning library in Python that automates machine learning workflows.
と公式に記載あるように、わずかなコード量で実装できる Python の機械学習のライブラリです。
クラスタリングは、データ間の類似度に基づいてグループ分けしていく手法です。
以下のような使い方があるらしいです。
今回のチュートリアルは3つ目のケースに該当すると思います。
それでは、チュートリアルに沿って進めていきたいと思います。
Magicode 上で進めますが、 一部のグラフ表示ができない(plolty が magicode で動作する方法がわからない)ので、手元で試す場合には、 colab など別の環境での実施をおすすめします。
colab では、以下の様にインストールしました。
後続の from pycaret.classification import *
の部分でエラーが発生してしまったので、 stack overflowの記事を参考にしました。
一応 Colab mode を有効にします。
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)
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に分けます。
setup()
を使って前処理をします。
実行すると、投入したデータの型のチェックを自動で実施してくれます。
問題なければ、カーソルをあわせ、 Enter を押します。
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 のモデルを作成してきます。
Silhouette | Calinski-Harabasz | Davies-Bouldin | Homogeneity | Rand Index | Completeness | |
---|---|---|---|---|---|---|
0 | 0.1187 | 137.5261 | 2.0715 | 0 | 0 | 0 |
初期値 n_clusters=4
で実行したので、4つのクラスに分類するモデルができました。
pycaret.clustering
では、以下の9種類が使えるとのことです。
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()
を使います。
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()
を使ってクラスタリングの結果を可視化していきます。
こちらは、 ploty でこんな感じで描画されます。
この例だと、 5 が適切なクラスタの数だと提案してくれています。
(モデルを作り直すのが面倒なので、今回はそのまま4分類で進めます。)
それぞれのクラスタにどれくらいの量のデータがあるかを見ていきます。
こちらは、 ploty でこんな感じで描画されます。
claster 3 のデータの数が一番多いことがわかります。
さらに、 引数に feature
を追加すると、より細かく確認することができます。
こちらは、 ploty でこんな感じで描画されます。
class t-SC-m
と c-SC-m
は Cluster 3 に分類されるデータが多いことがわかります。
こちらは、 ploty でこんな感じで描画されます。
予測用に取り分けておいたデータ data_unseen
に対して、作成した k-means のモデルを使い予測をします。 predict_model()
を使います。
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()
を使い、モデルを保存します。
load_model()
を使い、先ほど保存したモデルをロードします。
ロードしたモデルを使い、分類します。
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 のクラスタリングのチュートリアルでした。
可視化も簡単にできて便利そうです。