Regresi Logistik

LogisticRegression sebagai classifier linear yang namanya mengandung kata regresi.

Daftar isi

LogisticRegression adalah classifier, yaitu model yang memprediksi label kelas, meskipun namanya memuat kata regresi. Nama itu berasal dari cara model bekerja, yaitu memodelkan probabilitas setiap kelas sebagai fungsi matematis dari fitur melalui fungsi logistik. Topik ini membahas mekanisme probabilitas tersebut, hubungan antara metode predict dan predict_proba, pembacaan koefisien pada fitur yang distandardisasi, serta parameter C sebagai kebalikan kekuatan regularisasi. Seluruh contoh dijalankan pada dataset iris dan breast_cancer bawaan scikit-learn, sehingga setiap angka pada keluarannya dapat direproduksi ulang.

Fungsi logistik dan probabilitas kelas#

Regresi logistik menghitung satu skor linear dari fitur, sama seperti regresi linear, kemudian mengubah skor itu menjadi probabilitas. Perubahannya dilakukan oleh fungsi logistik (logistic function), yaitu fungsi bernilai antara 0 dan 1 dengan bentuk kurva S:

σ(z)=11+e−z \sigma(z) = \frac{1}{1 + e^{-z}}

dengan z z berupa kombinasi linear fitur, yaitu z=w1x1+w2x2+⋯+wpxp+b z = w_1 x_1 + w_2 x_2 + \cdots + w_p x_p + b . Pada masalah dua kelas, probabilitas kelas positif dinyatakan sebagai P(y=1∣x)=σ(z) P(y = 1 \mid x) = \sigma(z) , sedangkan probabilitas kelas satunya adalah sisanya. Kelas yang diprediksi adalah kelas dengan probabilitas terbesar, sehingga batas keputusannya terletak pada titik ketika probabilitas kedua kelas sama besar, yaitu σ(z)=0,5 \sigma(z) = 0{,}5 .

Pada masalah dengan lebih dari dua kelas, scikit-learn menggunakan pendekatan multinomial, yaitu menghitung satu skor linear per kelas kemudian menormalkan seluruh skor dengan fungsi softmax, sehingga jumlah probabilitas setiap kelas selalu satu. Skor linear pada setiap kelas disimpan dalam atribut coef_, satu baris untuk satu kelas. Karena keluaran akhirnya berupa kelas dan bukan angka kontinu, LogisticRegression diperlakukan sebagai classifier penuh dan menerima seluruh antarmuka klasifikasi scikit-learn, termasuk predict, predict_proba, dan score yang mengembalikan akurasi.

Prediksi kelas dan probabilitasnya#

Metode predict mengembalikan label kelas, sedangkan predict_proba mengembalikan array probabilitas dengan satu kolom untuk setiap kelas. Nilai predict sesungguhnya hanyalah argmax dari predict_proba, yaitu indeks kolom dengan probabilitas terbesar. StandardScaler dan LogisticRegression dirangkai dalam satu pipeline agar data uji ditransformasi dengan statistik yang dipelajari dari data latih saja. Program berikut melatih model tersebut pada data iris, kemudian membandingkan kedua metode itu pada tiga sampel data uji.

python regresi-logistik-iris.py
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.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.25, stratify=iris.target, random_state=42
)

# regresi logistik dilatih di atas fitur yang distandardisasi
model = make_pipeline(
    StandardScaler(),
    LogisticRegression(max_iter=1000),
)
model.fit(X_train, y_train)

print("Akurasi data uji :", round(model.score(X_test, y_test), 3))
print()

# probabilitas kelas untuk tiga sampel pertama pada data uji
proba = model.predict_proba(X_test[:3])
prediksi = model.predict(X_test[:3])
for i in range(3):
    p = proba[i]
    print(f"Sampel {i}: kelas sebenarnya={iris.target_names[y_test[i]]}, "
          f"prediksi={iris.target_names[prediksi[i]]}")
    print("  probabilitas :", np.round(p, 3))
    print("  argmax =", int(np.argmax(p)),
          "| sama dengan prediksi:", int(np.argmax(p)) == int(prediksi[i]))
