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”.

JenisJumlah kelas per instanceContoh
BinierTepat satu dari 2 kelasEmail spam vs biasa
MulticlassTepat satu dari K kelasKategori email: utama/sosial/promosi
Multi-labelNol atau lebih dari K tagTag 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:

python
# 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:

text
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 -> ham

Mari kita telaah baris-baris kode di atas:

  1. Baris 9–13 (X dan y): 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.
  2. 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.
  3. 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.
  4. Baris 25–26 (predict_proba vs predict): metode pertama menghasilkan dua kolom probabilitas (ham, spam) yang berjumlah 1,0000; metode kedua memilih kelas dengan probabilitas terbesar.
  5. Baris 36–44 (p_spam dan label_ambang_60): label keras dihitung ulang secara manual dengan ambang 0,60 untuk membuktikan bahwa predict sesungguhnya adalah aturan ambang atas predict_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 #