S5
IF1402 Praktikum
Sesi 5 - Evaluasi Model Teks
Sesi 5 dari 16

Evaluasi Model Teks

Pada sesi 4 mahasiswa sudah bisa melatih model. Namun model yang sudah jadi belum otomatis berarti model itu baik. Sesi 5 mengajarkan cara membaca hasil model dengan jujur. Di sini mahasiswa belajar bahwa angka akurasi saja belum cukup. Kadang model terlihat bagus, padahal masih salah di bagian yang sangat penting.

Ibaratnya begini. Kalau sesi 4 adalah belajar mengendarai mobil, maka sesi 5 adalah belajar membaca dashboard, rem, lampu indikator, dan kondisi ban. Mobil bisa berjalan, tetapi kita tetap harus tahu apakah mobil itu aman, stabil, dan layak dipakai di jalan.

Tujuan: membaca kualitas model Fokus: metrik dan analisis error Output: laporan evaluasi model
Pertanyaan utama sesi ini Bagaimana kita tahu sebuah model benar-benar bagus, bukan hanya terlihat bagus pada satu angka saja?
Jawaban singkatnya Kita perlu membaca accuracy, precision, recall, F1-score, confusion matrix, lalu memeriksa contoh prediksi yang benar dan salah.
Hasil belajar Mahasiswa dapat mengevaluasi model teks dengan lebih kritis, menjelaskan hasilnya, dan tidak mudah tertipu oleh angka yang tampak tinggi.

Kenapa evaluasi model itu penting

Bayangkan ada model klasifikasi sentimen yang mendapat akurasi 90 persen. Sekilas ini terlihat hebat. Namun kalau ternyata hampir semua data adalah kelas positif, bisa saja model hanya menebak hampir semua teks sebagai positif. Akibatnya akurasi tampak tinggi, tetapi model gagal mengenali kelas negatif yang justru penting untuk ditindaklanjuti.

Perumpamaan mudah

Misalnya seorang satpam kampus diminta mengawasi tamu yang masuk. Jika 95 persen orang yang datang memang mahasiswa biasa, satpam bisa terlihat “akurat” hanya dengan selalu bilang semua orang aman. Masalahnya, satu atau dua orang yang seharusnya diperiksa bisa lolos. Evaluasi model bekerja seperti laporan kinerja satpam itu. Kita tidak cukup hanya tahu berapa banyak tebakan yang benar, tetapi juga jenis kesalahan apa yang dibuat.

Karena itu evaluasi model bertujuan menjawab pertanyaan yang lebih dalam. Bukan hanya “berapa banyak yang benar”, tetapi juga “apa yang salah”, “kelas mana yang sering keliru”, dan “apakah model terlalu hafal data latih”.

Metrik utama yang wajib dipahami

Metrik Makna sederhana Kapan penting
Accuracy Persentase prediksi yang benar dari seluruh prediksi. Cocok sebagai gambaran umum jika kelas relatif seimbang.
Precision Dari semua yang diprediksi sebagai kelas tertentu, berapa yang benar. Penting saat false positive harus ditekan.
Recall Dari semua data yang benar-benar milik kelas tertentu, berapa yang berhasil ditemukan. Penting saat false negative harus ditekan.
F1-score Rata-rata harmonik precision dan recall. Penting saat ingin keseimbangan antara precision dan recall.
Confusion Matrix Tabel yang menunjukkan jenis prediksi benar dan salah. Sangat penting untuk analisis detail kesalahan model.

Accuracy dengan bahasa paling mudah

Accuracy adalah jumlah prediksi yang benar dibagi jumlah seluruh prediksi. Misalnya ada 100 teks dan model menebak 85 dengan benar, maka accuracy adalah 85 persen. Ini mudah dipahami, tetapi tidak selalu cukup. Jika dataset tidak seimbang, accuracy bisa menipu.

Rumus sederhananya adalah benar dibagi total. Namun keputusan akademik yang baik tidak boleh berhenti di situ. Accuracy hanya pintu masuk, bukan garis finish.

Precision dan recall lewat ilustrasi spam email

Precision menjawab pertanyaan, dari semua email yang diprediksi spam, berapa yang memang benar spam. Recall menjawab pertanyaan, dari semua email yang sebenarnya spam, berapa yang berhasil tertangkap model.

Precision tinggi

Saat model mengatakan spam, biasanya memang spam. Cocok bila kita tidak ingin email penting ikut dibuang.

Recall tinggi

Hampir semua spam berhasil ditemukan. Cocok bila kita takut spam lolos terlalu banyak.

F1-score

Menjaga keseimbangan antara precision dan recall supaya penilaian tidak berat sebelah.

Confusion matrix: tempat terbaik melihat kesalahan model

