Elbow メソッドによる K-Means クラスタリング PlatoBlockchain Data Intelligence。垂直検索。あい。

エルボー法によるK-Meansクラスタリング

K-meansクラスタリングは、教師なし学習アルゴリズムであり、中心点までの各点のユークリッド距離に基づいてデータをグループ化します。 重心。 重心は、同じクラスター内にあるすべてのポイントによって定義されます。 アルゴリズムは、最初に重心としてランダムな点を選択し、次に完全に収束するまでそれらの調整を繰り返します。

K-meansを使用するときに覚えておくべき重要なことは、クラスターの数はハイパーパラメーターであり、モデルを実行する前に定義されるということです。

K-meansは、わずか3行のコードでScikit-Learnを使用して実装できます。 Scikit-learnには、すでに重心最適化手法があります。 kmeans ++、それはモデルがより速く収束するのを助けます。

K-meansクラスタリングアルゴリズムを適用するには、 パーマーペンギン データセット、クラスター化される列を選択し、Seabornを使用して色分けされたクラスターで散布図をプロットします。

Note:ここからデータセットをダウンロードできます .

ライブラリをインポートしてPenguinsデータセットをロードし、選択した列にトリミングして、データが欠落している行を削除してみましょう(2つしかありませんでした)。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df = pd.read_csv('penguins.csv')
print(df.shape) 
df = df[['bill_length_mm', 'flipper_length_mm']]
df = df.dropna(axis=0)

Elbowメソッドを使用して、データのクラスターを示すことができます。 これは、肘の形をした折れ線グラフの解釈で構成されています。 クラスターの数は肘の曲がりです。 プロットのx軸はクラスターの数であり、y軸はクラスターの数ごとのクラスター内の二乗和(WCSS)です。

wcss = []

for i in range(1, 11):
    clustering = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering.fit(df)
    wcss.append(clustering.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss);

elbowメソッドは、データに2つのクラスターがあることを示しています。 クラスタリングの前後のデータをプロットしてみましょう。

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without clustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('Using the elbow method');

Elbow メソッドによる K-Means クラスタリング PlatoBlockchain Data Intelligence。垂直検索。あい。

この例は、クラスターの数を選択するために使用される場合に、Elbowメソッドが参照にすぎないことを示しています。 データセットに3種類のペンギンがいることはすでにわかっていますが、エルボー法を使用してペンギンの数を決定すると、2つのクラスターが結果になります。

K-meansはデータの分散に敏感であるため、クラスタリングしている列の記述統計を見てみましょう。

df.describe().T 

この結果:

 					count 	mean 		std 		min 	25% 	50% 	75% 	max
bill_length_mm 		342.0 	43.921930 	5.459584 	32.1 	39.225 	44.45 	48.5 	59.6
flipper_length_mm 	342.0 	200.915205 	14.061714 	172.0 	190.000 197.00 	213.0 	231.0

平均が標準偏差(std)から遠く離れていることに注意してください。これは、分散が大きいことを示しています。 Standard Scalerを使用してデータをスケーリングすることにより、それを減らしてみましょう。

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
scaled = ss.fit_transform(df)

次に、スケーリングされたデータに対してElbowメソッドプロセスを繰り返します。

wcss_sc = []

for i in range(1, 11):
    clustering_sc = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering_sc.fit(scaled)
    wcss_sc.append(clustering_sc.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss_sc);

Elbow メソッドによる K-Means クラスタリング PlatoBlockchain Data Intelligence。垂直検索。あい。

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

今回は、クラスターの推奨数は3です。比較のために、以前のXNUMXつのプロットとともに、クラスターラベルを使用してデータを再度プロットできます。

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without cliustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('With the Elbow method')
sns.scatterplot(ax=axes[2], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering_sc.labels_).set_title('With the Elbow method and scaled data');

Elbow メソッドによる K-Means クラスタリング PlatoBlockchain Data Intelligence。垂直検索。あい。

K-meansクラスタリングを使用する場合は、クラスターの数を事前に決定する必要があります。 方法を使用して選択するときに見たように k クラスターの数、結果は単なる提案であり、データの分散の量によって影響を受ける可能性があります。 クラスタリングの際には、詳細な分析を行い、_k_sが異なる複数のモデルを生成することが重要です。

データに含まれるクラスターの数が事前に示されていない場合は、データを視覚化し、テストして解釈し、クラスタリングの結果に意味があるかどうかを確認します。 そうでない場合は、再度クラスター化します。 また、複数のメトリックを調べて、さまざまなクラスタリングモデルをインスタンス化します。K-meansの場合は、シルエットスコアと、場合によっては階層的クラスタリングを調べて、結果が同じであるかどうかを確認します。

タイムスタンプ:

より多くの スタックアバス