๐Ÿ“—Lab 2

Bagaimana jika data non-linear?

Pengantar

Pada pratikum sebelumnya kita telah mengetahui proses klasterisasi dengan menggunakan metode KMeans. Kebetulan, data yang digunakan dapat dengan mudah dipisahkan secara linear. Bagaimana jika data tidak dalam bentuk sebaran yang dapat dipisahkan secara linier (setidaknya pada visualisasi 2 dimensi)?

Originaly from GeeksforGeeks

KMeans tidak dapat melakukan tugas ini dengan baik. Oleh karena itu, pada praktikum ini, kita akan menggunakan algoritma DBSCAN untuk melakukan klasterisasi pada data non-linear.

Langkah 0 - Import Library

Import library yang dibutuhkan

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

Langkah 1 - Membuat Dataset Sintentis

Kali ini kita akan membuat data sintentis untuk tujuan pembelajaran. Data yang akan kita buat akan berbentuk spiral untuk menyimulasikan kondisi non linear.

from sklearn.datasets import make_moons

X, y = make_moons(200, noise=.05, random_state=0)

Lakukan proses plotting data untuk mengetahui hasil dataset yang telah dibuat.

plt.scatter(X[:, 0], X[:, 1])

Maka Anda akan mendapatkan hasil,

Jika diamati secara visual, terdapat dua cluster di dalam dataset. Namun apakah KMeans dapat bekerja dengan baiki dalam kasus ini, mari kita buktikan.

Langkah 2 - Klasterisasi dengan K-Means

Buat model KMeans dan lakukan plotting ulang hasil klasterisasi

from sklearn.cluster import KMeans

kmeans = KMeans(2, random_state=0)
cluster = kmeans.fit_predict(X)

plt.scatter(X[:, 0], X[:, 1], c=cluster, s=50, cmap='viridis')

Anda akan mendapatkan hasil seperti,

Terdapat beberapa data yang tidak terklasterisasi secara tepat. Anda dapat dengan mudah membayangkan garis imager linear yang digunakan untuk memisahkan 2 cluster data. Lakukan evaluasi lebih lanjut dengan menggunakan silhouette coefficient.

from sklearn.metrics import silhouette_score

print(silhouette_score(X, cluster))

Anda akan mendapatkan nilai berkisar,

0.49215648268306905

Nilai ini menunjukkan bahwa data tidak terklasterisasi dengan cukup baik.

Langkah 3 - Klasterisasi dengan DBSCAN

Selanjutnya, kita akan melakukan klasterisasi dengan DBSCAN. Ingat, DBSCAN sangat sensitif terhadap parameter epsilon dan minimal sampel!

from sklearn.cluster import DBSCAN

dbscan = DBSCAN(eps=0.3, min_samples=2)
cluster_db = dbscan.fit_predict(X)

plt.scatter(X[:, 0], X[:, 1], c=cluster_db, s=50, cmap='viridis')

Hasilnya adalah,

Berdasarkan scatterplot, data dapat terklasterisasi dengan sangat baik. Untuk memastikannya, kita perlu melakukan evaluasi kembali dengan silhouette score.

from sklearn.metrics import silhouette_score

print(silhouette_score(X, cluster_db))

# Hasil 0.32585318950197517

Hasil silhouette score menunjukkan hasil yang tidak optimal. Padahal cluster terbentuk dengan baik secara visual. Mengapa demikian? Silhouette coefficient berasumsi cluster dapat terpisah dengan baik dalam bentuk linier, sehingga jika bentuknya distribusi data acak, evaluasi silhouette coefficient tidak dapat bekerja dengan baik. Lalu evaluasi apa yang bisa kita lakukan? Secara sederhana,

  1. Prosentase data noise

  2. Inspeksi visual

Secara metric dapat menggunakan,

  1. Davies-Bouldin Index (DBI) --> fokus pada separasi indeks, semakin kecil semakin baik, rentang 0 hingga tak hingga.

from sklearn.metrics import davies_bouldin_score

# Compute and print Davies-Bouldin Index
db = davies_bouldin_score(X, cluster_db)

print(f"Davies-Bouldin Index: {db}")

# Hasilnya
# Davies-Bouldin Index: 1.1622685374061352

Last updated