Cross-Validation dalam Machine Learning

Dalam proses membangun model machine learning, salah satu tantangan utama adalah memastikan model dapat menggeneralisasi dengan baik terhadap data baru. Model yang terlihat bagus pada data training belum tentu baik pada data dunia nyata.
Untuk mengevaluasi kualitas model secara akurat, kita menggunakan teknik cross-validation.

Apa Itu Cross-Validation?

Cross-validation adalah teknik evaluasi model yang membagi dataset menjadi beberapa bagian (fold) untuk digunakan sebagai data training dan testing secara bergantian.

Tujuan utamanya:

  • Mengukur performa model secara lebih stabil.
  • Mengurangi risiko overfitting.
  • Memastikan model bekerja baik untuk data yang belum pernah dilihat.

Daripada hanya sekali membagi data menjadi train-test (misalnya 80:20), cross-validation melakukan evaluasi berulang kali sehingga hasilnya lebih reliable.

Mengapa Cross-Validation Penting?

1. Evaluasi yang Lebih Akurat

Satu kali train-test split bisa bias. Cross-validation mengurangi bias dengan menguji model pada berbagai subset data.

2. Menghemat Data

Dataset kecil sering kesulitan menyediakan data test yang cukup. Dengan cross-validation, setiap data berkesempatan menjadi data test.

3. Lebih Stabil dan Konsisten

Hasil evaluasi rata-rata dari beberapa fold biasanya lebih mewakili performa sebenarnya.

4. Mendukung Hyperparameter Tuning

Metode seperti Grid Search dan Random Search hampir selalu menggunakan cross-validation.

Cara Kerja Cross-Validation

Misalnya Anda menggunakan k-fold cross-validation dengan k = 5.

  1. Dataset dibagi menjadi 5 bagian (fold).
  2. Pada iterasi pertama:
    • Fold 1 → test set
    • Fold 2–5 → training set
  3. Iterasi kedua:
    • Fold 2 → test set
    • Fold lainnya → training
  4. Lakukan hingga 5 iterasi.
  5. Ambil rata-rata akurasi dari 5 percobaan.

Dengan ini, setiap data diuji sekali.

Jenis-Jenis Cross-Validation

Ada beberapa varian yang digunakan sesuai kebutuhan:

K-Fold Cross-Validation (paling populer)

Dataset dibagi menjadi K bagian dengan ukuran sama, lalu model dilatih & diuji sebanyak K kali.

Contoh K yang umum: 5 atau 10.

Kelebihan:

  • Akurat
  • Stabil
  • Tidak boros data

Kekurangan:

  • Waktu training meningkat K kali lebih lama

Stratified K-Fold Cross-Validation

Mirip K-Fold, tapi menjaga komposisi class tetap proporsional di setiap fold.

Leave-One-Out Cross-Validation (LOOCV)

Setiap data tunggal menjadi test set.

Jika dataset punya 200 row → model dilatih 200 kali.

Kelebihan:

  • Sangat akurat untuk dataset kecil

Kekurangan:

Sangat mahal secara komputasiSangat penting untuk dataset imbalanced (contoh: fraud detection, medical diagnosis).

Hold-Out Cross-Validation

Versi paling sederhana: membagi dataset menjadi:

  • Training (misalnya 80%)
  • Testing (20%)

Tidak termasuk teknik “berulang”, tapi tetap termasuk metode split.

Repeated K-Fold Cross-Validation

K-Fold biasa → diulang beberapa kali dengan pembagian berbeda.

Contoh:

  • K=5
  • Repeated=3
    → Total train-test = 15 kali

Lebih stabil daripada K-Fold biasa.

Time Series Split (untuk data berurutan)

Tidak boleh shuffle data.
Menggunakan expanding window seperti:

  • Train: 1 → Test: 2
  • Train: 1-2 → Test: 3
  • Train: 1-3 → Test: 4
  • dan seterusnya

Sangat penting untuk forecasting dan data time series lainnya.

Contoh Implementasi Cross-Validation (Scikit-learn)

K-Fold

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier()
kfold = KFold(n_splits=5)

scores = cross_val_score(model, X, y, cv=kfold)
print(scores.mean())

Stratified K-Fold

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True)
scores = cross_val_score(model, X, y, cv=skf)

Time Series Split

from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)
scores = cross_val_score(model, X, y, cv=tscv)

Best Practices Cross-Validation

  • Gunakan Stratified K-Fold untuk klasifikasi supaya distribusi kelas tetap seimbang.
  • Gunakan TimeSeriesSplit untuk data time series. Jangan pernah shuffle data.
  • Gunakan K = 5 atau 10 sebagai nilai default. K=5 memberi hasil stabil dan cepat.
  • Gunakan Cross-validation untuk hyperparameter tuning, GridSearchCV & RandomizedSearchCV memakai ini.
  • Jangan gunakan cross-validation pada data yang sudah displit secara hierarkis. Contoh penggunaan yang salah: data dari user yang sama muncul di train & test.

Kesimpulan

Cross-validation adalah teknik evaluasi yang sangat penting dalam machine learning karena:

  • memberikan estimasi performa yang lebih stabil,
  • mengurangi overfitting,
  • membantu pemilihan model & hyperparameter,
  • dapat beradaptasi untuk berbagai jenis dataset, termasuk time series.

Dengan memahami berbagai jenis cross-validation dan kapan menggunakannya, Anda dapat membangun model yang lebih andal dan robust terhadap data nyata.