Regresi logistik atas kata

Model linear dengan fitur n-gram dan koefisien yang dapat dibaca.

Daftar isi

Regresi logistik adalah model diskriminatif yang mempelajari batas keputusan antarkelas secara langsung dari data, berbeda dari Naive Bayes yang memodelkan pembangkitan teks per kelas. Topik ini menjelaskan fungsi logistik dan proses pelatihannya, mendemokan LogisticRegression dari scikit-learn dengan fitur TF-IDF unigram dan bigram pada korpus ulasan film, serta menunjukkan cara membaca koefisien model. Setelah membacanya, model linear ini dapat dibangun, koefisiennya dapat dibaca, dan perilakunya dapat dibandingkan dengan Naive Bayes.

Model diskriminatif dengan fungsi logistik#

Regresi logistik menghitung satu skor linear untuk setiap dokumen. Skor tersebut berbentuk z=w⋅x+bz = w \cdot x + b, dengan xx menyatakan vektor fitur dokumen, ww bobot per fitur, dan bb bias. Fungsi logistik berikut memetakan skor ke selang antara 0 dan 1 sehingga dapat dibaca sebagai peluang kelas positif.

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

Pelatihan berarti mencari nilai ww dan bb yang meminimalkan rugi (loss) pada data latih, yaitu rugi log untuk prediksi peluang yang keliru. scikit-learn menambahkan regularisasi L2 secara default, dan parameter C mengatur kekuatannya secara terbalik: C kecil berarti regularisasi kuat sehingga bobot ditahan tetap kecil. Model ini disebut diskriminatif karena langsung memodelkan P(c∣d)P(c \mid d) tanpa perantara P(t∣c)P(t \mid c) sebagaimana model generatif.

Fitur unigram dan bigram#

Sebuah n-gram adalah barisan n kata berurutan. Unigram adalah kata tunggal, sedangkan bigram adalah pasangan kata yang berdampingan. Parameter ngram_range=(1, 2) pada TfidfVectorizer mengaktifkan keduanya, sehingga teks the worst movie menghasilkan unigram the, worst, dan movie, beserta bigram the worst dan worst movie. Negasi seperti tidak bagus yang lenyap pada bag of words kini tertangkap sebagai kolom tersendiri.

Harga dari fitur tambahan ini berupa jumlah kolom yang membengkak. Demo pada topik ini menghasilkan 109795 fitur dari korpus ulasan film, jauh melebihi 35255 fitur unigram pada demo Naive Bayes. Dua parameter penjaga diaktifkan pada demo, yaitu min_df=2 yang membuang fitur yang muncul hanya di satu dokumen dan sublinear_tf=True yang meredam pengulangan kata. Dengan penjaga tersebut, matriks tetap jarang dan pelatihan tetap ringan.

Demo pada korpus ulasan film#

Program berikut memakai pembagian data yang sama dengan demo Naive Bayes, yaitu 75:25 terstratifikasi dengan random_state=0. Setelah model dilatih, koefisien diurutkan dengan np.argsort untuk mencetak dua belas fitur dengan koefisien paling negatif dan paling positif. Simpan programnya sebagai regresi_logistik_demo.py dan jalankan dengan perintah python3 regresi_logistik_demo.py.

python regresi_logistik_demo.py
import warnings

warnings.filterwarnings("ignore")

import numpy as np
from nltk.corpus import movie_reviews
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

dokumen = [movie_reviews.raw(fid) for fid in movie_reviews.fileids()]
label = [movie_reviews.categories(fid)[0] for fid in movie_reviews.fileids()]

X_latih, X_uji, y_latih, y_uji = train_test_split(
    dokumen, label, test_size=0.25, random_state=0, stratify=label
)

vektor = TfidfVectorizer(ngram_range=(1, 2), min_df=2, sublinear_tf=True)
X_latih_v = vektor.fit_transform(X_latih)
X_uji_v = vektor.transform(X_uji)
print("Jumlah fitur (unigram + bigram):", len(vektor.get_feature_names_out()))

model = LogisticRegression(max_iter=1000, random_state=0)
model.fit(X_latih_v, y_latih)

prediksi = model.predict(X_uji_v)
nama_fitur = np.array(vektor.get_feature_names_out())
koef = model.coef_[0]
urut = np.argsort(koef, kind="stable")

print("Akurasi:", accuracy_score(y_uji, prediksi))
print()
print("12 koefisien paling negatif (mendorong kelas neg):")
for i in urut[:12]:
    print(f"{nama_fitur[i]:<24} {koef[i]:.3f}")
