33  Notebook Bab 15 - Representasi Dipelajari Mesin & Pretrained Model

Open In ColabNotebook Bab 15 ini punya dua bagian. Bagian Demo tinggal Anda jalankan lalu amati keluarannya; bagian Mini Project berisi soal dan data yang Anda kerjakan sendiri.Karena memakai pretrained model, notebook ini paling praktis dijalankan di Google Colab. Kita menggabungkan embedding pretrained (dipelajari mesin) dengan fitur rancangan tangan menjadi model hibrida.

33.1 Persiapan

%pip install -q sentence-transformers scikit-learn

import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sentence_transformers import SentenceTransformer

print('Setup selesai.')

34 Section 1 - Demo: Embedding Pretrained + Fitur Rancangan Tangan

34.1 Data dan dua sumber fitur

Fitur rancangan tangan sederhana dari teks (panjang, rasio huruf kapital, kepadatan angka, jumlah tanda seru/tanya) sebagai pelengkap embedding pretrained.

cats = ['rec.autos', 'sci.med', 'comp.graphics']
news = fetch_20newsgroups(subset='all', categories=cats,
                          remove=('headers', 'footers', 'quotes'), random_state=42)
texts, y = news.data, news.target

def fitur_tangan(dokumen):
    out = []
    for t in dokumen:
        L = max(len(t), 1)
        kapital = sum(c.isupper() for c in t) / L
        angka = sum(c.isdigit() for c in t) / L
        seru = t.count('!') + t.count('?')
        out.append([len(t), kapital, angka, seru])
    return np.array(out, dtype=float)

eng = fitur_tangan(texts)
print('Dokumen:', len(texts), '| fitur tangan:', eng.shape)
enc = SentenceTransformer('all-MiniLM-L6-v2')
emb = enc.encode(texts, batch_size=64, show_progress_bar=True, normalize_embeddings=True)
print('Embedding pretrained:', emb.shape)

34.2 Rancangan tangan vs embedding vs hibrida

idx = np.arange(len(y))
itr, ite = train_test_split(idx, test_size=0.25, random_state=42, stratify=y)
sc = StandardScaler().fit(eng[itr])
eng_tr, eng_te = sc.transform(eng[itr]), sc.transform(eng[ite])
emb_tr, emb_te = emb[itr], emb[ite]

def acc(Xtr, Xte):
    clf = LogisticRegression(max_iter=2000).fit(Xtr, y[itr])
    return accuracy_score(y[ite], clf.predict(Xte))

print('Fitur rancangan tangan :', round(acc(eng_tr, eng_te), 3))
print('Embedding pretrained    :', round(acc(emb_tr, emb_te), 3))
print('Hibrida (emb + tangan)  :', round(acc(np.hstack([emb_tr, eng_tr]), np.hstack([emb_te, eng_te])), 3))

🔎 Amati. Fitur rancangan tangan sendirian lemah, embedding pretrained jauh lebih kuat, dan model hibrida menyamai atau sedikit melampaui embedding. Nilai hibrida terlihat saat fitur rancangan tangan membawa sinyal domain yang tidak tertangkap embedding umum. Pola ini menunjukkan bahwa deep learning tidak menghapus rekayasa fitur; ia menggeser perannya menjadi pelengkap.

35 Section 2 - Mini Project

35.1 Soal

Bangun model hibrida untuk klasifikasi teks yang menggabungkan embedding pretrained dengan fitur rancangan tangan Anda sendiri.

Tugas:

  1. Rancang minimal empat fitur rancangan tangan yang relevan (boleh berbeda dari contoh).
  2. Bandingkan: rancangan tangan saja, embedding saja, dan hibrida.
  3. Analisis kapan fitur rancangan tangan menambah nilai di atas embedding.

Luaran: kode fitur + perbandingan akurasi + 3-4 kalimat analisis.

Kriteria penilaian: (a) fitur tangan di-scale dengan fit di train saja; (b) perbandingan adil; (c) analisis peran fitur pelengkap.

# DATA AWAL (jangan diubah)
cats2 = ['rec.sport.baseball', 'sci.electronics', 'talk.religion.misc']
news2 = fetch_20newsgroups(subset='all', categories=cats2,
                           remove=('headers', 'footers', 'quotes'), random_state=7)
texts2, y2 = news2.data, news2.target
print('Dokumen:', len(texts2), '| kelas:', news2.target_names)
# Kerjakan di sini.
# Petunjuk: buat fungsi fitur tangan Anda; enc.encode(texts2) untuk embedding; np.hstack untuk hibrida.