Confusion matrix memperlihatkan jumlah prediksi benar dan salah secara rinci. Untuk dua kelas, biasanya ada empat kotak penting, yaitu true positive, true negative, false positive, dan false negative. Dari sini mahasiswa bisa tahu model salah ke arah mana.

Perumpamaan mudah

Kalau laporan nilai mahasiswa hanya berupa rata-rata kelas, dosen belum tahu siapa yang benar-benar paham dan siapa yang masih tertinggal. Confusion matrix seperti tabel nilai per mahasiswa. Kita bisa melihat bagian mana yang masih lemah dan perlu perbaikan.

Macro average dan micro average

Pada klasifikasi multi-kelas, library seperti scikit-learn sering menampilkan macro average dan weighted average. Macro average menghitung rata-rata tiap kelas secara seimbang, sehingga kelas kecil tetap diperhatikan. Weighted average memberi bobot sesuai jumlah data di setiap kelas. Untuk tahap awal, mahasiswa cukup memahami bahwa macro average lebih sensitif pada performa kelas minoritas.

Jika sebuah kelas hanya sedikit tetapi sangat penting, jangan hanya melihat weighted average. Cek juga macro average agar kelas kecil tidak “tenggelam” oleh kelas besar.

Overfitting dan underfitting

Overfitting terjadi ketika model terlalu hafal data latih tetapi buruk pada data uji. Underfitting terjadi ketika model terlalu sederhana sehingga tidak mampu menangkap pola dengan baik, baik pada data latih maupun data uji.

Overfitting

Nilai train sangat tinggi, tetapi test rendah. Model seperti murid yang hafal contoh soal, namun bingung saat bentuk soal sedikit diubah.

Underfitting

Nilai train dan test sama-sama rendah. Model seperti murid yang bahkan belum memahami konsep dasar.

Model sehat

Nilai train dan test sama-sama baik serta tidak berbeda terlalu jauh. Ini tanda model belajar pola yang cukup umum.

Praktikum 1: evaluasi model sentimen secara lengkap

Contoh berikut melanjutkan pipeline dari sesi 4. Kodenya dibuat lebih lengkap agar mahasiswa bisa melihat accuracy, classification report, confusion matrix, dan beberapa prediksi yang salah.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# dataset contoh

data = {
    "teks": [
        "aplikasi kampus sangat membantu pengisian krs",
        "fiturnya bagus dan mudah digunakan",
        "sering error saat login ke sistem",
        "server lambat dan membuat frustrasi",
        "menu akademik sangat praktis",
        "notifikasi tugas tidak pernah muncul",
        "tampilan aplikasi rapi dan nyaman",
        "aplikasi tiba-tiba keluar sendiri",
        "materi kuliah mudah diakses",
        "fitur pembayaran sering gagal",
        "penggunaan aplikasi sangat memudahkan",
        "saya kecewa karena aksesnya lambat",
        "desain aplikasi menarik dan bersih",
        "menu membingungkan dan tidak jelas",
        "proses krs jadi lebih cepat",
        "aplikasi sering macet saat dipakai"
    ],
    "label": [
        "positif", "positif", "negatif", "negatif",
        "positif", "negatif", "positif", "negatif",
        "positif", "negatif", "positif", "negatif",
        "positif", "negatif", "positif", "negatif"
    ]
}

# buat dataframe

df = pd.DataFrame(data)

# split data
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"]
)

# pipeline
model = Pipeline([
    ("tfidf", TfidfVectorizer()),
    ("clf", LogisticRegression(max_iter=1000))
])

# training
model.fit(X_train, y_train)

# prediksi
pred = model.predict(X_test)

# evaluasi dasar
print("Accuracy:", accuracy_score(y_test, pred))
print("\nClassification Report:")
print(classification_report(y_test, pred))
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, pred))

Classification report memberi ringkasan precision, recall, F1-score, dan support. Confusion matrix memperlihatkan jumlah prediksi benar dan salah secara lebih konkret.

Praktikum 2: menampilkan confusion matrix dengan visual yang lebih enak dibaca

Visualisasi akan membantu mahasiswa yang masih baru. Dengan gambar, letak prediksi benar dan salah terlihat jauh lebih jelas daripada angka mentah.

import matplotlib.pyplot as plt
from sklearn.metrics import ConfusionMatrixDisplay

cm = confusion_matrix(y_test, pred, labels=["positif", "negatif"])
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=["positif", "negatif"])

disp.plot(cmap="Greens")
plt.title("Confusion Matrix - Logistic Regression")
plt.show()

Praktikum 3: mencari contoh prediksi yang salah

Langkah ini sangat penting karena mahasiswa belajar bahwa evaluasi bukan hanya membaca angka, tetapi juga membaca contoh nyata yang keliru.

hasil = pd.DataFrame({
    "teks": X_test.values,
    "label_asli": y_test.values,
    "prediksi": pred
})

