PyCaret 2.2 : チュートリアル : クラスタリング (初級)

PyCaret 2.2 : チュートリアル : クラスタリング (初級) (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/21/2020 (2.2.2)

* 本ページは、PyCaret 2.2 ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

 

チュートリアル : クラスタリング (初級)

1.0 チュートリアルの目的

このチュートリアルは貴方が PyCaret の経験は初めてで pycaret.clustering モジュールを使用してクラスタリングから始めることに関心があることを仮定しています。

このチュートリアルで以下を学習します :

  • データを得る : PyCaret レポジトリからどのようにデータをインポートするか
  • 環境をセットアップする : PyCaret でどのように実験をセットアップして多クラスモデルの構築を始めるか。
  • モデルを作成する : どのようにモデルを作成するか、そして分析のために元のデータセットにクラスタラベルを割り当てるか。交差検証を遂行するか、そして回帰メトリクスを評価するか
  • モデルをプロットする : 様々なプロットを使用してモデル性能をどのように分析するか
  • モデルを予測する : 訓練モデルに基づいて新しい / 未見のデータセットにどのようにクラスタラベルを割り当てるか
  • モデルをセーブ / ロードする : 将来的な利用のためにモデルをどのようにセーブ / ロードするか

 

2.0 クラスタリングとは何か?

クラスタリングはオブジェクトのセットを、同じグループ (クラスタと呼ばれます) のそれらが他のグループのそれらよりも互いに類似しているような方法でグループ分けするタスクです。それは調査のデータマイニング活動で、機械学習、パターン認識、画像解析、情報検索、バイオインフォマティクス、データ圧縮そしてコンピュータ・グラフィクスを含む多くの領域で利用される統計的データ分析のための一般的なテクニックです。クラスタリングの幾つかの一般的な実生活のユースケースは :

  • ターゲット・マーケティング・キャンペーンを設計するために購入履歴や関心に基づいたカスタマーセグメンテーション。
  • ドキュメントのタグ、トピックとコンテンツに基づいてドキュメントを複数のカテゴリーにクラスタリングする。
  • データの自然なグループ分けとパターンを見つけるためにソーシャル / ライフサイエンス実験における結果の分析。

クラスタリングについて更に学習する

 

3.0 PyCaret のクラスタリング・モジュールの概要

PyCaret のクラスタリング・モジュール (pycaret.clustering) は教師なし機械学習モジュールで、これはオブジェクトのセットを同じグループ (クラスタと呼ばれます) のそれらが他のグループのそれらよりも互いに類似しているような方法でグループ分けするタスクを遂行します。

PyCaret のクラスタリング・モジュールは幾つかの前処理をする機能を提供します、これは setup() 関数を通してセットアップを初期化するとき configure できます。それは 8 アルゴリズムと結果を解析する幾つかのプロットを提供します。PyCaret のクラスタリング・モジュールはまた  tune_model() と呼ばれる独特な関数も実装しています、これは分類のための AUC や回帰のための R2 のような教師あり学習目的を最適化するためにクラスタリング・モデルのハイパーパラメータを調整することを可能にします。

 

4.0 チュートリアルのためのデータセット

このチュートリアルのためにネズミ蛋白質発現 (Mice Protein Expression) と呼ばれる UCI からのデータセットを利用します。データセットは皮質の核画分の検知信号を生成した 77 の蛋白質修飾の発現量から成ります。データセットはプロテイン毎の 1080 測定の総数を含みます。各測定は独立のサンプル/マウスとして考えることができます。データセットについて更に読むためには ここをクリックしてください

データセットの謝辞:

Clara Higuera Department of Software Engineering and Artificial Intelligence, Faculty of Informatics and the Department of Biochemistry and Molecular Biology, Faculty of Chemistry, University Complutense, Madrid, Spain. Email: clarahiguera@ucm.es

Katheleen J. Gardiner, creator and owner of the protein expression data, is currently with the Linda Crnic Institute for Down Syndrome, Department of Pediatrics, Department of Biochemistry and Molecular Genetics, Human Medical Genetics and Genomics, and Neuroscience Programs, University of Colorado, School of Medicine, Aurora, Colorado, USA. Email: katheleen.gardiner@ucdenver.edu

Krzysztof J. Cios is currently with the Department of Computer Science, Virginia Commonwealth University, Richmond, Virginia, USA, and IITiS Polish Academy of Sciences, Poland. Email: kcios@vcu.edu

元のデータセットとデータ辞書は ここで見つけられます

 

5.0 データを得る

データを ここで見つかる 元のソースからダウンロードして pandas を使用してそれをロードすることができますし、あるいは get_data() 関数を使用してデータをロードするために PyCaret のデータレポジトリを利用できます。

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


#check the shape of data
dataset.shape
(1080, 82)

未見データ上で predict_model() 関数を実演するため、実験の最後の予測のために使用される元のデータセットから 5% (54 レコード) のサンプルが抑えられました。これは訓練/テスト分割と混同されるべきではありません、この特定の分割は現実生活のシナリオをシミュレートするために遂行されます。これについて考えるもう一つの方法はこれらの 54 サンプルはこの実験が遂行された時点では利用可能ではないことです。

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)

 

