Panduan Lengkap Cross-Validation untuk Model Machine Learning
Anda melatih model klasifikasi dengan data yang dibagi 80:20. Akurasi di data uji tampak bagus, tetapi saat diuji ke data baru hasilnya jauh berbeda. Masalahnya sering ada pada pembagian data yang terlalu bergantung pada satu kali pemisahan. Cross-validation untuk model machine learning menawarkan cara evaluasi yang lebih stabil dengan memanfaatkan seluruh data secara bergiliran.
Banyak pemula langsung memakai train_test_split tanpa memikirkan variasi hasil. Padahal, keputusan memilih model atau hyperparameter sebaiknya didasarkan pada estimasi performa yang tidak mudah berubah hanya karena kebetulan pembagian data.
Apa itu cross-validation dan mengapa perlu dipakai?
Cross-validation adalah prosedur membagi data menjadi beberapa lipatan (fold), melatih model pada sebagian lipatan, dan menguji pada lipatan yang tersisa. Proses ini diulang hingga setiap lipatan pernah menjadi data uji. Rata-rata skor dari semua iterasi menjadi estimasi performa model.
Dengan cara ini, Anda tidak bergantung pada satu subset data uji yang mungkin kurang representatif. Model juga dilatih pada porsi data yang lebih besar di setiap iterasi, sehingga estimasi biasanya lebih mendekati performa sebenarnya di lapangan.
Cross-validation dipakai untuk mengevaluasi dan memilih model, bukan untuk melatih model final. Setelah model terpilih, latih ulang pada seluruh data latih sebelum dipakai untuk prediksi.
Jenis-jenis cross-validation yang umum dipakai
1. K-Fold Cross-Validation
Data dibagi menjadi k lipatan berukuran hampir sama. Setiap iterasi memakai satu lipatan sebagai data uji dan k-1 lipatan lainnya sebagai data latih. Nilai k yang lazim adalah 5 atau 10. Semakin besar k, semakin banyak iterasi dan semakin lama prosesnya, tetapi bias estimasi biasanya menurun.
2. Stratified K-Fold
Untuk klasifikasi dengan kelas tidak seimbang, pembagian acak bisa membuat satu lipatan kekurangan contoh dari kelas minoritas. Stratified K-Fold menjaga proporsi kelas di setiap lipatan. Scikit-learn menyediakan StratifiedKFold yang otomatis mempertahankan distribusi kelas.
3. Leave-One-Out (LOO)
Setiap observasi menjadi data uji satu kali, dan sisanya menjadi data latih. LOO cocok untuk dataset sangat kecil, tetapi biaya komputasinya tinggi karena jumlah iterasi sama dengan jumlah sampel.
4. Time Series Split
Data deret waktu tidak boleh diacak karena urutan waktu penting. TimeSeriesSplit melatih model pada data masa lalu dan menguji pada periode setelahnya, meniru skenario prediksi ke depan.
Contoh implementasi cross-validation di Python
Berikut contoh sederhana memakai scikit-learn. Dataset yang dipakai adalah breast cancer bawaan library, tetapi Anda bisa menggantinya dengan data sendiri.
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
# Muat data
X, y = load_breast_cancer(return_X_y=True)
# Buat pipeline: scaling + model
model = make_pipeline(StandardScaler(), RandomForestClassifier(random_state=42))
# Tentukan strategi cross-validation
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# Hitung skor akurasi
scores = cross_val_score(model, X, y, cv=cv, scoring='accuracy')
print(f'Skor per lipatan: {scores}')
print(f'Rata-rata akurasi: {scores.mean():.3f} +/- {scores.std():.3f}')
Perhatikan bahwa scaling dimasukkan ke dalam pipeline. Ini penting agar proses standardisasi hanya dihitung dari data latih di setiap lipatan, bukan dari seluruh data. Jika Anda melakukan scaling sebelum cross-validation, informasi dari data uji bisa bocor ke model dan skor menjadi terlalu optimistis.
Untuk klasifikasi dengan kelas tidak seimbang, ganti scoring='accuracy' dengan metrik yang lebih sesuai seperti f1 atau roc_auc. Pemilihan metrik ini sering kali lebih menentukan daripada jumlah lipatan.
Kesalahan umum saat menerapkan cross-validation
- Data leakage: melakukan praproses (imputasi, scaling, encoding) pada seluruh dataset sebelum cross-validation. Selalu bungkus praproses dalam pipeline.
- Mengabaikan distribusi kelas: memakai K-Fold biasa pada data tidak seimbang sehingga beberapa lipatan tidak memiliki contoh kelas minoritas.
- Mengacak data deret waktu: menggunakan K-Fold pada data time series yang seharusnya memakai TimeSeriesSplit.
- Memilih model hanya dari satu skor: tidak melihat variasi antar lipatan. Standar deviasi yang besar menandakan performa model tidak stabil.
- Menggunakan cross-validation untuk data uji final: setelah model dipilih, sisa data uji terpisah harus tetap disimpan untuk evaluasi akhir.
Kapan cross-validation sebaiknya tidak dipakai?
Jika dataset sangat besar, cross-validation bisa memakan waktu lama tanpa memberi peningkatan estimasi yang berarti. Dalam kasus seperti itu, satu kali split yang cukup besar sering sudah memadai. Untuk data yang memiliki struktur kelompok, misalnya beberapa pengukuran dari pasien yang sama, gunakan GroupKFold agar data dari kelompok yang sama tidak muncul di data latih dan data uji sekaligus.
Pada proyek yang melibatkan banyak iterasi dan pelatihan berulang, mengelola pipeline dan eksperimen bisa menjadi rumit. Anda mungkin perlu merapikan struktur kode front-end atau alat bantu visualisasi. Pola-pola seperti jQuery untuk merapikan kode front-end bisa membantu saat membuat dasbor eksperimen sederhana. Jika proyek Anda juga menyentuh perangkat IoT, pertimbangkan pemilihan runtime yang tepat seperti dibahas dalam perbandingan .NET nanoFramework vs .NET IoT.
Untuk memperdalam alur kerja dari data mentah hingga evaluasi, lihat panduan 7 langkah membangun pipeline machine learning. Jika Anda baru mulai, artikel tips menyiapkan dataset untuk proyek pertama bisa menjadi titik awal yang baik.
Ringkasan
Cross-validation memberi estimasi performa yang lebih stabil karena setiap observasi pernah menjadi data uji. Pilih jenis cross-validation sesuai struktur data: StratifiedKFold untuk klasifikasi tidak seimbang, TimeSeriesSplit untuk deret waktu, dan GroupKFold untuk data berkelompok. Selalu bungkus praproses dalam pipeline untuk menghindari kebocoran data, dan simpan data uji terpisah untuk evaluasi akhir.
Pertanyaan yang Sering Diajukan
Berapa jumlah lipatan (k) yang ideal untuk cross-validation?
Nilai k=5 atau k=10 paling umum dipakai. k=10 memberi estimasi yang sedikit lebih stabil tetapi membutuhkan waktu komputasi hampir dua kali lipat dibanding k=5. Untuk dataset kecil, k yang lebih besar atau Leave-One-Out bisa dipertimbangkan.
Apakah cross-validation bisa dipakai untuk regresi?
Bisa. Untuk regresi, gunakan KFold biasa atau RepeatedKFold. Pastikan metrik yang dipakai sesuai, misalnya mean squared error atau R-squared, dan perhatikan apakah data memiliki struktur kelompok atau urutan waktu.
Bagaimana cara melaporkan hasil cross-validation yang baik?
Laporkan rata-rata skor beserta standar deviasi antar lipatan. Contoh: akurasi 0,94 +/- 0,02. Informasi variasi ini penting karena menunjukkan seberapa stabil model Anda terhadap perubahan pembagian data.


