K-means clustering adalah algoritma pembelajaran tanpa pengawasan yang mengelompokkan data berdasarkan jarak euclidean setiap titik ke titik pusat yang disebut pusat. Centroid didefinisikan dengan cara semua titik yang berada di cluster yang sama. Algoritme pertama-tama memilih titik-titik acak sebagai centroid dan kemudian melakukan iterasi untuk menyesuaikannya hingga konvergensi penuh.
Hal penting yang perlu diingat ketika menggunakan K-means, jumlah cluster adalah hyperparameter, akan ditentukan sebelum menjalankan model.
K-means dapat diimplementasikan menggunakan Scikit-Learn hanya dengan 3 baris kode. Scikit-learn juga sudah memiliki metode optimasi centroid yang tersedia, kmeans++, yang membantu model konvergen lebih cepat.
Untuk menerapkan algoritma pengelompokan K-means, mari kita memuat Penguin Palmer dataset, pilih kolom yang akan dikelompokkan, dan gunakan Seaborn untuk memplot scatterplot dengan cluster kode warna.
Note: Anda dapat mengunduh kumpulan data dari ini link.
Mari impor perpustakaan dan muat kumpulan data Penguins, potong ke kolom yang dipilih dan hapus baris dengan data yang hilang (hanya ada 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)
Kita dapat menggunakan metode Elbow untuk memiliki indikasi cluster untuk data kita. Ini terdiri dari interpretasi plot garis dengan bentuk siku. Jumlah cluster adalah tikungan siku. Sumbu x dari plot adalah jumlah cluster dan sumbu y adalah Jumlah Kotak Dalam Cluster (WCSS) untuk setiap jumlah cluster:
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);
Metode siku menunjukkan data kami memiliki 2 cluster. Mari kita plot data sebelum dan sesudah clustering:
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');
Contoh ini menunjukkan bagaimana metode Elbow hanya menjadi acuan ketika digunakan untuk memilih jumlah cluster. Kita sudah tahu bahwa kita memiliki 3 jenis penguin dalam dataset, tetapi jika kita menentukan jumlahnya dengan menggunakan metode Elbow, 2 cluster akan menjadi hasil kita.
Karena K-means sensitif terhadap varians data, mari kita lihat statistik deskriptif dari kolom yang kita kelompokkan:
df.describe().T
Ini menghasilkan:
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
Perhatikan bahwa mean jauh dari standar deviasi (std), ini menunjukkan varians yang tinggi. Mari kita coba menguranginya dengan menskalakan data dengan Standard Scaler:
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
scaled = ss.fit_transform(df)
Sekarang, mari kita ulangi proses metode Elbow untuk data yang diskalakan:
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);
Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!
Kali ini, jumlah cluster yang disarankan adalah 3. Kita dapat memplot data dengan label cluster lagi bersama dengan dua plot sebelumnya untuk perbandingan:
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');
Saat menggunakan K-means Clustering, Anda harus terlebih dahulu menentukan jumlah cluster. Seperti yang telah kita lihat saat menggunakan metode untuk memilih k jumlah cluster, hasilnya hanya saran dan dapat dipengaruhi oleh jumlah varians dalam data. Penting untuk melakukan analisis mendalam dan menghasilkan lebih dari satu model dengan _k_s yang berbeda saat pengelompokan.
Jika tidak ada indikasi sebelumnya tentang berapa banyak cluster dalam data, visualisasikan, uji dan interpretasikan untuk melihat apakah hasil clustering masuk akal. Jika tidak, klaster lagi. Juga, lihat lebih dari satu metrik dan buat contoh model pengelompokan yang berbeda โ untuk K-means, lihat skor siluet dan mungkin Pengelompokan Hirarki untuk melihat apakah hasilnya tetap sama.