Alasan Evaluasi Tidak Boleh Dilakukan pada Data Pelatihan
Peserta didik akan mendemonstrasikan kebocoran data dengan mengevaluasi model yang menghafal, serta melihat alasan data pengujian yang disisihkan penting untuk memperkirakan kinerja secara jujur.
Alasan Evaluasi Tidak Boleh Dilakukan pada Data Pelatihan adalah pelajaran Machine Learning Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Machine Learning Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Machine Learning Academy mencakup 4 pelajaran total.
Jebakan Evaluasi
Setelah melatih model, hal yang paling menggoda untuk dilakukan adalah mengujinya pada data yang sama dengan yang digunakan untuk pelatihan. Model kemungkinan besar akan memperoleh skor sangat tinggi — terkadang akurasi 100% — dan hal ini terasa seperti keberhasilan. Padahal tidak. Ini adalah kesalahan paling mendasar dalam pembelajaran mesin, dan menghasilkan keluaran yang sama sekali tidak berguna untuk memprediksi kinerja di dunia nyata.
Memahami mengapa hal ini gagal bukan sekadar persoalan teknis — hal ini mengubah cara Anda memandang seluruh tujuan pembelajaran mesin. Tujuannya tidak pernah sekadar berkinerja baik pada data pelatihan. Tujuannya selalu melakukan generalisasi terhadap data baru yang belum pernah dilihat.
Menghafal vs Generalisasi
Bayangkan perbedaan antara siswa yang menghafal setiap jawaban dalam buku persiapan ujian dan siswa yang benar-benar memahami materinya. Siswa pertama memperoleh nilai sempurna pada setiap soal latihan, tetapi gagal ketika ujian sebenarnya menggunakan susunan kata yang sedikit berbeda. Siswa kedua mungkin tidak memperoleh nilai sempurna pada soal latihan, tetapi mampu menangani pertanyaan baru dengan percaya diri.
Model ML yang “menghafal” contoh pelatihan (model yang sangat mengalami overfitting) berperilaku persis seperti siswa pertama. Model tersebut mencapai akurasi pelatihan sempurna, tetapi gagal pada input baru. Fenomena ini disebut kebocoran data ketika terjadi selama evaluasi — Anda telah “membocorkan” jawabannya ke dalam pengujian.
Demonstrasi: Menghafal dalam Praktik
Mari kita buktikan hal ini secara empiris. Pohon keputusan dengan kedalaman tanpa batas akan menghafal setiap contoh pelatihan dengan sempurna sehingga mencapai akurasi pelatihan 100%. Namun, akurasi pengujiannya akan jauh lebih rendah karena pohon tersebut mempelajari derau, bukan pola yang mendasarinya.
Eksperimen ini membuat masalahnya konkret dan terukur: akurasi pelatihan tidak bermakna sebagai perkiraan kinerja — akurasi tersebut mengukur daya ingat, bukan kecerdasan.
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Unlimited depth: memorises training data
model = DecisionTreeClassifier() # no max_depth limit
model.fit(X_train, y_train)
train_acc = model.score(X_train, y_train)
test_acc = model.score(X_test, y_test)
print(f'Training accuracy: {train_acc:.3f}') # 1.000 -- perfect memorisation
print(f'Test accuracy: {test_acc:.3f}') # much lower
print(f'Overfit gap: {train_acc - test_acc:.3f}')Mengapa Akurasi Pelatihan Bias ke Arah Optimistis
Parameter model secara khusus dioptimalkan untuk meminimalkan kesalahan pada himpunan data pelatihan. Ini berarti kesalahan pelatihan dijamin lebih rendah daripada kesalahan generalisasi sebenarnya untuk model yang cukup kompleks. Kesenjangan antara kesalahan pelatihan dan kesalahan pengujian disebut optimisme kesalahan pelatihan.
Semakin banyak parameter yang dimiliki model dibandingkan dengan contoh pelatihan, semakin parah optimismenya. Jaringan saraf dengan jutaan parameter dan hanya 1.000 contoh pelatihan dapat dengan mudah mencapai kesalahan pelatihan 0%, sementara tingkat kesalahan sebenarnya mencapai 50%. Kesalahan pelatihan bukan perkiraan generalisasi yang andal — titik.
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
import numpy as np
X, y = make_classification(n_samples=500, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# KNN with k=1: memorises perfectly (always finds the exact training point)
knn1 = KNeighborsClassifier(n_neighbors=1)
knn1.fit(X_train, y_train)
print(f'k=1 Training accuracy: {knn1.score(X_train, y_train):.3f}') # 1.000
print(f'k=1 Test accuracy: {knn1.score(X_test, y_test):.3f}') # lower
# k=10: generalisers better
knn10 = KNeighborsClassifier(n_neighbors=10)
knn10.fit(X_train, y_train)
print(f'k=10 Test accuracy: {knn10.score(X_test, y_test):.3f}')Himpunan Data Uji yang Disisihkan: Solusinya
Solusinya sederhana, tetapi harus diterapkan dengan ketat: sisihkan sebagian data Anda sebelum pemodelan apa pun dimulai, dan jangan pernah menggunakannya untuk pelatihan atau untuk mengambil keputusan apa pun yang memengaruhi model.
Himpunan data uji yang disisihkan ini merupakan perkiraan jujur atas kinerja generalisasi Anda. Karena model belum pernah melihatnya, kinerjanya pada himpunan ini adalah perkiraan terbaik yang tersedia tentang kinerjanya pada data masa depan. Himpunan data uji adalah alat ukur yang hanya boleh digunakan satu kali — menggunakannya berulang kali untuk menyetel model akan membuatnya tidak valid.
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
# CORRECT workflow: split BEFORE any analysis
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.20, # 20% held out for final evaluation only
random_state=42, # reproducible split
stratify=y # maintain class ratio in both splits
)
print(f'Training set: {X_train.shape[0]} examples')
print(f'Test set: {X_test.shape[0]} examples')
print(f'Train class balance: {y_train.mean():.3f}')
print(f'Test class balance: {y_test.mean():.3f}')Kebocoran Data: Versi yang Tersamar
Menggunakan data pengujian untuk evaluasi akhir adalah bentuk kebocoran data yang paling jelas. Ada bentuk-bentuk yang lebih tersamar tetapi sama merusaknya:
- Kebocoran prapemrosesan: melakukan fitting pada penskala menggunakan seluruh kumpulan data sebelum membaginya, lalu menskalakan data pelatihan dan pengujian — penskala tersebut telah “melihat” statistik data pengujian.
- Kebocoran fitur: menyertakan fitur yang diturunkan dari variabel target (misalnya, penanda “diagnosis terkonfirmasi” yang hanya ditetapkan ketika pasien benar-benar sakit).
- Kebocoran waktu: menggunakan data masa depan untuk memprediksi peristiwa masa lalu (misalnya, menyertakan data penjualan Q3 saat memprediksi hasil Q1).
from sklearn.preprocessing import StandardScaler
import numpy as np
# WRONG: fit scaler on full dataset before splitting
X = np.random.randn(1000, 5)
scaler_wrong = StandardScaler()
X_scaled_all = scaler_wrong.fit_transform(X) # leakage! scaler saw test data
# Correct: split first, then fit scaler ONLY on training data
from sklearn.model_selection import train_test_split
X_train, X_test = train_test_split(X, test_size=0.2)
scaler_correct = StandardScaler()
X_train_s = scaler_correct.fit_transform(X_train) # fit on train only
X_test_s = scaler_correct.transform(X_test) # apply to test
print('Correct preprocessing: scaler fitted on training data only.')Pembagian Tiga Arah: Pelatihan, Validasi, dan Pengujian
Ketika Anda menggunakan kumpulan pengujian untuk mengambil keputusan — seperti memilih antara dua model atau menentukan ambang — kumpulan tersebut tidak lagi menjadi perkiraan generalisasi yang bersih. Agar kumpulan pengujian tetap murni, gunakan kumpulan validasi:
- Kumpulan pelatihan: melakukan fitting pada parameter model.
- Kumpulan validasi: menyetel hiperparameter, memilih model, dan menyesuaikan ambang.
- Kumpulan pengujian: evaluasi akhir satu kali. Sentuh hanya sekali, di bagian paling akhir.
Pembagian yang umum adalah 70% pelatihan / 15% validasi / 15% pengujian. Validasi silang memberikan alternatif yang lebih efisien dengan bergantian menggunakan lipatan validasi pada kumpulan pelatihan.
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
# First split off test set (15%)
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.15, random_state=42)
# Then split remaining into train and validation
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.176, random_state=42)
# 0.176 of 85% ≈ 15% of the original
print(f'Train: {X_train.shape[0]}')
print(f'Val: {X_val.shape[0]}')
print(f'Test: {X_test.shape[0]}')Bagaimana Kontaminasi Kumpulan Pengujian Menggelembungkan Hasil
Misalkan Anda melatih 10 model yang berbeda, mengevaluasi masing-masing model pada kumpulan pengujian, lalu memilih model dengan akurasi pengujian tertinggi. Proses ini telah mencemari kumpulan pengujian — Anda menggunakan kinerja pengujian untuk mengambil keputusan pemodelan. Model yang dipilih dioptimalkan untuk kumpulan pengujian, sehingga akurasi yang dilaporkan kini terlalu optimistis.
Inilah alasan kompetisi seperti Kaggle memiliki papan peringkat publik (kumpulan validasi) dan papan peringkat privat (kumpulan pengujian sebenarnya yang baru diungkapkan pada akhir). Tim yang mengalami overfitting pada papan peringkat publik karena mengirimkan banyak hasil sering kali berkinerja buruk pada papan peringkat privat.
from sklearn.datasets import make_classification
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import numpy as np
X, y = make_classification(n_samples=500, random_state=99)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Contamination: picking best max_depth based on test set
best_acc, best_depth = 0, 1
for depth in range(1, 20):
model = DecisionTreeClassifier(max_depth=depth)
model.fit(X_train, y_train)
acc = model.score(X_test, y_test)
if acc > best_acc:
best_acc, best_depth = acc, depth
print(f'Best depth selected by test: {best_depth}, acc: {best_acc:.3f}')
print('This accuracy is now overly optimistic!')Reprodusibilitas: Parameter random_state
Parameter random_state dalam train_test_split mengontrol contoh mana yang masuk ke setiap pembagian. Tanpa parameter tersebut, setiap proses menghasilkan pembagian yang berbeda, sehingga hasilnya sulit direproduksi dan dibandingkan.
Selalu tetapkan random_state ke bilangan bulat tetap dalam semua kode yang Anda bagikan kepada orang lain atau ingin reproduksi di kemudian hari. Bilangan bulat apa pun dapat digunakan — konvensinya adalah 42, 0, atau 1 — selama Anda mendokumentasikan nilai yang digunakan. Nilai bilangan bulat spesifiknya tidak penting; konsistensilah yang penting.
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
# Without random_state: different results every run
X_train1, X_test1, _, _ = train_test_split(X, y) # no seed
X_train2, X_test2, _, _ = train_test_split(X, y) # no seed
print('Different splits without seed:', not (X_train1 == X_train2).all())
# With random_state: same result every run
X_train3, X_test3, _, _ = train_test_split(X, y, random_state=42)
X_train4, X_test4, _, _ = train_test_split(X, y, random_state=42)
print('Same splits with seed:', (X_train3 == X_train4).all())Aturan Emas Evaluasi ML
Satu aturan yang merangkum semua hal dalam pelajaran ini: kumpulan pengujian tidak boleh memengaruhi keputusan apa pun yang dibuat selama pengembangan model. Artinya:
- Tidak ada prapemrosesan yang dilakukan fitting pada data pengujian.
- Tidak ada model yang dipilih berdasarkan kinerja pengujian.
- Tidak ada ambang yang disetel berdasarkan kinerja pengujian.
- Tidak ada fitur yang direkayasa setelah melihat kesalahan pengujian.
- Kumpulan pengujian hanya disentuh sekali, di bagian paling akhir, untuk melaporkan kinerja akhir.
Mengikuti aturan ini memastikan bahwa kinerja yang Anda laporkan merupakan perkiraan jujur tentang bagaimana model akan berperilaku dalam produksi pada data masa depan.
Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Pembelajaran Mesin dengan Python dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa: akurasi pelatihan selalu memiliki bias optimistis karena parameter model dioptimalkan berdasarkan data tersebut, kumpulan pengujian yang disisihkan dan tidak pernah memengaruhi keputusan pelatihan apa pun memberikan perkiraan generalisasi yang jujur, dan kebocoran data — termasuk kebocoran prapemrosesan dan kontaminasi kumpulan pengujian — menghasilkan perkiraan kinerja yang menyesatkan karena terlalu tinggi. Selanjutnya, kita akan menguasai fungsi scikit-learn train_test_split secara mendalam, termasuk rasio ukuran pengujian, seed acak, dan stratifikasi untuk masalah klasifikasi yang tidak seimbang.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Alasan Evaluasi Tidak Boleh Dilakukan pada Data Pelatihan” gratis?
Ya — teks lengkap “Alasan Evaluasi Tidak Boleh Dilakukan pada Data Pelatihan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Machine Learning Academy, upgrade ke CoddyKit PRO. Kursus Machine Learning Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Alasan Evaluasi Tidak Boleh Dilakukan pada Data Pelatihan”?
Peserta didik akan mendemonstrasikan kebocoran data dengan mengevaluasi model yang menghafal, serta melihat alasan data pengujian yang disisihkan penting untuk memperkirakan kinerja secara jujur. Kamu berlatih Machine Learning Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Machine Learning Academy?
Tidak diperlukan pengalaman sebelumnya. Machine Learning Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Alasan Evaluasi Tidak Boleh Dilakukan pada Data Pelatihan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Machine Learning Academy ini?
Ya. Setiap pelajaran Machine Learning Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Alasan Evaluasi Tidak Boleh Dilakukan pada Data Pelatihan
- train_test_split: Rasio, Benih, dan Stratifikasi
- Pertukaran Bias-Varians: Underfitting vs Overfitting
- Model Dasar: Selalu Kalahkan DummyClassifier