S4
IF1402 Praktikum
Sesi 4 - Klasifikasi Teks dengan Machine Learning Klasik
Sesi 4 dari 16

Klasifikasi Teks dengan Machine Learning Klasik

Setelah pada sesi 3 teks diubah menjadi angka, sekarang saatnya memakai angka tersebut untuk melatih model. Tujuan klasifikasi teks adalah membuat sistem yang bisa menebak label suatu dokumen, misalnya positif atau negatif, spam atau bukan spam, akademik atau non-akademik, dan sebagainya.

Sesi ini sangat penting karena di sinilah mahasiswa melihat hubungan langsung antara data, fitur, algoritma, dan hasil prediksi. Ibaratnya, jika sesi 3 adalah membuat bahan bakar, maka sesi 4 adalah menyalakan mesin kendaraan untuk melihat apakah kendaraan itu bisa berjalan dengan baik.

Tujuan: bangun model baseline Fokus: supervised learning Output: model klasifikasi awal
Pertanyaan utama sesi ini Bagaimana komputer bisa belajar dari contoh teks berlabel lalu memprediksi label untuk teks baru?
Jawaban singkatnya Kita memberi data latih yang sudah punya label, mengubahnya menjadi fitur numerik, lalu melatih algoritma agar menemukan pola yang membedakan tiap kelas.
Hasil belajar Mahasiswa dapat membangun model klasifikasi teks menggunakan Naive Bayes, Logistic Regression, SVM, dan KNN, lalu membandingkan kinerjanya.

Apa itu klasifikasi teks

Klasifikasi teks adalah tugas memberi label pada sebuah teks. Label itu bisa berupa sentimen, kategori topik, jenis pesan, atau status tertentu. Contohnya, ulasan “fiturnya bagus dan mudah dipakai” bisa diberi label positif, sedangkan ulasan “sering error saat login” bisa diberi label negatif.

Perumpamaan mudah

Bayangkan ada petugas perpustakaan baru. Kita tunjukkan banyak contoh buku yang sudah diberi label seperti teknologi, ekonomi, sastra, dan hukum. Setelah melihat cukup banyak contoh, petugas itu mulai bisa menaruh buku baru ke rak yang tepat. Itulah ide dasar supervised learning.

Supervised learning artinya model belajar dari data yang sudah punya jawaban. Dalam konteks ini, jawabannya adalah label kelas.

Alur supervised learning untuk teks

1

Siapkan dataset

Dataset berisi teks dan label. Misalnya kolom teks dan kolom sentimen.

2

Preprocessing dan fitur

Teks dibersihkan lalu diubah menjadi representasi angka, misalnya TF-IDF.

3

Bagi data train dan test

Sebagian data dipakai belajar, sebagian lagi dipakai menguji hasil belajar model.

4

Latih model

Algoritma mencari pola yang membedakan kelas-kelas pada data latih.

5

Evaluasi

Model diuji pada data yang belum pernah ia lihat untuk melihat seberapa baik prediksinya.

Kenapa data harus dibagi train dan test

Mahasiswa sering bertanya, kenapa tidak langsung diuji di data yang sama saja. Jawabannya karena itu bisa menipu. Model bisa terlihat sangat pintar padahal hanya hafal contoh yang sudah pernah dilihat.

Data train

Bagian ini dipakai model untuk belajar pola. Ibaratnya seperti kumpulan soal latihan yang boleh dipelajari sebelum ujian.

Data test

Bagian ini dipakai untuk menguji apakah model benar-benar paham, bukan sekadar hafal. Ibaratnya seperti soal ujian yang baru.

Jika model bagus di data train tetapi jelek di data test, berarti ia kemungkinan overfitting, yaitu terlalu hafal latihan namun kurang mampu menghadapi data baru.

Mengenal empat algoritma yang akan dicoba

