ScikitLearn-クラスタリング手法
ここでは、データサンプルの類似性の特定に役立つSklearnのクラスタリング手法について学習します。
データサンプル間の類似性と関係のパターンを見つけるために使用される、最も有用な教師なしML手法の1つであるクラスタリング手法。その後、それらのサンプルを、特徴に基づいて類似性を持つグループにクラスター化します。クラスタリングは、現在のラベルのないデータ間の本質的なグループ化を決定するため、それが重要です。
Scikit-learnライブラリには sklearn.clusterラベルのないデータのクラスタリングを実行します。このモジュールでは、scikit-leranには次のクラスタリング方法があります-
KMeans
このアルゴリズムは重心を計算し、最適な重心が見つかるまで繰り返します。クラスターの数を指定する必要があるため、クラスターは既にわかっていると見なされます。このアルゴリズムの主なロジックは、慣性と呼ばれる基準を最小化することにより、分散が等しいn個のグループにサンプルを分離するデータをクラスター化することです。アルゴリズムによって識別されるクラスターの数は、 'Kで表されます。
Scikit-learn have have sklearn.cluster.KMeansK-Meansクラスタリングを実行するモジュール。クラスターの中心と慣性の値を計算している間、sample_weight 許可します sklearn.cluster.KMeans 一部のサンプルにより多くの重みを割り当てるモジュール。
親和性の伝播
このアルゴリズムは、収束するまでサンプルの異なるペア間で「メッセージパッシング」の概念に基づいています。アルゴリズムを実行する前にクラスターの数を指定する必要はありません。このアルゴリズムには、次数(2)の時間計算量があり、これが最大の欠点です。
Scikit-learn have have sklearn.cluster.AffinityPropagation アフィニティ伝搬クラスタリングを実行するモジュール。
平均シフト
このアルゴリズムは主に発見します blobsサンプルの滑らかな密度で。ポイントをデータポイントの最高密度に向けてシフトすることにより、データポイントをクラスターに繰り返し割り当てます。名前の付いたパラメータに依存する代わりにbandwidth 検索する領域のサイズを指定すると、クラスターの数が自動的に設定されます。
Scikit-learn have have sklearn.cluster.MeanShift 平均シフトクラスタリングを実行するモジュール。
スペクトルクラスタリング
クラスタリングの前に、このアルゴリズムは基本的に固有値、つまりデータの類似性マトリックスのスペクトルを使用して、より少ない次元で次元削減を実行します。クラスターの数が多い場合は、このアルゴリズムの使用はお勧めできません。
Scikit-learn have have sklearn.cluster.SpectralClustering スペクトルクラスタリングを実行するモジュール。
階層的クラスタリング
このアルゴリズムは、クラスターを連続してマージまたは分割することにより、ネストされたクラスターを構築します。このクラスター階層は、樹状図、つまりツリーとして表されます。次の2つのカテゴリに分類されます-
Agglomerative hierarchical algorithms−この種の階層アルゴリズムでは、すべてのデータポイントが単一のクラスターのように扱われます。次に、クラスターのペアを連続的に凝集させます。これはボトムアップアプローチを使用します。
Divisive hierarchical algorithms−この階層アルゴリズムでは、すべてのデータポイントが1つの大きなクラスターとして扱われます。この場合、クラスタリングのプロセスには、トップダウンアプローチを使用して、1つの大きなクラスターをさまざまな小さなクラスターに分割することが含まれます。
Scikit-learn have have sklearn.cluster.AgglomerativeClustering AgglomerativeHierarchicalクラスタリングを実行するモジュール。
DBSCAN
それはの略です “Density-based spatial clustering of applications with noise”。このアルゴリズムは、クラスターがデータポイントの低密度領域によって分離された、データ空間内の低密度の高密度領域であるという「クラスター」と「ノイズ」の直感的な概念に基づいています。
Scikit-learn have have sklearn.cluster.DBSCANDBSCANクラスタリングを実行するモジュール。密度を定義するためにこのアルゴリズムで使用されるmin_samplesとepsという2つの重要なパラメーターがあります。
パラメータの値が高い min_samples または、パラメーターepsの値が低いほど、クラスターを形成するために必要なデータポイントの密度が高いことを示します。
光学
それはの略です “Ordering points to identify the clustering structure”。このアルゴリズムは、空間データ内の密度ベースのクラスターも検出します。基本的な動作ロジックはDBSCANのようなものです。
これは、DBSCANアルゴリズムの主な弱点である、さまざまな密度のデータで意味のあるクラスターを検出する問題に対処するために、空間的に最も近いポイントが順序付けで隣接するようにデータベースのポイントを順序付けます。
Scikit-learn have have sklearn.cluster.OPTICS OPTICSクラスタリングを実行するモジュール。
バーチ
これは、階層を使用したバランスの取れた反復削減とクラスタリングの略です。これは、大規模なデータセットに対して階層的クラスタリングを実行するために使用されます。名前の付いたツリーを構築しますCFT すなわち Characteristics Feature Tree、指定されたデータに対して。
CFTの利点は、CF(特性機能)ノードと呼ばれるデータノードがクラスタリングに必要な情報を保持することです。これにより、入力データ全体をメモリに保持する必要がさらになくなります。
Scikit-learn have have sklearn.cluster.Birch BIRCHクラスタリングを実行するモジュール。
クラスタリングアルゴリズムの比較
次の表は、scikit-learnのクラスタリングアルゴリズムの比較(パラメーター、スケーラビリティ、およびメトリックに基づく)を示しています。
シニア番号 | アルゴリズム名 | パラメーター | スケーラビリティ | 使用されるメトリック |
---|---|---|---|---|
1 | K-Means | クラスターの数 | 非常に大きなn_samples | ポイント間の距離。 |
2 | 親和性の伝播 | ダンピング | n_samplesではスケーラブルではありません | グラフ距離 |
3 | 平均シフト | 帯域幅 | n_samplesではスケーラブルではありません。 | ポイント間の距離。 |
4 | スペクトルクラスタリング | クラスターの数 | n_samplesによる中レベルのスケーラビリティ。n_clustersによる低レベルのスケーラビリティ。 | グラフ距離 |
5 | 階層的クラスタリング | 距離のしきい値またはクラスターの数 | ラージn_samplesラージn_clusters | ポイント間の距離。 |
6 | DBSCAN | 近所の大きさ | 非常に大きなn_samplesと中程度のn_clusters。 | 最寄りのポイント距離 |
7 | 光学 | 最小クラスターメンバーシップ | 非常に大きなn_samplesと大きなn_clusters。 | ポイント間の距離。 |
8 | バーチ | しきい値、分岐係数 | ラージn_samplesラージn_clusters | ポイント間のユークリッド距離。 |
Scikit-learnDigitデータセットでのK-Meansクラスタリング
この例では、数字データセットにK-meansクラスタリングを適用します。このアルゴリズムは、元のラベル情報を使用せずに類似した数字を識別します。実装はJupyterノートブックで行われます。
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
出力
1797, 64)
この出力は、数字データセットに64個の特徴を持つ1797個のサンプルがあることを示しています。
例
ここで、次のようにK-Meansクラスタリングを実行します-
kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
出力
(10, 64)
この出力は、K-meansクラスタリングが64の機能を持つ10のクラスターを作成したことを示しています。
例
fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks = [], yticks = [])
axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)
出力
以下の出力には、K-Meansクラスタリングによって学習されたクラスター中心を示す画像があります。
次に、以下のPythonスクリプトは、学習したクラスターラベル(K-Meansによる)を、それらに含まれる実際のラベルと照合します-
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]
下記のコマンドを使用して精度を確認することもできます。
from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)
出力
0.7935447968836951
完全な実装例
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks=[], yticks = [])
axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]
from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)