print()
print("12 koefisien paling positif (mendorong kelas pos):")
for i in urut[-12:][::-1]:
    print(f"{nama_fitur[i]:<24} {koef[i]:.3f}")
text Keluaran
Jumlah fitur (unigram + bigram): 109795
Akurasi: 0.866

12 koefisien paling negatif (mendorong kelas neg):
bad                      -1.484
worst                    -1.030
stupid                   -0.830
supposed                 -0.827
script                   -0.808
boring                   -0.806
plot                     -0.799
supposed to              -0.781
the worst                -0.745
nothing                  -0.716
waste                    -0.678
have been                -0.671

12 koefisien paling positif (mendorong kelas pos):
he is                    0.819
very                     0.759
both                     0.710
life                     0.693
perfect                  0.664
great                    0.660
many                     0.659
well                     0.652
excellent                0.639
also                     0.632
performances             0.625
perfectly                0.577

Membaca koefisien#

Koefisien bernilai negatif mendorong prediksi menuju kelas neg, sedangkan koefisien positif mendorong prediksi menuju kelas pos. Daftar pada keluaran terbaca seperti kata yang membedakan ulasan buruk dan ulasan bagus. Kata bad menduduki puncak dengan koefisien -1.484, diikuti worst, stupid, boring, dan waste. Pada sisi positif terdapat perfect, great, dan excellent dengan koefisien sekitar 0.66.

Bigram ikut menduduki kedua daftar, yaitu supposed to, the worst, dan have been pada sisi negatif serta he is pada sisi positif. Kehadiran bigram di puncak daftar adalah bukti manfaat ngram_range=(1, 2). Interpretasinya tetap perlu kehati-hatian, karena koefisien mencerminkan korelasi dari data latih dan bukan penilaian manusia. Koefisien he is yang besar muncul karena ulasan positif pada korpus ini cenderung mendeskripsikan penampilan tokoh, sehingga pola tersebut berguna bagi model meskipun tidak bernada sentimen.

Parameter C mengatur kekuatan penalti L2 dan menjadi pengendali utama pembengkakan koefisien. Nilai C yang kecil menekan koefisien agar mendekati nol, sehingga daftar kata di atas menjadi lebih pendek dan stabil, sedangkan nilai C yang besar melonggarkan penalti dan membiarkan model mengikuti pola data latih dengan bebas. Menurunkan nilai C adalah langkah pertama yang wajar apabila koefisien tampak terlalu dipengaruhi kata-kata jarang.

Naive Bayes atau regresi logistik#

AspekNaive BayesRegresi logistik
Jenis modelGeneratif, memodelkan peluang kata per kelasDiskriminatif, langsung menuju batas keputusan
Cara belajarMenghitung frekuensi sekali jalanOptimisasi bobot secara berulang
Kecepatan pelatihanSangat cepatCepat, tetapi lebih lambat dibandingkan Naive Bayes
Akurasi pada pembagian data sama0.8240.866
KeterbacaanPeluang kata per kelasKoefisien berarah per fitur

Kedua model menghabiskan sumber daya yang kecil sehingga keduanya layak dicoba. Pada data kecil, Naive Bayes sering tidak terkalahkan dan menjadi titik tolak yang wajar. Apabila data lebih banyak dan peluang model perlu lebih terkalibrasi, regresi logistik biasanya unggul sebagaimana tampak pada akurasi 0.866 berbanding 0.824 pada pembagian data yang sama. Perbedaan akurasi satu pembagian seperti ini perlu dikonfirmasi dengan validasi silang sebelum dipakai sebagai dasar keputusan.

Ringkasan#

  • Regresi logistik memetakan skor linear w⋅x+bw \cdot x + b menjadi peluang melalui fungsi logistik dan belajar dengan meminimalkan rugi log beserta regularisasi L2.
  • Fitur bigram dari ngram_range=(1, 2) menangkap pola dua kata yang hilang pada bag of words, dengan konsekuensi kolom yang membengkak dan penjaga berupa min_df serta sublinear_tf.
  • Koefisien terbesar dan terkecil memberikan daftar kata yang paling mendorong tiap kelas, dan daftar tersebut dapat berisi artefak korelasi data alih-alih sentimen murni.
  • Pada pembagian data yang sama, regresi logistik mencapai akurasi 0.866 sedangkan Naive Bayes 0.824.

Referensi#