Sejauh ini section Klasifikasi bekerja pada dunia dua kelas: email ham melawan spam. Namun kotak masuk Gmail sesungguhnya memilah email ke empat kategori, sistem kredit membagi nasabah ke tiga tingkat risiko, dan model botani membedakan puluhan spesies. Pertanyaannya tajam: algoritme yang lahir sebagai pengklasifikasi binier — satu garis pemisah, satu sigmoid — bagaimana cara memutuskan di antara tiga kelas atau lebih? Jawabannya ada tiga strategi rakitan klasik plus satu pendekatan natif, dan pemilihan strateginya memengaruhi jumlah model yang dilatih, probabilitas yang dihasilkan, hingga akurasi akhir. Chapter penutup ini membongkar semuanya pada dataset iris dengan tiga spesies bunga.

Tiga Strategi Menaklukkan Banyak Kelas #

Strategi paling gamblang adalah one-vs-rest (OvR): latih K model binier terpisah — “setosa melawan semuanya”, “versicolor melawan semuanya”, “virginica melawan semuanya”. Saat prediksi, setiap model memberi skor kepercayaan kelasnya, dan kelas dengan skor tertinggi menang. Strategi ini mudah dipahami dan sejalan dengan semua algoritme binier, tetapi tiap model menghadapi data tidak seimbang (satu kelas vs gabungan K-1 kelas lain).

Strategi kedua, one-vs-one (OvO), melatih satu model binier untuk setiap pasangan kelas: setosa-vs-versicolor, setosa-vs-virginica, versicolor-vs-virginica. Prediksi diambil lewat voting antar-pasangan. Jumlah modelnya tumbuh kuadratik — K(K-1)/2 — sehingga 3 kelas membutuhkan 3 model, tetapi 10 kelas membutuhkan 45. Kebalikannya, tiap model kecil: hanya melatih data dua kelas yang bersangkutan, sehingga total komputasi bisa lebih ringan untuk algoritme mahal seperti SVM.

Jalur ketiga adalah multinomial: satu model tunggal yang memprediksi seluruh kelas sekaligus. Regresi logistik multinomial mengganti sigmoid dengan fungsi softmax — generalisasi sigmoid yang mengubah vektor skor K kelas menjadi distribusi probabilitas:

text
softmax(z)_k = e^(zk) / Σj e^(zj)

Pembilang meng-eksponensialkan skor kelas k; penyebut menjumlahkan seluruh kelas agar hasilnya tepat berjumlah 1. Jaringan saraf modern memakai softmax yang persis sama di lapisan keluarannya.

| Strategi | Jumlah model (K kelas) | Contoh K=3 / K=10 | Kapan dipakai | |—|—|—| | One-vs-rest (OvR) | K | 3 / 10 | Umum, cocok untuk hampir semua estimator binier | | One-vs-one (OvO) | K(K-1)/2 | 3 / 45 | Algoritme mahal per sampel (mis. SVC kernel) | | Multinomial | 1 | 1 / 1 | LogisticRegression, jaringan saraf |

predict_proba pada Multiclass #

Pada klasifikasi binier, predict_proba mengembalikan dua kolom yang saling melengkapi. Pada multiclass, ia mengembalikan K kolom yang berjumlah tepat 1 per baris — hasil softmax. Metode decision_function memperlihatkan bahan bakarnya: matriks berbentuk (jumlah sampel, jumlah kelas) berisi skor mentah per kelas. Mari kita buktikan hubungan keduanya sekaligus membandingkan OvR dengan multinomial:

python
# Klasifikasi multiclass: multinomial/softmax vs one-vs-rest pada dataset iris.
# Tiga kelas target: setosa, versicolor, virginica.

import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.multiclass import OneVsRestClassifier

iris = load_iris()
X, y = iris.data, iris.target
nama_kelas = iris.target_names  # setosa, versicolor, virginica

X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

print("Jumlah sampel per kelas di data latih:")
for nama, jumlah in zip(nama_kelas, np.bincount(y_latih)):
    print(f"  {nama:<11} {jumlah}")

# LogisticRegression dengan solver lbfgs: multinomial natif (satu model,
# softmax untuk 3 kelas sekaligus).
model = LogisticRegression(max_iter=200, random_state=42)
model.fit(X_latih, y_latih)
print(f"\nAkurasi multinomial (45 sampel uji) : {model.score(X_uji, y_uji):.3f}")

# decision_function: satu skor mentah per kelas untuk setiap sampel.
skor = model.decision_function(X_uji[:3])
print(f"Bentuk decision_function untuk 3 sampel: {skor.shape}")


def softmax(z):
    """Softmax stabil: kurangi nilai terbesar tiap baris sebelum eksponensial."""
    e = np.exp(z - z.max(axis=1, keepdims=True))
    return e / e.sum(axis=1, keepdims=True)