6.0 PyCaret で環境をセットアップする

setup() 関数は pycaret の環境を初期化してモデリングと配備のためにデータを準備する変換パイプラインを作成します。setup() は pycaret の任意の他の関数を実行する前に呼び出されなければなりません。それは 2 つの必須パラメータを取ります : pandas データフレームとターゲットカラム名です。総ての他のパラメータはオプションで前処理パイプラインをカスタマイズするために使用されます (後のチュートリアルでそれらを見ます)。

setup() が実行されるとき、PyCaret の推論アルゴリズムは特定のプロパティに基づいて総ての特徴のためにデータ型を自動的に推論します。データ型は正しく推論されるべきですが、これは常には当てはまりません。これを説明するため、setup() が実行された後 PyCaret は特徴とそれらの推論された型を含むテーブルを表示します。データ型の総てが正しく識別されれば続けるためにエンターを押すことができて、あるいは実験を終了するために quit がタイプできます。データ型が正しいことを確実にすることは PyCaret で基礎的な重要なことです、何故ならばそれは自動的に 2,3 の前処理タスクを遂行するからです、これは任意の機械学習実験に必須です。これらのタスクは各データ型のために様々に遂行されて、これはそれらが正しく configure されることが非常に重要であることを意味します。

後のチュートリアルで PyCaret の推論データ型を setup() の numeric_features と categorical_features パラメータを使用してどのように上書きするかを学習します。

from pycaret.clustering import *

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

ひとたびセットアップが成功的に実行されればそれは情報の幾つかの重要なピースを含む情報グリッドをプリントします。情報の殆どは setup() が実行されるときに構築される前処理パイプラインに関係します。これらの特徴の大部分はこのチュートリアルの目的の範囲外です、けれどもこの段階で注意すべき幾つかの重要なことは以下を含みます :

  • session_id : 後の再現性のために総ての関数のシードとして分配される擬似乱数。session_id が渡されない場合、総ての関数に分配される乱数が自動的に生成されます。この実験では、後の再現性のために session_id は 123 として設定されます。
  • Missing Values : 元のデータに欠損値があるときこれは True として示されます。上の情報グリッドの Missing Values は True であることに気付いてください、何故ならばデータは欠損値を含むからです、これは numeric 特徴のための平均と categorical 特徴のための定数を使用して自動的に補完されます。(データ) 補完の方法は setup() の numeric_imputation と categorical_imputation パラメータを使用して変更できます。
  • Original Data : データセットの元の shape を表示します。この実験では (1026, 82) は 1026 サンプルと 82 特徴を意味しています。
  • Transformed Data : 変換されたデータセットの shape を表示します。元のデータセット (1026, 82) の shape は (1026, 91) に変換されることに注意してください。特徴の数はデータセットの categorical 特徴のエンコーディングのために増加しました。
  • Numeric Features : numeric として推論される特徴の数。このデータセットでは 82 特徴から 77 が numeric として推論されます。
  • Categorical Features : categorical として推論される特徴の数。このデータセットでは 82 特徴から 5 が categorical として推論されます。ignore_feature パラメータを使用して 1 つの categorical 特徴 MouseID を無視したことにも注意してください。