Algoritma Gambaran mudahnya Kelebihan umum
Naive Bayes Menghitung peluang kelas berdasarkan kata-kata yang muncul. Cepat dan sering cukup kuat untuk teks.
Logistic Regression Mencari batas keputusan terbaik untuk membedakan kelas. Bagus sebagai baseline yang stabil.
SVM Mencari pemisah terbaik antarkelas dengan margin yang kuat. Sering sangat baik pada data teks.
KNN Membandingkan dokumen baru dengan tetangga terdekatnya. Mudah dipahami untuk perbandingan konsep.

Tidak ada satu algoritma yang selalu paling unggul di semua dataset. Karena itu praktikum yang baik bukan memilih favorit dari awal, melainkan membandingkan hasil secara jujur.

Naive Bayes dengan bahasa sederhana

Naive Bayes sangat populer untuk klasifikasi teks klasik. Secara sederhana, algoritma ini mencoba melihat kata-kata mana yang sering muncul pada kelas tertentu. Jika kata seperti “bagus”, “membantu”, dan “mudah” sering ada di kelas positif, maka saat dokumen baru mengandung kata-kata itu, peluang ke arah positif menjadi lebih besar.

Disebut naive karena ia membuat asumsi sederhana bahwa fitur-fitur dianggap relatif independen. Walaupun asumsi ini tidak selalu benar, dalam praktik teks hasilnya sering tetap baik.

Logistic Regression, SVM, dan KNN secara intuitif

Logistic Regression bisa dibayangkan seperti menarik garis pembatas antara dua kelompok dokumen. SVM juga mirip, tetapi fokus mencari garis pemisah yang paling aman dengan jarak pembatas yang baik. KNN bekerja lebih seperti bertanya, “dokumen baru ini paling mirip dengan dokumen mana di sekitarnya?” lalu mengambil suara terbanyak dari tetangga terdekat.

Perumpamaan mudah

Misalnya ada mahasiswa baru di kelas. Logistic Regression dan SVM seperti membuat aturan batas yang rapi berdasarkan ciri-ciri mahasiswa. KNN seperti melihat lima teman terdekat mahasiswa itu lalu menyimpulkan ia paling cocok masuk kelompok yang mana berdasarkan mayoritas teman terdekatnya.

Praktikum 1: Dataset sederhana dan train-test split

Langkah pertama adalah menyiapkan data. Contoh berikut menggunakan data kecil agar mahasiswa bisa fokus pada alur, bukan pada kerumitan data.

import pandas as pd
from sklearn.model_selection import train_test_split

# dataset sederhana sentimen ulasan

data = {
    "teks": [
        "aplikasinya sangat membantu dan mudah digunakan",
        "fitur bagus dan tampilannya menarik",
        "sering error saat login ke sistem",
        "server lambat ketika jam sibuk",
        "menu krs sangat memudahkan mahasiswa",
        "notifikasi tidak jalan dengan baik",
        "pengisian krs terasa cepat dan praktis",
        "saya kecewa karena aplikasi sering keluar sendiri",
        "tampilannya bersih dan mudah dipahami",
        "fitur penting sering gagal dibuka",
        "materi kuliah mudah diakses dari aplikasi",
        "login susah dan sering gagal",
        "sistem sangat membantu proses akademik",
        "aplikasi membingungkan dan terlalu lambat"
    ],
    "label": [
        "positif", "positif", "negatif", "negatif",
        "positif", "negatif", "positif", "negatif",
        "positif", "negatif", "positif", "negatif",
        "positif", "negatif"
    ]
}

df = pd.DataFrame(data)

X_train, X_test, y_train, y_test = train_test_split(
    df["teks"],
    df["label"],
    test_size=0.3,
    random_state=42,
    stratify=df["label"]
)

print("Jumlah data train:", len(X_train))
print("Jumlah data test:", len(X_test))
print("\nContoh train:")
print(X_train.head())

Parameter stratify dipakai agar proporsi label positif dan negatif tetap seimbang saat data dibagi.

Praktikum 2: Pipeline Naive Bayes dengan TF-IDF

Pipeline sangat berguna karena membuat alur vectorizer dan model menjadi satu paket. Ini memudahkan mahasiswa dan mengurangi risiko salah langkah.