text Keluaran
Akurasi data uji : 0.921

Sampel 0: kelas sebenarnya=setosa, prediksi=setosa
  probabilitas : [0.985 0.015 0.   ]
  argmax = 0 | sama dengan prediksi: True
Sampel 1: kelas sebenarnya=versicolor, prediksi=versicolor
  probabilitas : [0.034 0.621 0.345]
  argmax = 1 | sama dengan prediksi: True
Sampel 2: kelas sebenarnya=versicolor, prediksi=versicolor
  probabilitas : [0.045 0.882 0.072]
  argmax = 1 | sama dengan prediksi: True

Keluaran memperlihatkan perbedaan informasi yang dibawa kedua metode. predict hanya menyatakan setosa atau versicolor, sedangkan predict_proba menunjukkan seberapa yakin modelnya. Sampel 0 diprediksi setosa dengan probabilitas 0.985, yang berarti model hampir pasti. Sampel 1 juga diprediksi versicolor, tetapi dengan probabilitas 0.621 berhadapan dengan 0.345 pada kelas virginica, sehingga prediksinya berada dekat dengan batas keputusan. Keadaan model pada setiap prediksi dapat diperiksa dari jarak probabilitas terbesar dan terbesar kedua, dan informasi semacam ini hilang apabila hanya label akhir yang dibaca.

Koefisien dan standardisasi fitur#

Atribut coef_ memuat bobot setiap fitur pada skor linear. Bobot tersebut menunjukkan arah pengaruh, yaitu koefisien positif menaikkan skor kelas positif ketika fiturnya naik, sedangkan koefisien negatif menurunkannya. Namun perbandingan besaran antarkoefisien baru bermakna apabila seluruh fitur berada pada skala yang sebanding. StandardScaler mengubah setiap fitur menjadi rata-rata nol dan simpangan baku satu, sehingga satu satuan perubahan berarti hal yang sama untuk semua fitur dan magnitud koefisien dapat dibandingkan secara langsung.

Program berikut mencari tiga koefisien absolut terbesar pada dataset breast_cancer yang seluruh fiturnya distandardisasi di dalam pipeline. Koefisien yang dibaca adalah baris milik kelas 1 karena masalahnya hanya memuat dua kelas.

python Contoh: koefisien terbesar pada fitur terstandardisasi
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

bc = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    bc.data, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)

model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
model.fit(X_train, y_train)

koef = model[-1].coef_[0]
urut = np.argsort(np.abs(koef))[::-1][:3]
print("Tiga koefisien absolut terbesar (fitur terstandardisasi):")
for idx in urut:
    print(f"  {bc.feature_names[idx]:<25} {koef[idx]:+.3f}")
text Keluaran
Tiga koefisien absolut terbesar (fitur terstandardisasi):
  worst texture             -1.250
  radius error              -1.070
  worst symmetry            -0.957

Ketiga fitur teratas bermuatan negatif. Karena kelas 1 pada dataset ini adalah jaringan jinak, koefisien negatif berarti kenaikan fitur tersebut mendorong prediksi ke arah jinak. Pembacaan semacam ini hanya sah karena fitur telah distandardisasi. Tanpa StandardScaler, fitur yang berskala besar seperti worst area yang bergerak hingga ribuan akan memperoleh koefisien kecil secara mekanis, sedangkan fitur berskala kecil memperoleh koefisien besar. Urutan magnitud pada data mentah hanya menggambarkan satuan pengukuran dan bukan kepentingan fiturnya.

C sebagai kebalikan kekuatan regularisasi#

