PyCaretでクラスタリングをしてみた

#はじめに
先日、リリースされた機械学習ライブラリーPyCaretを使ってみました。
データの特徴量分析や複数のモデルとの性能比較作業が自動化され、これまでのデータサイエンティストの作業時間がだいぶ減ると思います。

今回は、[Mice Protein Expression Data Set 2015](https://archive.ics.uci.edu/ml/datasets/Mice+Protein+Expression)を利用して、クラスタリングを行い、その結果を見てみます。

データの概要
 Expression levels of 77 proteins measured in the cerebral cortex of 8 classes of control and Down syndrome mice exposed to context fear conditioning, a task used to assess associative learning.


#1. PyCaretのインストール

下記のコードを実行しインストールします。
Anacondaを使っていますが、PyCaret専用の仮想環境を立ち上げてインストールしました。
既存のCondaで管理されてる仮想環境では、エラーが発生する場合があります。(恐らくpipとcondaとの衝突が原因）

```
pip install pycaret
```

#2.データの取得

```Python
from pycaret.datasets import get_data
dataset = get_data('mice')
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/7fadf885-957b-c0b3-39c8-f3ca4615960b.png)

Pandasのprofile_report()を使い、データの中身を見てみます。

```Python
import pandas_profiling
dataset.profile_report()
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/f17ce060-4b5c-347c-42fa-61fe710842ae.png)

そして、95％を訓練データ、5%をテストデータ(Unseen Dataと呼ぶ)に分けます。

```Python
data = dataset.sample(frac=0.95, random_state=786).reset_index(drop=True)
data_unseen = dataset.drop(data.index).reset_index(drop=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)

#3.データの前処理
setup()でデータの前処理を行います。

```Python
from pycaret.clustering import *
data_clust = setup(data, normalize = True, 
                   ignore_features = ['MouseID'],
                   session_id = 123)
```
NumericalデータのNormalizationを実施します。'Mouse ID'Featureは無視します。そして、Random seed固定としてsession_id=123を指定します。

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/4358f282-34a6-10b7-a860-9aaf08ab7a34.png)


#4.分析モデルの生成

クラスタリングモデルを選択して、モデリングを行います。create_model()を使います。
今回は、kmeansモデルを利用します。

```Python
kmeans = create_model('kmeans',num_clusters = 5 )
print(kmeans)
```
クラスタ数は5にします。Defaultは4です。

結果 
>KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
       n_clusters=5, n_init=10, n_jobs=None, precompute_distances='auto',
       random_state=123, tol=0.0001, verbose=0)

#5.モデルのAssign
assign_model()を用いて、データセット（1080サンプル）にクラスタラベルをAssignします。

```Python
kmean_results = assign_model(kmeans)
kmean_results.head()
```
結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/6cb9492c-8b9f-db91-1eb4-f593060d847d.png)


#6.モデルの可視化
plot_modelを用いて、クラスタリング結果を可視化します。

##6.1. PCA Plot
```Python
plot_model(kmeans)
```
結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/d2cb02d6-a426-2022-d524-1627ff90d8d2.png)

##6.2. Elbow Plot
```Python
plot_model(kmeans, plot = 'elbow')
```
Elbow Plotは、推奨クラスタ数を教えてくれます。この事例では、クラスタの最適数は5と指定されています。
結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/89ea0efa-3814-3b4f-60da-e1caf7836664.png)


##6.3. Silhouette Plot
```Python
plot_model(kmeans, plot = 'silhouette')
```
結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/3540535a-521b-a204-a893-1eb878c0cb8b.png)


##6.4. Distribution Plot
```Python
plot_model(kmeans, plot = 'distribution', feature = 'class')
```
結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/8c4b39dd-82b5-bb1b-8311-7b04692eac3a.png)


#7.予測


```Python
unseen_predictions = predict_model(kmeans, data=data_unseen)
unseen_predictions.head()
```
Label列は、予測の結果を意味します。

結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/88c1c346-604f-512d-71f3-2f870c178cef.png)


#8.まとめ

1. PyCaretで非教師学習であるクラスタリングを実施してみました。

##8.1  クラスタリングに使用したPycaret関数一覧
1. データの前処理：　setup()
2. 分析モデルの生成：  create_model()
3. クラスタラベルのAssign: assign_model()
4. 可視化：  plot_model()
5. 予測：  predict_model()


#9.参考資料

1.PyCaret Home Page , http://www.pycaret.org/
2.PyCaret Classification, https://pycaret.org/classification/
3. 最速でPyCaretを使ってみた, https://qiita.com/s_fukuzawa/items/5dd40a008dac76595eea
4.PyCaretでワインの品質を分類してみた. https://qiita.com/kotai2003/items/c8fa7e55230d0fa0cc8e
5.PyCaretでタイタニック生存予想をしてみたhttps://qiita.com/kotai2003/items/a377f45ddee9829ed2c5
6.PyCaretでをボストン不動産価格を予測してみた (回帰）
https://qiita.com/kotai2003/items/bf4e8a278e43c58cab06