from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

model_nb = Pipeline([
    ("tfidf", TfidfVectorizer()),
    ("clf", MultinomialNB())
])

model_nb.fit(X_train, y_train)
y_pred_nb = model_nb.predict(X_test)

print("Akurasi Naive Bayes:", accuracy_score(y_test, y_pred_nb))
print("\nClassification Report:")
print(classification_report(y_test, y_pred_nb))
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, y_pred_nb))

Pada tahap ini mahasiswa bisa langsung melihat hasil prediksi dan mulai berdiskusi mengapa ada teks yang benar atau salah diklasifikasikan.

Praktikum 3: Logistic Regression dan SVM

Di data teks, Logistic Regression dan SVM sering menjadi baseline yang kuat. Contoh berikut menunjukkan cara melatih keduanya dengan alur yang hampir sama.

from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score

model_lr = Pipeline([
    ("tfidf", TfidfVectorizer()),
    ("clf", LogisticRegression(max_iter=1000))
])

model_svm = Pipeline([
    ("tfidf", TfidfVectorizer()),
    ("clf", LinearSVC())
])

model_lr.fit(X_train, y_train)
model_svm.fit(X_train, y_train)

y_pred_lr = model_lr.predict(X_test)
y_pred_svm = model_svm.predict(X_test)

print("Akurasi Logistic Regression:", accuracy_score(y_test, y_pred_lr))
print("Akurasi SVM:", accuracy_score(y_test, y_pred_svm))

Dengan cara ini mahasiswa dapat melihat bahwa satu dataset bisa dicoba dengan beberapa algoritma tanpa mengubah terlalu banyak struktur kode.

Praktikum 4: KNN sebagai pembanding

KNN kadang tidak seefisien model lain pada teks berdimensi besar, tetapi sangat bagus untuk membantu mahasiswa memahami ide tetangga terdekat. Karena itu KNN tetap menarik dijadikan pembanding.

from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score

model_knn = Pipeline([
    ("tfidf", TfidfVectorizer()),
    ("clf", KNeighborsClassifier(n_neighbors=3))
])

model_knn.fit(X_train, y_train)
y_pred_knn = model_knn.predict(X_test)

print("Akurasi KNN:", accuracy_score(y_test, y_pred_knn))

Dari sini dosen bisa menjelaskan bahwa model yang mudah dibayangkan secara konsep belum tentu paling baik performanya di semua data.

Praktikum 5: Membandingkan beberapa algoritma sekaligus

Contoh berikut lebih lengkap dan sangat cocok dijadikan notebook representatif. Mahasiswa bisa melihat hasil akurasi semua model dalam satu tabel sederhana.

import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# data contoh

df = pd.DataFrame({
    "teks": [
        "aplikasinya sangat membantu dan mudah digunakan",
        "fitur bagus dan tampilannya menarik",
        "sering error saat login ke sistem",
        "server lambat ketika jam sibuk",
        "menu krs sangat memudahkan mahasiswa",
        "notifikasi tidak jalan dengan baik",
        "pengisian krs terasa cepat dan praktis",
        "saya kecewa karena aplikasi sering keluar sendiri",
        "tampilannya bersih dan mudah dipahami",
        "fitur penting sering gagal dibuka",
        "materi kuliah mudah diakses dari aplikasi",
        "login susah dan sering gagal",
        "sistem sangat membantu proses akademik",
        "aplikasi membingungkan dan terlalu lambat",
        "fitur pencarian kelas sangat membantu",
        "server down ketika masa pengisian krs"
    ],
    "label": [
        "positif", "positif", "negatif", "negatif",
        "positif", "negatif", "positif", "negatif",
        "positif", "negatif", "positif", "negatif",
        "positif", "negatif", "positif", "negatif"
    ]
})

X_train, X_test, y_train, y_test = train_test_split(
    df["teks"], df["label"], test_size=0.25, random_state=42, stratify=df["label"]
)

