こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。
仕事でもプライベートでも機械学習で色々やってます。今回は教師なし学習のStar Clustering(クラスタリング手法) を紹介します。
Contents
クラスタリングとは
クラスタリングについては、以下のスライドがとても勉強になります。
本サイトで公開している距離学習の記事を読めば「距離」・「空間」・「クラスタリング容易なデータセット」についても学ぶことができます。

上記スライドや記事を読んでから、以降を読むのがオススメです。
k-means法によるクラスタリング
文部科学省が素敵な資料を公開し、SNSで話題になりました(下記参照)。
文科省が出した高校新学習指導要領の「情報II」の教員研修用教材,結構なボリュームで,データサイエンスの部分はpython実装で,scikit-learnやニューラルネットを試したりkaggleの導入に触れたり,なかなかガチな内容になっているhttps://t.co/Mim38wnqzb
勾配降下法の図(画像2枚目)は新発想すぎて面白い pic.twitter.com/Aa0HWlGNWv— えるエル (@learn_learning3) June 23, 2020
この資料で「k-means法によるクラスタリング」を紹介しています。k-means法ではクラスタ数をあらかじめ決める必要があります(下図 手順1)。
クラスタ数をあらかじめ把握している場合は良いのですが、教師なし学習を選択する理由として…
などが考えられます。要するに「最適なクラスタ数が不明なので、まずは教師なし学習で確認」というケースが多いと感じています。
エルボー法とシルエット分析 -最適なクラスタ数を算出-
k-means法の最適なクラスタ数を把握する手法として「エルボー法」と「シルエット分析」があります。
そのため以下のフローでクラスタリングすることが多いです。
- 「エルボー法」などでクラスタ数を算出
- k-means法でクラスタリング
上記の手順をどう思うかは人それぞれですが…
と感じた フクロウの”くるる”@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.
翻訳サービスの 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つの説明変数を選択してデータを可視化します。
3つの説明変数を選択して3Dでも可視化します。
ラベルに応じて、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で可視化します。
続いて3Dでも可視化します。
クラスタ数をあらかじめ設定しなくても、クラスタリングできるので、とても使い易いですね。
と感じた人がいると思いますが『3分類が困難なデータセットだった』という考え方もできます。
と考え「情報不足なので情報量(説明変数)を増やしてみる」・「データ加工(特徴量エンジニアリング)を試す」など、次に実践したいことに繋げられれば良いと感じています。
まとめ
クラスタリングやk-means法について簡単に説明し、クラスタ数を自動推定してくれるStar Clustering を紹介しました。
また以下のような疑問に対する考え方(マインド)についても簡単に紹介しました。
- どんなときにクラスタリングをするのか?
- クラスタリング結果をどう考察するのか?
- 考察した後、次に何をすれば良いか?
機械学習の勉強をしていると、どうしても精度の良い悪いに注目しがちですが「なぜ精度の良い分類が困難なのか?」を考え、次に活かすことが重要だと考えています。
本記事が参考になれば嬉しいです。
最後に因果推論の道具として機械学習を使いたい人にオススメの本を紹介します。