機械学習 PR

【教師なし機械学習】Star Clusteringによるクラスタリング -クラスタ数を自動推定-

Star Clustering
記事内に商品プロモーションを含む場合があります

こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。

仕事でもプライベートでも機械学習で色々やってます。今回は教師なし学習のStar Clustering(クラスタリング手法) を紹介します。

クラスタリングとは

クラスタリングについては、以下のスライドがとても勉強になります。

 

本サイトで公開している距離学習の記事を読めば「距離」・「空間」・「クラスタリング容易なデータセット」についても学ぶことができます。

距離学習(Metric Learning)
距離学習(Metric Learning)入門から実践までこんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。距離学習 (metric learning)について勉強...

上記スライドや記事を読んでから、以降を読むのがオススメです。

k-means法によるクラスタリング

文部科学省が素敵な資料を公開し、SNSで話題になりました(下記参照)。

この資料で「k-means法によるクラスタリング」を紹介しています。k-means法ではクラスタ数をあらかじめ決める必要があります(下図 手順1)。

k-meansによるクラスタリング

引用元:第3章 情報とデータサイエンス 後半 (PDF:7.6MB)

クラスタ数をあらかじめ把握している場合は良いのですが、教師なし学習を選択する理由として…

クラスタ数が不明なデータセットに対し、最適なクラスタ数を把握したい
データセットに付与されたラベル数とクラスタ数が一致するか確認したい
くるる
くるる
空間に埋め込んだデータ(可視化したデータ)をどの粒度でクラスタリングすべきか検討したい

などが考えられます。要するに「最適なクラスタ数が不明なので、まずは教師なし学習で確認」というケースが多いと感じています。

エルボー法とシルエット分析 -最適なクラスタ数を算出-

k-means法の最適なクラスタ数を把握する手法として「エルボー法」「シルエット分析」があります。

エルボー法とシルエット分析

引用元:第3章 情報とデータサイエンス 後半 (PDF:7.6MB)

そのため以下のフローでクラスタリングすることが多いです。

  1. 「エルボー法」などでクラスタ数を算出
  2. k-means法でクラスタリング

上記の手順をどう思うかは人それぞれですが…

くるる
くるる
手順が2つかぁ。fitの1行でクラスタ数の最適化からクラスタリングまで自動でやってほしい!

と感じた フクロウの”くるる”@kururu_owl のために Star Clustering を紹介します。

Star Clusteringとは

Star Clustering の概要は以下の通りです。

The Star Clustering algorithm is a clustering technique that is loosely inspired and analogous to the process of star system formation. Its purpose is as an alternative clustering algorithm that does not require knowing the number of clusters in advance or any hyperparameter tuning.

引用元:star-clustering|Github

翻訳サービスの DeepL を使って日本語にしたものが以下です。

DeepLによる翻訳

Star Clustering アルゴリズムは、星系形成のプロセスに類似したクラスタリング手法です。その目的は、クラスタ数を事前に知る必要がなく、ハイパーパラメータの調整も必要としない代替クラスタリングアルゴリズムです。

Star Clustering アルゴリズム素敵!そして名前がカッコイイ☆★☆彡

スポンサーリンク

実践!Star Clusteringによるクラスタリング

Star Clusteringによるクラスタリングを実践してみます。plot_cluster_iris.py を参考にirisデータセットをクラスタリングするソースコードを作成します。

import

最初はimportから

最後の行をコメントアウトしているのは、本記事のコードをGoogle Colaboratoryに写経すれば簡単に実践できる形に修正したためです。

Star Clusteringアルゴリズム

Star Clusteringを実現する2つの処理(モジュール)を実装します。

まずは距離を算出する処理(distances.pyのコピペ)

続いてStar Clusteringアルゴリズム(star_clustering.pyのコピペ)

irisデータセットをダウンロード

irisデータセットをダウンロードし、説明変数をX、目的変数をyにセットします。

可視化

適当な2つの説明変数を選択してデータを可視化します。

irisデータセットの可視化3つの説明変数を選択して3Dでも可視化します。

irisデータセットの可視化

ラベルに応じて、3色のプロットを使いました。

データセットを可視化したときに『緑プロットと黄プロットの距離が近いので、クラスタリング困難なデータセットだな』というのをパッと考察できると良いですね。

Star Clusteringによるクラスタリング

fit含め、わずか2行でStar Clusteringによるクラスタリングを実現できます。

scikit-learn同様の使い易さです。

クラスタリング結果確認

クラスタリング結果を確認する方法は以下の2パターンがあります。

今回のクラスタリング結果は以下の通りでした。

labels: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
y_pred: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

クラスタ数:2(各データに”0″と”1″のラベル付け)という結果でした。

クラスタリング結果の可視化

クラスタリング結果を2Dで可視化します。

star-clusteringによるクラスタリング 続いて3Dでも可視化します。

star-clusteringによるクラスタリングクラスタ数をあらかじめ設定しなくても、クラスタリングできるので、とても使い易いですね。

くるる
くるる
クラスタ数:3じゃないけど良いの?

と感じた人がいると思いますが『3分類が困難なデータセットだった』という考え方もできます。

はやぶさ
はやぶさ
じゃあ3分類するにはどうすれば良いか?

と考え「情報不足なので情報量(説明変数)を増やしてみる」・「データ加工(特徴量エンジニアリング)を試す」など、次に実践したいことに繋げられれば良いと感じています。

まとめ

クラスタリングやk-means法について簡単に説明し、クラスタ数を自動推定してくれるStar Clustering を紹介しました。

また以下のような疑問に対する考え方(マインド)についても簡単に紹介しました。

  • どんなときにクラスタリングをするのか?
  • クラスタリング結果をどう考察するのか?
  • 考察した後、次に何をすれば良いか?

機械学習の勉強をしていると、どうしても精度の良い悪いに注目しがちですが「なぜ精度の良い分類が困難なのか?」を考え、次に活かすことが重要だと考えています。

本記事が参考になれば嬉しいです。

はやぶさ
はやぶさ
色んな考え方があって良いと思います。「あなたのマインドは?」この機会に考えてみて下さい。そして誰かと意見交換できると良いですね。

最後に因果推論の道具として機械学習を使いたい人にオススメの本を紹介します。

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python