# Verifikasi: softmax(decision_function) harus identik dengan predict_proba.
proba = model.predict_proba(X_uji[:3])
print("\n3 sampel uji pertama -- softmax manual vs predict_proba:")
for i in range(3):
    manual = softmax(skor[i:i + 1])[0]
    print(f"  sampel {i} -> prediksi {nama_kelas[model.predict(X_uji[i:i + 1])[0]]}")
    for j, nama in enumerate(nama_kelas):
        print(f"    {nama:<11} manual {manual[j]:.4f}   API {proba[i][j]:.4f}")
    print(f"    jumlah baris probabilitas : {proba[i].sum():.3f}")

# OneVsRestClassifier: merakit K model binier secara eksplisit.
ovr = OneVsRestClassifier(LogisticRegression(max_iter=200, random_state=42))
ovr.fit(X_latih, y_latih)
print(f"\nAkurasi OneVsRestClassifier        : {ovr.score(X_uji, y_uji):.3f}")
print(f"Jumlah model binier di dalamnya     : {len(ovr.estimators_)}")

Output yang Dihasilkan:

text
Jumlah sampel per kelas di data latih:
  setosa      35
  versicolor  35
  virginica   35

Akurasi multinomial (45 sampel uji) : 0.933
Bentuk decision_function untuk 3 sampel: (3, 3)

3 sampel uji pertama -- softmax manual vs predict_proba:
  sampel 0 -> prediksi virginica
    setosa      manual 0.0000   API 0.0000
    versicolor  manual 0.0323   API 0.0323
    virginica   manual 0.9677   API 0.9677
    jumlah baris probabilitas : 1.000
  sampel 1 -> prediksi versicolor
    setosa      manual 0.0045   API 0.0045
    versicolor  manual 0.7638   API 0.7638
    virginica   manual 0.2317   API 0.2317
    jumlah baris probabilitas : 1.000
  sampel 2 -> prediksi versicolor
    setosa      manual 0.0009   API 0.0009
    versicolor  manual 0.5056   API 0.5056
    virginica   manual 0.4935   API 0.4935
    jumlah baris probabilitas : 1.000

Akurasi OneVsRestClassifier        : 0.889
Jumlah model binier di dalamnya     : 3

Mari kita telaah baris-baris kode di atas:

  1. Baris 10–16 (muat iris dan split): dataset iris berisi 150 bunga, empat fitur pengukuran, dan tiga spesies; stratify=y menjaga ketiga spesies terwakili seimbang di data uji.
  2. Baris 18–20 (np.bincount): menghitung anggota tiap kelas di data latih — pemeriksaan cepat keseimbangan yang selalu layak dilakukan sebelum melatih.
  3. Baris 24–26 (LogisticRegression): satu objek model tunggal; solver lbfgs (bawaan) melatih softmax multinomial atas tiga kelas sekaligus, tanpa perakit khusus.
  4. Baris 29–30 (decision_function): bentuk keluaran (3, 3) berarti 3 sampel × 3 skor kelas — bahan mentah sebelum softmax.
  5. Baris 33–36 (softmax): implementasi manual memakai trik stabilitas numerik (mengurangi nilai terbesar baris sebelum eksponensial) agar tidak meluap untuk skor besar.
  6. Baris 39–47 (verifikasi): softmax dari decision_function dicetak berdampingan dengan predict_proba untuk tiga sampel uji, beserta jumlah tiap baris.
  7. Baris 49–53 (OneVsRestClassifier): perakit OvR eksplisit membungkus classifier binier apa pun; atribut estimators_ membocorkan berapa model binier yang dibangun.

Hasil verifikasinya rapi: sembilan pasangan angka softmax-manual vs predict_proba identik hingga empat desimal, dan setiap baris probabilitas berjumlah tepat 1,000. Probabilitas juga kini terbaca sebagai cerita: sampel pertama nyaris pasti virginica (0,9677); sampel kedua condong versicolor (0,7638); sampel ketiga nyaris seri — 0,5056 lawan 0,4935 — dan label keras “versicolor” hanyalah kemenangan tipis yang layak dicurigai. Inilah alasan probabilitas sering lebih berharga daripada label keras: model bisa mengatakan seberapa yakin dirinya.

Perbandingan strategi juga memperlihatkan perbedaan nyata. Model multinomial mencapai akurasi 0,933 pada 45 sampel uji; perakit OvR atas classifier yang sama mencapai 0,889 dengan tiga model binier di dalamnya. Keduanya dilatih pada data yang persis sama — perbedaannya murni strategi rakitan. Tidak ada yang selalu menang: multinomial mengoptimalkan seluruh kelas bersama, sementara OvR memberi ruang bagi tiap kelas untuk dilatih fokus, tetapi menghadapi kelas “rest” yang besar dan tidak seimbang.

Satu tema menutup section ini: pada data iris yang seimbang (35 banding 35 banding 35 di data latih), akurasi adalah ringkasan yang wajar. Namun ketika kelas nyata tidak seimbang — fraud yang hanya 0,1% transaksi — angka akurasi bisa menyesatkan, dan pertanyaan evaluasi berubah sama sekali. Chapter Prinsip Evaluasi Model, pembuka Section Evaluasi dan Validasi Model, membedah kerangka pengukuran yang tepat untuk situasi seperti itu.

Referensi Resmi #