欠損値補完 、categorical エンコーディング等のような、モデリングを遂行するために必須の 2, 3 のタスクがどのように自動的に処理されるかに気付いてください。setup() の殆どのパラメータはオプションで前処理パイプラインをカスタマイズするために使用されます。
これらのパラメータはこのチュートリアルのためには範囲外ですが、中間あるいは専門家レベルに進むときそれらを遥かに詳細にカバーします。

 

7.0 モデルを作成する

PyCaret でクラスター・モデルを訓練することは単純で教師あり学習モジュールでモデルをどのように作成するかに類似しています。クラスタリング・モデルは create_model() 関数を使用して作成されます、これは 1 つの必須パラメータを取ります : 訓練することを望むモデルの ID です。この関数は訓練されたモデルオブジェクトと 2,3 の教師なしメトリクスを返します。下のサンプルを見てください :

kmeans = create_model('kmeans')

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)

create_model() を使用して kmeans モデルを作成しました。num_clusters パラメータに値を渡さないとき n_clusters は 4 に設定されることに注意してください、これはデフォルトです。下のサンプルでは 6 クラスタで kmodes を作成します。

kmodes = create_model('kmodes', num_clusters = 6)

print(kmodes)
KModes(cat_dissim=, init='Cao',
       max_iter=100, n_clusters=6, n_init=1, n_jobs=-1, random_state=123,
       verbose=0)

create_model() 内で単純に kmeans を kmodes で置き換えて akmodes クラスタリング・モデルを作成しました。pycaret.clustering モジュールで利用可能な 9 モデルがあります。ライブラリのモデルの完全なリストを見るためには docstring を見るか models 関数を使用してください。

models()

 

8.0 モデルを割り当てる

モデルを作成した今、結果を分析するためにクラスタラベルをデータセット (1080 サンプル) に割り当てたいです。assign_model() 関数を使用してこれを達成します。下のサンプルを見てください :

kmean_results = assign_model(kmeans)
kmean_results.head()

Cluster と呼ばれる新しいカラムが元のデータセットに追加されたことに気付いてください。kmean_results はまた MouseID 特徴も含みます、これは setup() の間に破棄されましたがそれはモデルのためには使用されずに assign_model() を使用するときデータセットに追加されただけです。次のセクションでは plot_model() を使用してどのようにクラスタリングの結果を分析するかを見ます。

 

9.0 モデルをプロットする

plot_model() 関数はクラスタリング・モデルの様々な様相を分析するために利用できます。この関数は訓練されたモデル・オブジェクトを取りそしてプロットを返します。下のサンプルを見てください :

 

9.1 クラスタ PCA プロット

plot_model(kmeans)

クラスタラベルは自動的に彩色されて判例で示されます。データポイントに渡りマウスポインタを移動するとき追加の特徴を見ます、これはデフォルトではデータセットの最初のカラムを使用します ( この場合には MouseID)。feature パラメータを渡すことによりこれを変更できます、そしてラベルがプロット上にプリントされることを望む場合には label を True に設定することも可能です。

 

9.2 Elbow プロット

plot_model(kmeans, plot = 'elbow')

elbow メソッドはデータセットの適切な数を見つける助けをするために設計されたクラスタ分析内の一貫性の解釈と検証のヒューリスティックな方法です。この例では上の Elbow プロットは 5 がクラスタの最適な数であると提案しています。

Elobow プロットについて更に学習する

 

9.3 シルエット・プロット

