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.
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.
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.
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.
Ruang Diskusi Mahasiswa dengan Sistem LLM
Tanyakan konsep, latihan, studi kasus, atau minta penjelasan ulang dengan bahasa yang lebih sederhana. Sistem hanya melayani topik yang masih berkaitan dengan mata kuliah ini.