クラスタリングは、類似したデータ点をグループ化する技術であり、形成された類似のデータ点のグループはクラスタとして知られています。
データに対してラベルがない場合がよくあります。
このため、データから洞察やパターンを導き出すことが非常に難しくなります。
このような状況では、教師なしクラスタリング技術が活躍します。
#Importing required libraries from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
#Getting the data ready data = load_iris()
df = data.data
#Selecting certain features based on which clustering is done df = df[:, 1 : 3 ]
#Creating the model agg_clustering = AgglomerativeClustering(n_clusters = 3 , affinity = 'euclidean' , linkage = 'ward' )
#predicting the labels labels = agg_clustering.fit_predict(df)
#Plotting the results plt.figure(figsize = ( 8 , 5 ))
plt.scatter(df[labels = = 0 , 0 ] , df[labels = = 0 , 1 ] , c = 'red' )
plt.scatter(df[labels = = 1 , 0 ] , df[labels = = 1 , 1 ] , c = 'blue' )
plt.scatter(df[labels = = 2 , 0 ] , df[labels = = 2 , 1 ] , c = 'green' )
plt.show() |
階層的クラスタリングの種類
階層的クラスタリングは2つのタイプに分けられる。
- 凝集型階層クラスタリング.
- 分割型階層型クラスタリング
1. 凝集型階層クラスタリング
凝集型階層クラスタリングでは,各データ点を1つのクラスタとみなし,クラスタの総数をデータ点の数と同じにする.そして,類似性メトリックに基づいてデータをグループ化し続け,階層を上がるにつれてクラスタを作っていく.この方法はボトムアップアプローチとも呼ばれる。
2. 分割型階層型クラスタリング
分割型階層的クラスタリングは、凝集型HCとは逆です。
ここでは、すべてのデータ点からなる1つのクラスタから始める。
各反復ごとに、距離メトリックに基づいて他から遠い点を分離し、すべてのクラスタが正確に1つのデータ点を持つようにします。
階層的クラスタリングを実行するためのステップ
例として、階層的クラスタリングがどのように機能するかを視覚化してみましょう。
例えば、4人の生徒が数学と理科で取った点数に関連するデータがあり、洞察を得るために生徒のクラスタを作成する必要があるとします。
#Importing libraries from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram , linkage
#Getting the data ready data = load_iris()
df = data.data
#Selecting certain features based on which clustering is done df = df[:, 1 : 3 ]
#Linkage Matrix Z = linkage(df, method = 'ward' )
#plotting dendrogram dendro = dendrogram(Z)
plt.title( 'Dendrogram' )
plt.ylabel( 'Euclidean distance' )
plt.show() |
データが得られたので、まず最初に行うべきことは、各データ点が互いにどのくらい離れているかを見ることです。
このために、距離行列を構築します。
各点間の距離は、ユークリッド距離、マンハッタン距離など、様々な測定基準を用いて求めることができる。
この例ではユークリッド距離を使用します。
S1とS2がお互いに近いので、S1とS2の間にクラスタを形成しました。
S1とS2が得た点数の平均を取り、その値がこのクラスターの点数となります。
平均値ではなく、クラスタ内のデータ点の最大値や最小値を考えることもできます。
再度、最も近い点を探し、別のクラスタを作成します。
上記のステップを繰り返し、すべてのクラスタを含む1つのクラスタになるまでクラスタリングを続けると、次のような結果が得られます。
この図は、デンドログラムと呼ばれるものです。
デンドログラムは、対応する分析によって生成されたクラスタの配置を示す樹木のような図です。
X軸上のサンプルは、近接したポイントを表すように自動的に配置され、より近くに留まります。
最適なクラスタ数を選択することは、難しいタスクです。
しかし、経験則として、最も長い「枝」または「最長デンドログラム距離」を持つクラスターを探します。
最適なクラスタ数は、専門家の知識、文脈などにも左右される。
十分なアイデアを頭に入れた上で、pythonで1つの実装を進めましょう。
Python による階層型クラスタリング
階層型クラスタリングのデモをするために、1つの例を見てみましょう。
ここでは、Iris データセットを使ってクラスタリングを行います。
Iris データセットの詳細については、こちらを参照してください。
1. クラスタのプロットと作成
sklearn.cluster
モジュールは、データセットに対してクラスタリングを行うための AgglomerativeClustering
クラスを提供します。
入力引数として、クラスタ数 (n_clusters
)、クラスタ作成時に使用する距離指標の種類に相当する affinity
、リンケージ基準 (linkage{“ward”, “complete”, “average”, “single”}, default=”ward”) が必要です。
linkage基準は、与えられたオブザベーションのセット間でどの距離を使用するかを決定します。
凝集型クラスタリングクラス AgglomerativeClustering
については、こちらで詳しく説明しています。
上記のコードでは、クラスタ数は3であるとみなしました。
これは虹彩データセットが3つの異なるクラスしか含まないことから明らかですが、実際のシナリオでは、各データポイントが属するラベルについての情報がないため、データに対して教師なしクラスタリングを実行します。
そのため、最適なクラスタ数を求めるには、その分野の専門知識が必要となる。
しかし、最適なクラスタを見つけるために利用可能ないくつかの方法があるので、今後の記事で紹介します。
2. Dendrogram のプロット
scipy.cluster` モジュールは Dendrogram をプロットするために使用する hierarchy クラスを含んでいます。
このクラスには dendrogram
メソッドと linkage
メソッドが含まれています。
linkageメソッドは、データセットと距離を最小化する方法をパラメータ (ward) として受け取り、リンク行列を返します。
この行列をdendrogram` メソッドに渡すと、フィットしたデータの Dendrogram が作成されます。
上の文が何を意味するのか、例で見てみましょう。
まとめ
この記事では、階層型クラスタリングとは何か、そしてその動作メカニズムについて、基本的な直感を得ることを試みました。
また、デンドログラムがどのように構築され、最終的にPythonでHCを実装するのかについて、いくつかのアイデアを得ることができました。