LogisticRegression menerapkan regularisasi L2 secara bawaan, yaitu penalti yang dikenakan pada besaran kuadrat koefisien agar koefisien tidak membesar tanpa batas. Kekuatan penalti dikendalikan oleh parameter C, yang didefinisikan sebagai kebalikan dari kekuatan regularisasi. Nilai C kecil berarti penalti kuat, sehingga koefisien ditekan dan model menjadi sederhana. Nilai C besar berarti penalti lemah, sehingga model bebas menyesuaikan data latih sekuat mungkin. Hubungan ini berlawanan dengan parameter alpha pada model regularisasi lain, dan kesalahpahaman arahnya sering membuat penyetelan parameter berjalan ke arah yang keliru.

python Contoh: pengaruh C terhadap akurasi train dan test
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

bc = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    bc.data, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)

for c in [0.01, 0.1, 1.0, 10.0, 100.0]:
    model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000, C=c))
    model.fit(X_train, y_train)
    akurasi_train = model.score(X_train, y_train)
    akurasi_test = model.score(X_test, y_test)
    print(f"C={c:>6}: train={akurasi_train:.3f}, test={akurasi_test:.3f}")
text Keluaran
C=  0.01: train=0.958, test=0.937
C=   0.1: train=0.984, test=0.979
C=   1.0: train=0.988, test=0.986
C=  10.0: train=0.991, test=0.972
C= 100.0: train=0.998, test=0.944

Pola pada keluaran sesuai dengan teorinya. Akurasi data latih naik terus seiring membesarnya C, karena semakin lemah penalti yang menahan model. Akurasi data uji justru mencapai puncaknya pada C=1.0, kemudian menurun pada C=10.0 dan C=100.0, ketika model mulai menyesuaikan kebisingan data latih. Keadaan ketika skor train naik tetapi skor test menurun disebut overfitting, yaitu kondisi model yang terlalu menempel pada data latih sehingga kemampuannya pada data baru menurun. Nilai C terbaik tidak dapat ditebak dari teori dan perlu dicari dengan evaluasi berulang, sehingga prosedur cross-validation yang diulas pada modul tersendiri menjadi alat yang tepat untuk pekerjaan ini.

Kesalahan umum#

Kesalahan pertama adalah menggunakan LogisticRegression untuk memprediksi nilai numerik kontinu karena terkecoh namanya. Kelas ini adalah classifier yang keluarannya berupa label dan probabilitas kelas, sedangkan pemodelan target kontinu menjadi tugas regresi linear dan turunannya yang diulas pada modul Regresi. Salah kaprah ini muncul pada hampir setiap pemula karena kata regresi terdengar seperti pembahasan modul tersebut.

Kesalahan kedua adalah membaca magnitud koefisien pada fitur yang belum distandardisasi. Koefisien pada data mentah mencerminkan satuan pengukuran setiap fitur, sehingga fitur berskala besar memperoleh bobot kecil tanpa berarti fitur itu tidak penting. Standardisasi di dalam pipeline menjaga perbandingan koefisien tetap adil.

Kesalahan ketiga adalah mengabaikan ConvergenceWarning dan langsung membaca skor. Model yang belum konvergen masih menghasilkan prediksi, tetapi parameternya belum optimum, sehingga hasilnya tidak dapat direproduksi dengan konsisten ketika pelatihan diulang dengan pengaturan serupa. Memperlakukan peringatan sebagai bagian dari pemeriksaan rutin menjaga hasil eksperimen tetap dapat dipercaya.

Ringkasan#

  • LogisticRegression adalah classifier linear yang mengubah skor kombinasi linear fitur menjadi probabilitas kelas melalui fungsi logistik, dan softmax pada masalah lebih dari dua kelas.
  • predict mengembalikan kelas dengan probabilitas terbesar, sedangkan predict_proba mengungkap seberapa yakin modelnya terhadap prediksi itu.
  • Koefisien antarfitur baru sebanding apabila fitur distandardisasi terlebih dahulu, misalnya dengan StandardScaler di dalam pipeline.
  • Parameter C adalah kebalikan kekuatan regularisasi L2, dan nilai terbaiknya dicari melalui evaluasi pada data uji atau cross-validation.

Referensi#