KMeans adalah satu metode unsupervised learning pada machine learning. Metode ini menentukan jumlah cluster sesuai dengan jumlah k yang dipilih. Proses KMeans secara manual, dapat dilihat pada tautan berikut,
Pada modul jobsheet ini, kita akan langsung mempraktikkan pembuatan model KMeans dengan menggunakan python. Untuk modul pertama ini, kita akan menggunakan contoh kasus yang sederhana, yaitu dengan menggunakan dataset iris. Sedangkan untuk modul kedua, kita akan melakukan clustering dengan lebih advance, yaitu reduksi warna dengan data gambar
// Persiapan data
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
df = pd.read_csv('Iris.csv')
df.head()
# Plot Data
# Karena data 4 dimensi, maka akan kita coba
# plot cluster berdasarkan Sepal Length dan Sepal Width saja
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s = 100)
Maka akan muncul tampilan seperti dibawah ini
<matplotlib.collections.PathCollection at 0x7b277bf5d5d0>
# Buat Model KMeans
# Kali ini kita coba menggunakan k=2 - anggap saja kita tidak tahu jumlah label ada 3 :)
from sklearn.cluster import KMeans
# Inisiasi obyek KMeans
cl_kmeans = KMeans(n_clusters=2)
# Fit dan predict model
y_kmeans = cl_kmeans.fit_predict(X)
# Plot hasi cluster berdasarkan Sepal Length dan Sepal Width
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s = 100, c=y_kmeans)
# Plot centroid
centers = cl_kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
Nanti akan muncul tampilan seperti dibawah ini
# Cek Nilai SSE
print(f'Nilai SSE: {cl_kmeans.inertia_}')
Nilai SSE: 152.36870647733906
# Implementasi Metode Elbow
# List nilai SSE
sse = []
# Cari k terbaik dari 1-10
K = range(1,10)
# Cek nilai SSE setiap k
for k in K:
kmeanModel = KMeans(n_clusters=k)
kmeanModel.fit(X)
sse.append(kmeanModel.inertia_)
# Plotting the distortions
plt.figure(figsize=(8,4))
plt.plot(K, sse, "bx-")
plt.xlabel("k")
plt.ylabel("SSE")
plt.title("Metode Elbow untuk Mengetahui Jumlah k Terbaik")
plt.show()
```
Nanti akan muncul tampilan seperti dibawah ini
# Cek Nilai SSE setiap k
for idx, sse_val in enumerate(sse, start=1):
print(f'k={idx}; SSE={sse_val}')