plot_model(kmeans, plot = 'silhouette')

シルエットはデータのクラスタ内の一貫性の解釈と検証の方法です。このテクニックは各オブジェクトがどのように上手く分類されたかの簡潔なグラフィカルな表現を提供します。換言すれば、シルエット値はオブジェクトが他のクラスタ (分離 (= separation)) に比較してそれ自身のクラスタ (密着 (= cohesion)) にどのくらい類似しているかの尺度です。

シルエット・プロットについて更に学習する

 

9.4 分布プロット

plot_model(kmeans, plot = 'distribution') #to see size of clusters

分布プロットは各クラスタのサイズを示します。バーに渡りマウスを移動するとき各クラスタに割当てられたサンプルの数を見ます。上のサンプルから、クラスタ 3 がサンプルの最高数を持つことを観察できます。任意の他の numeric か categorical 特徴に関連するクラスタラベルの分布を見るために分布プロットを使用することもできます。下のサンプルを見てください :

plot_model(kmeans, plot = 'distribution', feature = 'class')

上のサンプルでは特徴として class を使用しましたので各バーは class を表します、これはクラスタラベルで彩色されます (右側の凡例)。class t-SC-m と c-SC-m がクラスタ 3 に殆ど専有されていることを観察できます。任意の連続する特徴の分布を見るために同じプロットを使用することもできます。

plot_model(kmeans, plot = 'distribution', feature = 'CaNA_N')

 

10.0 未見データ上で予測する

predict_model() 関数は新しい未見のデータセットにクラスタラベルを割り当てるために使用されます。今は data_unseen にストアされたデータを予測するために kmeans モデルを使用します。この変数はチュートリアルの最初で作成されて元のデータセットから 54 サンプルを含みます、これは PyCaret に決して公開されていません。

unseen_predictions = predict_model(kmeans, data=data_unseen)
unseen_predictions.head()

訓練された kmeans モデルから予測されたクラスタラベルを示す Cluster カラムが data_unseen 上に追加されます。

 

11.0 モデルをセーブする

今では未見データ上でラベルを予測するために kmeans モデルを使用することにより実験を終了しました。

これは私達に実験の終わりをもたらしますが、依然として一つの質問が問われるべきです : 予測するためのより多くの新しいデータを持つとき何が起きるでしょう?実験全体を再度通り抜けなければなりませんか?答えはノーです、PyCaret の組込み関数 save_model() は後で使用するために変換パイプライン全体と一緒にモデルをセーブすることを可能にします。

save_model(kmeans,'Final KMeans Model 25Nov2020')
Transformation Pipeline and Model Succesfully Saved
(Pipeline(memory=None,
          steps=[('dtypes',
                  DataTypes_Auto_infer(categorical_features=[],
                                       display_types=True,
                                       features_todrop=['MouseID'],
                                       id_columns=[],
                                       ml_usecase='classification',
                                       numerical_features=[],
                                       target='UNSUPERVISED_DUMMY_TARGET',
                                       time_features=[])),
                 ('imputer',
                  Simple_Imputer(categorical_strategy='most frequent',
                                 fill_value_categorical=None,
                                 fill_value_n...
                 ('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 25Nov2020.pkl')

 

12.0 セーブされたモデルをロードします

同じまたは代替の環境で将来的にセーブされたモデルをロードするためには、PyCaret の load_model() 関数を使用してから予測のために新しい未見のデータ上でセーブされたモデルを容易に適用します。

saved_kmeans = load_model('Final KMeans Model 25Nov2020')
Transformation Pipeline and Model Successfully Loaded

ひとたびモデルが環境にロードされれば、同じ predict_model() 関数を使用して任意の新しいデータ上で予測するために単純に
それを利用できます。上のセクション 10 で使用した同じ data_unseen を予測するために下でロードされたモデルを適用しました。

new_prediction = predict_model(saved_kmeans, data=data_unseen)
new_prediction.head()

 

以上