Regresi memprediksi angka kontinu seperti harga rumah; klasifikasi memprediksi kategori diskrit. Penyaring spam, misalnya, harus memutuskan setiap email masuk ke folder “spam” atau “biasa” — tidak ada hasil di antara keduanya. Chapter ini membuka Section Klasifikasi dengan tiga konsep dasar yang dipakai semua algoritme nanti: jenis-jenis masalah klasifikasi, gagasan batas keputusan di ruang fitur, dan perbedaan antara probabilitas kelas dan label keras. Kita akan memakai satu kisah berjalan sepanjang section ini: mendeteksi email spam dari dua fitur sederhana, jumlah tautan dan jumlah kata promosi.
Tiga Jenis Masalah Klasifikasi #
Bentuk paling sederhana adalah klasifikasi binier (binary classification): dua kelas yang saling berlawanan, misalnya spam vs bukan spam, pelanggan berhenti vs lanjut berlangganan, atau transaksi wajar vs mencurigakan. Model hanya perlu menjawab satu pertanyaan ya/tidak.
Ketika kelasnya lebih dari dua, masalahnya menjadi klasifikasi multiclass. Kategori email Gmail (utama, sosial, promosi, notifikasi) atau spesies bunga pada dataset iris adalah contohnya: setiap instance memilih tepat satu dari K kelas. Strategi merakit banyak model binier menjadi satu keputusan multiclass cukup menarik untuk dibahas pada chapter khusus di akhir section ini.
Bentuk ketiga, klasifikasi multi-label, berbeda dari dua lainnya: satu instance boleh membawa beberapa label sekaligus. Sebuah artikel berita dapat sekaligus bertag “ekonomi”, “politik”, dan “energi”. Struktur masalahnya bukan “pilih satu dari banyak”, melainkan “ya/tidak untuk setiap tag”.
| Jenis | Jumlah kelas per instance | Contoh |
|---|---|---|
| Binier | Tepat satu dari 2 kelas | Email spam vs biasa |
| Multiclass | Tepat satu dari K kelas | Kategori email: utama/sosial/promosi |
| Multi-label | Nol atau lebih dari K tag | Tag artikel berita |
Batas Keputusan dan Separabilitas Linier #
Algoritme klasifikasi pada dasarnya mempelajari sebuah batas keputusan (decision boundary): garis, kurva, atau bidang pemisah di ruang fitur. Titik di satu sisi batas diprediksi kelas A, titik di sisi lain diprediksi kelas B. Pada ruang dua dimensi — dua fitur, seperti jumlah tautan dan jumlah kata promosi — batas berbentuk garis dan mudah dibayangkan sebagai peta: wilayah kiri adalah wilayah email biasa, wilayah kanan adalah wilayah spam.
Sebuah dataset disebut dapat dipisahkan secara linier (linearly separable) jika ada garis lurus yang memisahkan kedua kelas tanpa satu pun titik salah tempat. Email nyata jarang semulus itu; wilayah kedua kelas biasanya tumpang-tindih di sekitar batas. Model linier seperti regresi logistik tetap bekerja pada data tumpang-tindih — yang berubah adalah keyakinan prediksinya, sebagaimana akan kita lihat sekarang.
Probabilitas Kelas vs Label Keras #
Sebagian besar classifier di scikit-learn menyediakan dua metode prediksi. Metode predict_proba mengembalikan probabilitas per kelas: angka antara 0 dan 1 yang jumlahnya tepat 1 untuk setiap baris. Metode predict mengembalikan label keras (hard label): keputusan final berupa nama kelas. Kedua metode ini terhubung lewat ambang (threshold) — secara bawaan, kelas dengan probabilitas terbesar dipilih, dan pada kasus binier ambangnya setara 0,5 pada probabilitas kelas positif.
Mari kita amati kedua metode tersebut pada 12 email yang jelas terpisahkan:
# Klasifikasi biner sederhana: memisahkan email biasa (ham) dari email spam.
# Data 12 email dengan dua fitur: jumlah tautan dan jumlah kata promosi.
import numpy as np
from sklearn.linear_model import LogisticRegression
# 12 email yang sudah dilabeli manusia.
# Fitur tiap email: [jumlah_tautan, jumlah_kata_promosi]
X = np.array([
[1, 2], [2, 1], [1, 5], [3, 2], [2, 4], [4, 3], # ham (label 0)
[8, 9], [9, 7], [7, 10], [10, 8], [8, 6], [9, 9], # spam (label 1)
])
y = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
model = LogisticRegression()
model.fit(X, y)
# Tiga email baru: jauh di wilayah ham, jauh di wilayah spam, dan di batas.
email_baru = np.array([
[1, 1], # jauh di wilayah ham
[9, 10], # jauh di wilayah spam
[5, 6], # dekat batas keputusan (decision boundary)
])
probabilitas = model.predict_proba(email_baru)
label = model.predict(email_baru)
print("Email (tautan, promosi) P(ham) P(spam) label")
for fitur, proba, lab in zip(email_baru, probabilitas, label):
status = "spam" if lab == 1 else "ham"
print(f"({fitur[0]:>2d}, {fitur[1]:>2d}) "
f"{proba[0]:.4f} {proba[1]:.4f} {status}")
# predict() memakai ambang bawaan 0.5 pada kolom P(spam).
# Ambang kustom, misalnya 0.60, membuat penyaring lebih berhati-hati:
# email yang ragu-ragu tidak langsung disebut spam.
p_spam = probabilitas[:, 1]
label_ambang_60 = np.where(p_spam >= 0.60, 1, 0)
print("\nPerbandingan ambang keputusan pada P(spam):")
for fitur, ps, bawaan, kustom in zip(email_baru, p_spam, label, label_ambang_60):
print(f"({fitur[0]:>2d}, {fitur[1]:>2d}) P(spam)={ps:.4f} "
f"ambang 0.5 -> {'spam' if bawaan else 'ham'} | "
f"ambang 0.6 -> {'spam' if kustom else 'ham'}")Output yang Dihasilkan:
Email (tautan, promosi) P(ham) P(spam) label
( 1, 1) 0.9978 0.0022 ham
( 9, 10) 0.0039 0.9961 spam
( 5, 6) 0.4959 0.5041 spam
Perbandingan ambang keputusan pada P(spam):
( 1, 1) P(spam)=0.0022 ambang 0.5 -> ham | ambang 0.6 -> ham
( 9, 10) P(spam)=0.9961 ambang 0.5 -> spam | ambang 0.6 -> spam
( 5, 6) P(spam)=0.5041 ambang 0.5 -> spam | ambang 0.6 -> hamMari kita telaah baris-baris kode di atas:
- Baris 9–13 (
Xdany): dua belas email dilabeli tangan — enam email biasa berkumpul di koordinat tautan/promosi rendah, enam email spam berkumpul di koordinat tinggi. Pola seperti inilah bahan belajar model. - Baris 15–16 (
LogisticRegression().fit): model linier mempelajari garis pemisah di ruang dua fitur. Kita belum membahas cara kerjanya — itu materi Chapter Regresi Logistik — cukup ketahui bahwa model tersebut menghasilkan probabilitas. - Baris 19–23 (
email_baru): tiga email uji dipilih sadar: satu jauh di wilayah ham, satu jauh di wilayah spam, satu tepat di dekat batas keputusan. - Baris 25–26 (
predict_probavspredict): metode pertama menghasilkan dua kolom probabilitas (ham, spam) yang berjumlah 1,0000; metode kedua memilih kelas dengan probabilitas terbesar. - Baris 36–44 (
p_spamdanlabel_ambang_60): label keras dihitung ulang secara manual dengan ambang 0,60 untuk membuktikan bahwapredictsesungguhnya adalah aturan ambang ataspredict_proba.
Pola pada output sangat bermakna. Email (1, 1) berada jauh di wilayah ham sehingga probabilitas spam hanya 0,0022 — model nyaris pasti. Email (9, 10) jauh di wilayah spam dengan probabilitas 0,9961. Adapun email (5, 6) jatuh tepat di dekat batas keputusan: probabilitasnya 0,5041, nyaris lempeng di angka 0,5, dan label kerasnya pun cuma menang tipis. Ketika ambang dinaikkan ke 0,60, hanya email di batas itu yang berubah keputusannya menjadi ham; dua email lainnya tidak terpengaruh karena probabilitasnya jauh dari ambang.
Di Mana Klasifikasi Muncul #
Pola masalah klasifikasi tersebar di hampir semua domain. Di komunikasi digital: penyaring spam dan kategori otomatis kotak masuk. Di bisnis: prediksi churn — pelanggan berlangganan yang diperkirakan berhenti — serta penilaian kredit lancar atau macet. Di kesehatan: klasifikasi hasil diagnosis dari gejala dan hasil laboratorium. Di dokumen: OCR yang mengenali tiap citra huruf menjadi karakter, dan deteksi bahasa sebuah teks. Semua contoh itu berbagi kerangka yang sama: fitur numerik masuk, satu kategori keluar.
Dengan kerangka tersebut, pertanyaan berikutnya alami: bagaimana persisnya sebuah model linier menghasilkan angka probabilitas seperti 0,5041? Jawabannya berupa satu fungsi matematika kecil bernama sigmoid, dan itulah pembuka Chapter Regresi Logistik.
Referensi Resmi #
- Logistic regression — scikit-learn User Guide — penjelasan resmi model linier untuk klasifikasi yang dipakai pada contoh chapter ini.
- sklearn.linear_model.LogisticRegression — API
— dokumentasi metode
predict_probadanpredict. - Multiclass strategies — scikit-learn User Guide — gambaran resmi strategi binier vs multiclass yang dirinci pada chapter akhir section ini.