hasil["benar"] = hasil["label_asli"] == hasil["prediksi"]

print("=== HASIL PREDIKSI ===")
print(hasil)

print("\n=== PREDIKSI YANG SALAH ===")
print(hasil[hasil["benar"] == False])

Dari tabel ini mahasiswa dapat membaca, misalnya, apakah model sering keliru saat ada kata “tidak” atau saat kalimat mengandung dua opini sekaligus.

Praktikum 4: membandingkan train score dan test score untuk mendeteksi overfitting

Jangan hanya melihat performa test. Bandingkan juga performa di train. Jika train terlalu tinggi tetapi test jauh lebih rendah, itu tanda peringatan.

train_score = model.score(X_train, y_train)
test_score = model.score(X_test, y_test)

print("Train score:", train_score)
print("Test score:", test_score)

if train_score - test_score > 0.15:
    print("Kemungkinan ada gejala overfitting")
else:
    print("Perbedaan train-test masih relatif wajar")

Praktikum 5: cross-validation untuk evaluasi yang lebih stabil

Satu kali pembagian train-test kadang terlalu dipengaruhi komposisi data. Cross-validation membantu memberi gambaran yang lebih stabil karena proses evaluasi diulang beberapa kali.

from sklearn.model_selection import cross_val_score, StratifiedKFold

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, df["teks"], df["label"], cv=cv, scoring="f1_macro")

print("Skor F1 tiap fold:", cv_scores)
print("Rata-rata F1 Macro:", cv_scores.mean())
print("Standar deviasi:", cv_scores.std())

Kalau rata-rata bagus dan penyebaran nilainya tidak terlalu lebar, mahasiswa bisa lebih yakin bahwa model cukup stabil.

Praktikum 6: membandingkan dua model dengan metrik yang sama

Contoh ini penting agar mahasiswa tidak terjebak hanya memakai satu model. Kita bandingkan Logistic Regression dan Naive Bayes menggunakan metrik F1 macro.

from sklearn.naive_bayes import MultinomialNB

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

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

for nama, mdl in {"LogReg": model_lr, "NaiveBayes": model_nb}.items():
    scores = cross_val_score(mdl, df["teks"], df["label"], cv=5, scoring="f1_macro")
    print(f"{nama} -> mean F1 Macro: {scores.mean():.4f} | detail: {scores}")

Studi kasus mini: dosen ingin memantau keluhan mahasiswa

Bayangkan dosen pembimbing akademik ingin mendeteksi komentar mahasiswa yang berisi keluhan serius pada sistem kampus. Dalam kasus ini recall untuk kelas negatif mungkin lebih penting daripada sekadar accuracy tinggi. Mengapa? Karena komentar keluhan yang lolos tanpa terdeteksi bisa membuat masalah lapangan tidak cepat ditangani.

Jika fokus ke accuracy saja

Model bisa terlihat bagus walau masih sering gagal mendeteksi komentar negatif.

Jika fokus ke recall negatif

Lebih banyak komentar keluhan berhasil ditangkap untuk ditindaklanjuti.

Keputusan evaluasi

Pilih metrik sesuai tujuan sistem, bukan karena metrik itu paling populer.

Menyusun laporan evaluasi model yang baik

Laporan evaluasi tidak cukup hanya menulis satu angka. Laporan yang baik biasanya berisi nama dataset, pembagian train-test, model yang dipakai, jenis fitur, metrik utama, confusion matrix, analisis kesalahan, dan simpulan sederhana. Mahasiswa juga sebaiknya menulis kemungkinan perbaikan, misalnya menambah data, memperbaiki preprocessing, atau mencoba n-gram.

Kalimat laporan yang baik misalnya seperti ini: “Model Logistic Regression dengan TF-IDF menghasilkan akurasi 0,87 dan F1 macro 0,86. Kesalahan paling sering terjadi pada ulasan yang mengandung pujian dan keluhan dalam satu kalimat. Perbaikan berikutnya adalah mencoba bigram dan menambah jumlah data latih.”

Kesalahan umum mahasiswa pada sesi 5

Kesalahan pertama adalah terlalu percaya pada accuracy saat data tidak seimbang. Kesalahan kedua adalah tidak membaca confusion matrix. Kesalahan ketiga adalah tidak memeriksa contoh prediksi salah. Kesalahan keempat adalah membandingkan model dengan metrik yang berbeda-beda sehingga kesimpulan menjadi tidak adil. Kesalahan kelima adalah mengira hasil sekali train-test sudah final tanpa cross-validation.

Evaluasi yang baik membuat mahasiswa jujur terhadap modelnya sendiri. Bukan mencari pembenaran bahwa model “sudah cukup”, melainkan mencari pemahaman apa yang masih perlu diperbaiki.

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.