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:
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:
# 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:
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 : 3Mari kita telaah baris-baris kode di atas:
- Baris 10–16 (muat iris dan split): dataset iris berisi 150 bunga, empat fitur pengukuran, dan tiga spesies;
stratify=ymenjaga ketiga spesies terwakili seimbang di data uji. - Baris 18–20 (
np.bincount): menghitung anggota tiap kelas di data latih — pemeriksaan cepat keseimbangan yang selalu layak dilakukan sebelum melatih. - Baris 24–26 (
LogisticRegression): satu objek model tunggal; solverlbfgs(bawaan) melatih softmax multinomial atas tiga kelas sekaligus, tanpa perakit khusus. - Baris 29–30 (
decision_function): bentuk keluaran(3, 3)berarti 3 sampel × 3 skor kelas — bahan mentah sebelum softmax. - Baris 33–36 (
softmax): implementasi manual memakai trik stabilitas numerik (mengurangi nilai terbesar baris sebelum eksponensial) agar tidak meluap untuk skor besar. - Baris 39–47 (verifikasi): softmax dari
decision_functiondicetak berdampingan denganpredict_probauntuk tiga sampel uji, beserta jumlah tiap baris. - Baris 49–53 (
OneVsRestClassifier): perakit OvR eksplisit membungkus classifier binier apa pun; atributestimators_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 #
- Multiclass strategies — scikit-learn User Guide — dokumentasi resmi OvR, OvO, dan perilaku bawaan tiap estimator.
- sklearn.linear_model.LogisticRegression — API
— rincian multinomial dan metode
predict_proba. - sklearn.multiclass.OneVsRestClassifier — API — perakit OvR eksplisit yang dipakai pada contoh.
- sklearn.datasets.load_iris — API — spesifikasi dataset iris.