Sessi 8 — UTS & Review Materi (Sessi 1–7)

UTS menguji pemahaman dan keterampilan praktik dari praproses hingga baseline klasifikasi. Format campuran: teori singkat + praktik notebook.

Learning Outcomes: (1) Menjelaskan konsep kunci (tokenisasi/normalisasi, stopword/stemming/lemma, BoW/TF–IDF, cosine, KNN, LogReg); (2) Menyusun pipeline end‑to‑end pada dataset baru; (3) Menafsirkan metrik evaluasi dan koefisien fitur.

1) Kisi‑kisi UTS (Blueprint)

RanahBobotDetail
Teori40%Konsep & definisi (Sessi 1–7): TF/IDF, cosine, n‑gram, efek stopword/stemming/lemma, KNN & pemilihan k, LogReg & regularisasi.
Praktik50%Pipeline Colab: praproses → TF‑IDF → retrieval sederhana → klasifikasi (KNN/LogReg) + evaluasi metrik.
Komunikasi10%Laporan singkat: interpretasi metrik, analisis kesalahan, dan justifikasi pilihan hyperparameter.

Durasi 90–110 menit • Bahan 1 notebook kosong + 1 dataset baru (disediakan pengajar).

2) Review Kilat Materi Inti

3) Contoh Soal Teori

  1. Jelaskan perbedaan stemming dan lemmatization beserta dampaknya pada ukuran kosakata dan performa klasifikasi.
  2. Diberikan 3 dokumen dan 1 query, hitung skor TF–IDF manual (DF, IDF) lalu urutkan ranking cosine.
  3. Mengapa sublinear_tf=True sering membantu pada TF–IDF? Beri contoh kasus.
  4. Terangkan pengaruh pemilihan k pada KNN terhadap bias‑variance.
  5. Bandingkan penalti L1 vs L2 pada Regresi Logistik untuk teks—kapan memilih masing‑masing?

4) Contoh Soal Implementasi (Google Colab)

Gunakan dataset baru (≥30 dokumen campuran ID/EN) yang disediakan. Lengkapi sel kode berikut:

A. Template Notebook (Isi yang hilang bertanda # TODO)

!pip -q install pandas numpy scikit-learn nltk Sastrawi

import numpy as np, pandas as pd
import nltk; nltk.download('punkt', quiet=True)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.model_selection import train_test_split, StratifiedKFold, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report

# 1) Load dataset UTS (disediakan dosen)
df = pd.read_csv('dataset_uts.csv')  # kolom: text, (opsional) weak_label
texts = df['text'].fillna('').astype(str).tolist()

# 2) PRA-PROSES minim (Sessi 2–3)
# TODO: normalisasi dasar (lowercase, mask URL/email/angka, de-elongation, jaga negasi)
# TODO: stopword removal (ID+EN), pilih: stemming ID atau lemma EN jika perlu

proc_texts = texts  # TODO: ganti dengan hasil praproses

# 3) TF–IDF & Retrieval singkat
vec = TfidfVectorizer(ngram_range=(1,2), min_df=2, max_df=0.9, sublinear_tf=True, norm='l2')
X = vec.fit_transform(proc_texts)

def search(query, topk=3):
    q = vec.transform([query])
    sims = cosine_similarity(X, q).ravel()
    order = sims.argsort()[::-1][:topk]
    return [(float(sims[i]), texts[i]) for i in order]

print('Retrieval contoh:')
for q in ['pengiriman cepat','refund','screen glare']:
    print('\nQUERY =', q)
    for s,doc in search(q):
        print(f'  sim={s:.3f}  {doc[:90]}')

# 4) Labeling
if 'weak_label' in df.columns:
    y = df['weak_label'].fillna(-1).astype(int)
    mask = y>=0
    Xsup, ysup = X[mask], y[mask]
else:
    # TODO: buat weak labels kecil (lihat Sessi 3/6) atau lakukan labeling manual cepat
    raise SystemExit('Tambahkan label untuk bagian klasifikasi.')

# 5) Split & Baselines KNN vs LogReg
X_train, X_test, y_train, y_test = train_test_split(Xsup, ysup, test_size=0.25, stratify=ysup, random_state=42)

knn = KNeighborsClassifier()
logreg = LogisticRegression(max_iter=200, class_weight='balanced', solver='liblinear')

# Grid minimal
params_knn = { 'n_neighbors':[3,5,7], 'weights':['uniform','distance'], 'metric':['cosine'] }
params_lr  = { 'penalty':['l1','l2'], 'C':[0.5,1,2] }

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# KNN (TF–IDF sudah dihitung; gunakan pipeline jika vektorisasi diulang)
from sklearn.model_selection import GridSearchCV
search_knn = GridSearchCV(knn, params_knn, cv=cv, scoring='f1')
search_knn.fit(X_train, y_train)

# LogReg (langsung pada X TF–IDF)
search_lr = GridSearchCV(logreg, params_lr, cv=cv, scoring='f1')
search_lr.fit(X_train, y_train)

print('Best KNN:', search_knn.best_params_)
print('Best LR :', search_lr.best_params_)

# Evaluasi test
from sklearn.metrics import f1_score
knn_best = search_knn.best_estimator_
lr_best  = search_lr.best_estimator_
print('\nKNN Test Report')
print(classification_report(y_test, knn_best.predict(X_test)))
print('\nLogReg Test Report')
print(classification_report(y_test, lr_best.predict(X_test)))

B. Variasi/Challenge

5) Rubrik Penilaian UTS (Detail)

KomponenBobotIndikator
Teori40%Jawaban definisi & konsep tepat (≥80% benar); perhitungan TF–IDF/cosine manual rapi dan benar.
Pipeline Praktik20%Praproses konsisten, vektorisasi TF–IDF sesuai, fungsi pencarian berjalan.
Model & Tuning20%Menjalankan KNN/LogReg dengan tuning sederhana; metrik dilaporkan (F1/Confusion Matrix).
Analisis & Interpretasi10%Menjelaskan pilihan hyperparameter & membandingkan model; menampilkan fitur penting.
Kebersihan & Repro10%Notebook rapi, ada seed & versi paket; dapat dijalankan ulang tanpa error.

6) Catatan Akademik