K-meansクラスタリングは、教師なし学習アルゴリズムであり、中心点までの各点のユークリッド距離に基づいてデータをグループ化します。 重心。 重心は、同じクラスター内にあるすべてのポイントによって定義されます。 アルゴリズムは、最初に重心としてランダムな点を選択し、次に完全に収束するまでそれらの調整を繰り返します。
K-meansを使用するときに覚えておくべき重要なことは、クラスターの数はハイパーパラメーターであり、モデルを実行する前に定義されるということです。
K-meansは、わずか3行のコードでScikit-Learnを使用して実装できます。 Scikit-learnには、すでに重心最適化手法があります。 kmeans ++、それはモデルがより速く収束するのを助けます。
K-meansクラスタリングアルゴリズムを適用するには、 パーマーペンギン データセット、クラスター化される列を選択し、Seabornを使用して色分けされたクラスターで散布図をプロットします。
ライブラリをインポートして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メソッドが参照にすぎないことを示しています。 データセットに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);
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、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');
K-meansクラスタリングを使用する場合は、クラスターの数を事前に決定する必要があります。 方法を使用して選択するときに見たように k クラスターの数、結果は単なる提案であり、データの分散の量によって影響を受ける可能性があります。 クラスタリングの際には、詳細な分析を行い、_k_sが異なる複数のモデルを生成することが重要です。
データに含まれるクラスターの数が事前に示されていない場合は、データを視覚化し、テストして解釈し、クラスタリングの結果に意味があるかどうかを確認します。 そうでない場合は、再度クラスター化します。 また、複数のメトリックを調べて、さまざまなクラスタリングモデルをインスタンス化します。K-meansの場合は、シルエットスコアと、場合によっては階層的クラスタリングを調べて、結果が同じであるかどうかを確認します。