Topik ini merumuskan masalah clustering, yaitu pengelompokan sampel ketika data tidak memiliki label sama sekali. Pembahasannya mencakup pergeseran arti kata “benar” dibandingkan pembelajaran berlabel, dua keluarga kriteria evaluasi yang tersedia, dan satu demonstrasi lengkap pada data tiga klaster buatan make_blobs. Setelah membacanya, hasil clustering dapat dinilai dengan ukuran yang tepat dan penomoran klasternya dapat dibaca dengan benar.
Arti kata benar yang berubah#
Supervised learning, yaitu pembelajaran yang menggunakan label, memiliki jawaban untuk setiap sampel, sehingga kualitas model diukur dengan membandingkan prediksi terhadap label yang sebenarnya. Pada clustering, kolom label itu tidak ada, sehingga pertanyaannya berubah dari “apakah prediksi sesuai jawaban” menjadi “apakah struktur yang ditemukan bermakna”. Tujuan clustering adalah menemukan struktur alami di dalam data, yaitu kelompok yang padat di dalamnya dan terpisah dari kelompok lain. Kata “benar” menjadi relatif terhadap kriteria yang dipilih, karena dua algoritma pada data yang sama dapat menghasilkan pembagian berbeda dan keduanya dapat dibela menurut kriteria masing-masing.
Perbedaan itu berlaku di seluruh kerangka kerja. Pemecahan train/test split, yaitu pembagian data menjadi bagian latih dan bagian uji untuk pengukuran terhadap target, kehilangan fungsinya karena targetnya tidak ada. Accuracy, precision, dan recall semuanya tidak terdefinisi. Model juga tidak menghasilkan prediksi label, melainkan penugasan kelompok, sehingga keluaran utamanya berupa struktur, seperti keanggotaan klaster dan letak pusat klaster.
Diagram berikut memperlihatkan perbedaannya. Pada data berlabel, setiap titik membawa jawabannya sendiri sehingga warnanya langsung menunjukkan kelompoknya. Pada data tanpa label, warna itu hilang, dan hanya sebaran titik yang tersedia sebagai petunjuk struktur.
Kriteria internal dan eksternal#
Karena tidak ada label, evaluasi clustering berjalan melalui dua jalur. Kriteria internal menilai hasil clustering hanya dari data itu sendiri, yaitu seberapa padat setiap klaster dan seberapa terpisah klaster yang satu dari yang lain. Ukuran kompaknya klaster seperti inertia, yakni jumlah kuadrat jarak setiap sampel ke pusat klasternya, dan ukuran bentuk seperti silhouette, yakni skor antara -1 dan 1 yang menilai kecocokan sebuah sampel dengan klasternya, termasuk dalam keluarga kriteria internal. Keduanya dihitung tanpa melihat jawaban apa pun dan merupakan satu-satunya pilihan pada data yang benar-benar tanpa label.
Kriteria eksternal digunakan apabila label kebetulan tersedia, misalnya karena sebagian data pernah dianotasi manusia, atau karena data dibuat dengan generator sintetis yang menyertakan label kebenaran. Ukuran eksternal yang umum adalah Adjusted Rand Index (ARI), yaitu ukuran kesepakatan dua pembagian berdasarkan pasangan sampel, yang bernilai 1.0 bila kesepakatannya penuh dan mendekati 0 bila kesepakatannya sekecil kebetulan. Pada topik ini ARI hanya digunakan sebagai penunjuk perbandingan, bukan sebagai metrik yang diajarkan mendalam, sebab di lapangan label pembanding jarang tersedia.
Demonstrasi pada data tiga klaster#
Demonstrasi berikut membuat 450 sampel dalam tiga klaster dengan make_blobs, lalu mengelompokkannya dengan KMeans berparameter n_clusters=3. Ukuran tiap klaster dicetak dengan np.bincount, yaitu fungsi NumPy yang menghitung banyaknya kemunculan setiap bilangan bulat nonnegatif, sehingga sebaran anggota tiap klaster terbaca langsung. Label asli dari generator hanya dicetak untuk ilustrasi dan tidak diberikan kepada model.
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score
# data tiga klaster tanpa label, y hanya disimpan untuk ilustrasi
X, y = make_blobs(n_samples=450, centers=3, cluster_std=1.2, random_state=42)
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10).fit(X)
label = kmeans.labels_
print("Bentuk data :", X.shape)
print("Ukuran hasil KMeans :", np.bincount(label))
print("Ukuran sebenarnya :", np.bincount(y))
print("ARI ilustratif :", round(adjusted_rand_score(y, label), 3))Bentuk data : (450, 2)
Ukuran hasil KMeans : [150 150 150]
Ukuran sebenarnya : [150 150 150]
ARI ilustratif : 1.0Tiga klaster hasil KMeans masing-masing berisi 150 sampel, persis seperti ukuran sebenarnya, dan ARI bernilai 1.0 karena pembagiannya sama dengan label generator. Hasil semirip ini wajar untuk data sintetis yang kelompoknya jelas dan seimbang, sedangkan data nyata biasanya menghasilkan kesepakatan parsial antara hasil clustering dan label apa pun yang kebetulan ada.
Penomoran klaster memerlukan perhatian tersendiri. Kode berikut menjalankan KMeans yang sama pada data yang sama dengan dua random_state berbeda, lalu membandingkan keduanya.
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score
X, _ = make_blobs(n_samples=450, centers=3, cluster_std=1.2, random_state=42)
km_a = KMeans(n_clusters=3, random_state=42, n_init=10).fit(X)
km_b = KMeans(n_clusters=3, random_state=7, n_init=10).fit(X)
print("10 label pertama A:", km_a.labels_[:10])
print("10 label pertama B:", km_b.labels_[:10])
print("ARI antara dua penomoran:", round(adjusted_rand_score(km_a.labels_, km_b.labels_), 3))10 label pertama A: [0 2 2 2 2 0 2 0 1 0]
10 label pertama B: [0 1 1 1 1 0 1 0 2 0]
ARI antara dua penomoran: 1.0Sepuluh label pertama berbeda antara kedua penjalanan, tetapi ARI di antara keduanya tetap 1.0. Artinya, keduanya menemukan pembagian yang sama persis dengan penomoran berbeda, misalnya kelompok yang disebut klaster 2 pada penjalanan pertama disebut klaster 1 pada penjalanan kedua. Nomor klaster hanyalah penanda kelompok tanpa makna tetap, sehingga perbandingan antarhasil clustering harus dilakukan dengan ukuran yang kebal permutasi seperti ARI.
Kesalahan umum#
Kesalahan pertama adalah membaca nomor klaster seperti kelas yang bermakna. Angka 0, 1, dan 2 pada label KMeans adalah penanda kelompok, bukan nama kelas, sehingga pernyataan “sampel masuk klaster 2” tetap memerlukan penafsiran terhadap isi klasternya.
Kesalahan kedua adalah membandingkan dua hasil clustering dengan mencocokkan labelnya satu per satu. Penomoran yang berbeda membuat dua hasil identik tampak bertentangan, sebagaimana demonstrasi kedua di atas. Perbandingan sebaiknya menggunakan ukuran kebal permutasi atau menyandingkan statistik internal seperti ukuran dan kepadatan tiap klaster.
Kesalahan ketiga adalah memaksakan kerangka evaluasi berlabel, misalnya memecah data menjadi train dan test untuk menguji akurasi clustering. Tanpa label, tidak ada yang dapat diuji pada bagian test, sehingga pemecahan semacam itu hanya mengurangi data yang tersedia bagi penemuan struktur.
Ringkasan#
- Clustering bekerja tanpa label, sehingga tujuannya menemukan kelompok yang padat dan terpisah, bukan mereproduksi jawaban.
- Evaluasi internal menilai kepadatan dan keterpisahan dari data itu sendiri, sedangkan evaluasi eksternal membandingkan hasil dengan label yang kebetulan ada, misalnya melalui ARI.
- Nomor klaster tidak bermakna tetap dan dapat berubah antarpenjalanan, sehingga perbandingan antarhasil memerlukan ukuran kebal permutasi.
- Ukuran tiap klaster dapat dibaca cepat dengan np.bincount.
Referensi#
- 2.3. Clustering — scikit-learn documentation — Gambaran umum algoritma clustering dan kriteria penilaiannya.
- Common pitfalls and recommended practices — scikit-learn documentation — Praktik evaluasi model yang jujur sebagai pembanding kerangka berlabel.
- sklearn.datasets.make_blobs — scikit-learn documentation — Generator data klaster sintetis yang digunakan pada demonstrasi.
- sklearn.cluster.KMeans — scikit-learn documentation — Dokumentasi KMeans yang digunakan sebagai alat clustering pada topik ini.