models = {
    "Naive Bayes": Pipeline([
        ("tfidf", TfidfVectorizer()),
        ("clf", MultinomialNB())
    ]),
    "Logistic Regression": Pipeline([
        ("tfidf", TfidfVectorizer()),
        ("clf", LogisticRegression(max_iter=1000))
    ]),
    "SVM": Pipeline([
        ("tfidf", TfidfVectorizer()),
        ("clf", LinearSVC())
    ]),
    "KNN": Pipeline([
        ("tfidf", TfidfVectorizer()),
        ("clf", KNeighborsClassifier(n_neighbors=3))
    ])
}

hasil = []

for nama, model in models.items():
    model.fit(X_train, y_train)
    pred = model.predict(X_test)
    acc = accuracy_score(y_test, pred)
    hasil.append({"model": nama, "akurasi": acc})
    print(f"\n=== {nama} ===")
    print("Akurasi:", acc)
    print(classification_report(y_test, pred))

hasil_df = pd.DataFrame(hasil).sort_values(by="akurasi", ascending=False)
print("\n=== PERBANDINGAN MODEL ===")
print(hasil_df)

Model dengan akurasi tertinggi belum tentu otomatis paling tepat untuk semua kebutuhan, tetapi contoh ini sangat baik untuk melatih kebiasaan membandingkan model secara sistematis.

Studi kasus mini: klasifikasi sentimen ulasan aplikasi kampus

Kasus ini sangat cocok untuk praktikum awal karena dekat dengan kehidupan mahasiswa. Misalnya kampus ingin memantau opini mahasiswa terhadap aplikasi akademik. Jika ulasan sudah berhasil diklasifikasikan menjadi positif dan negatif, pihak kampus bisa cepat melihat apakah mayoritas komentar cenderung puas atau kecewa.

Input

Kumpulan ulasan mahasiswa yang sudah diberi label positif atau negatif.

Proses

Preprocessing, ubah ke TF-IDF, bagi train-test, latih model, lalu uji hasilnya.

Output

Prediksi label untuk ulasan baru dan laporan performa model dasar.

Contoh prediksi untuk teks baru

Setelah model dilatih, mahasiswa biasanya senang jika bisa mencoba prediksi untuk kalimat baru. Contoh berikut memperlihatkan hal itu dengan sangat sederhana.

# misalnya pakai model terbaik, di sini contoh memakai Logistic Regression
teks_baru = [
    "fitur krs sangat membantu dan cepat",
    "login gagal terus dan aplikasinya lambat"
]

prediksi = model_lr.predict(teks_baru)

for teks, label in zip(teks_baru, prediksi):
    print("Teks:", teks)
    print("Prediksi:", label)
    print()

Pada titik ini mahasiswa biasanya mulai merasa bahwa machine learning benar-benar bekerja, karena mereka bisa menguji teks baru di luar data contoh.

Kesalahan umum mahasiswa pada sesi 4

Kesalahan pertama adalah lupa memisahkan data train dan test. Kesalahan kedua adalah mengevaluasi model hanya dari satu metrik tanpa melihat jenis kesalahannya. Kesalahan ketiga adalah terlalu cepat menyimpulkan model tertentu paling hebat hanya dari dataset yang sangat kecil. Kesalahan keempat adalah tidak memeriksa teks prediksi yang salah untuk memahami sumber masalah.

Tujuan sesi ini bukan sekadar mendapatkan angka akurasi tertinggi, melainkan membangun baseline yang jujur dan bisa dijelaskan. Model yang baik harus bisa dipahami prosesnya, bukan hanya dilihat hasil akhirnya.

Diskusi Mahasiswa dengan Sistem LLM

Tanyakan materi yang masih terkait Pembelajaran Mesin untuk Teks dan AI Generatif.

Siap Diskusi
Halo, saya siap membantu memahami materi praktikum, konsep, kode, studi kasus, UTS, UAS, dan mini project pada mata kuliah ini. Silakan tulis pertanyaan Anda.

Pembahasan dibatasi pada topik mata kuliah ini. Pertanyaan di luar tema akan ditolak secara otomatis.