GridSearchCV

Penalaan menyeluruh hyperparameter di atas pipeline.

Daftar isi

Topik ini membahas penalaan hyperparameter dengan GridSearchCV, yaitu proses mencari nilai argumen model yang memberi skor cross-validation terbaik. Pembahasan mencakup perbedaan hyperparameter dan parameter terlatih, mekanisme pencarian kisi (grid), serta alasan penalaan ditempatkan di atas Pipeline agar praproses ikut ditala tanpa kebocoran data. Contohnya menala kekuatan regularisasi LogisticRegression pada dataset breast cancer dan berakhir dengan model yang siap digunakan.

Hyperparameter dan parameter terlatih#

Dua hal berbeda tersimpan di dalam sebuah estimator, yaitu hyperparameter dan parameter terlatih. Hyperparameter adalah nilai yang ditetapkan sebelum pelatihan, misalnya C pada LogisticRegression yang mengatur kekuatan regularisasinya, sedangkan parameter terlatih adalah nilai yang dihitung dari data oleh metode fit, misalnya koefisien coef_. Nilai C yang tepat tidak dapat diketahui dari satu kali fit karena fit hanya menjawab bagaimana model seharusnya terpasang pada hyperparameter yang diberikan.

Kode berikut memasang LogisticRegression pada dataset iris, lalu menampilkan keduanya untuk menegaskan asal-usul masing-masing.

python Contoh: hyperparameter dan parameter terlatih pada LogisticRegression
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

X, y = load_iris(return_X_y=True)
model = LogisticRegression(max_iter=1000, C=1.0)
model.fit(X, y)

print("C ditetapkan sebelum fit (hyperparameter):", model.C)
print("coef_ dihasilkan oleh fit (parameter terlatih):", model.coef_[0].round(4))
text Keluaran
C ditetapkan sebelum fit (hyperparameter): 1.0
coef_ dihasilkan oleh fit (parameter terlatih): [-0.4201  0.9669 -2.519  -1.0846]

Keluarannya memperlihatkan keduanya. Nilai C tetap 1.0 persis seperti yang dimasukkan, sedangkan coef_ muncul sebagai hasil perhitungan fit terhadap data. Menyetel model berarti mencari hyperparameter yang, setelah fit dijalankan, menghasilkan parameter terlatih dengan kinerja terbaik pada data yang belum terlihat, dan pencarian itulah yang diotomatiskan oleh GridSearchCV.

Pemisahan kedua golongan ini menjelaskan mengapa penalaan tidak dapat diserahkan kepada fit. Metode fit tidak pernah mengubah hyperparameter karena nilainya berada di luar jangkauan optimasi yang dijalankannya, sehingga pencarian nilai terbaiknya dilakukan dari luar model. Caranya adalah mengulang fit pada berbagai nilai hyperparameter lalu membandingkan skor evaluasinya, dan pengulangan itulah yang perlu dikelola secara sistematis.

Cara kerja GridSearchCV#

GridSearchCV mencoba seluruh kombinasi nilai pada kisi yang diberikan melalui argumen param_grid, dan setiap kombinasi dievaluasi dengan cross-validation di dalam data latih. Dengan empat nilai C dan lima lipatan, totalnya dua puluh kali pelatihan, kemudian kombinasi dengan rata-rata skor tertinggi dinyatakan menang. Setelah itu, karena argumen refit bernilai True secara bawaan, estimator terbaik dilatih ulang pada seluruh data latih sehingga objek GridSearchCV dapat digunakan seperti estimator biasa, lengkap dengan predict dan score.

Hasil pencariannya tersedia pada tiga atribut utama. Atribut best_params_ memuat kombinasi pemenang, best_score_ memuat rata-rata skor CV kombinasi tersebut, dan cv_results_ menyimpan rincian seluruh kandidat dalam bentuk dictionary, dengan params berisi kombinasi tiap kandidat dan mean_test_score berisi rata-rata skornya. Karena penilaiannya berlangsung di atas beberapa lipatan dan bukan pada satu pemecahan, pemenangnya tidak mudah tergeser oleh keberuntungan satu lipatan tunggal.

Cara kerja tersebut menjadikan GridSearchCV alat penalaan yang paling langsung, yaitu menyatakan ruang pencarian secara eksplisit lalu menyerahkan pengulangan dan penilaiannya kepada scikit-learn. Ruang yang dinyatakan harus tetap terkendali karena biayanya tumbuh mengikuti hasil kali ukuran setiap sumbu kisi, dan pembatasan jumlah nilai per sumbu merupakan kedisiplinan yang diperlukan.

Penalaan di atas pipeline#

Penalaan yang membiarkan praproses berada di luar lipatan menghasilkan skor menggelembung karena scaler yang dipasang pada seluruh data telah menyerap informasi data uji tiap lipatan. Menaruh Pipeline di dalam GridSearchCV menyelesaikan persoalan itu sekaligus, karena setiap kandidat dievaluasi sebagai satu unit yang memasang ulang scaler hanya dari bagian latih setiap lipatannya. Praproses dengan demikian ikut ditala dalam kondisi yang jujur, dan kandidat yang menang tidak pernah diuntungkan oleh statistik data uji.

Parameter di dalam pipeline ditulis dengan awalan nama langkah dan dua garis bawah, misalnya model__C untuk parameter C milik langkah bernama model. Kode berikut menala empat nilai C pada pipeline StandardScaler dan LogisticRegression untuk dataset breast cancer, lalu mengukur model pemenangnya pada data uji yang disimpan terpisah sejak awal.

python penalaan-grid.py
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, StratifiedKFold, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

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.2, random_state=42, stratify=y
)

pipeline = Pipeline([
    ("scaler", StandardScaler()),
    ("model", LogisticRegression(max_iter=1000)),
])

param_grid = {"model__C": [0.01, 0.1, 1.0, 10.0]}
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

grid = GridSearchCV(pipeline, param_grid, cv=cv)
grid.fit(X_train, y_train)

print("best_params_:", grid.best_params_)
print(f"best_score_ : {grid.best_score_:.4f}")
print("Rata-rata skor CV per kandidat:")
for params, skor in zip(grid.cv_results_["params"], grid.cv_results_["mean_test_score"]):
    print(f"  C={params['model__C']:<6}: {skor:.4f}")
print(f"Akurasi data uji (model refit): {grid.score(X_test, y_test):.4f}")
text Keluaran
best_params_: {'model__C': 0.1}
best_score_ : 0.9824
Rata-rata skor CV per kandidat:
  C=0.01  : 0.9516
  C=0.1   : 0.9824
  C=1.0   : 0.9780
  C=10.0  : 0.9626
Akurasi data uji (model refit): 0.9737

Keluaran menunjukkan C=0.1 sebagai pemenang dengan best_score_ 0.9824, sedangkan kandidat C=0.01 justru dihukum karena regularisasinya terlalu kuat. Nilai 0.9824 adalah rata-rata skor CV dari kombinasi pemenang pada data latih, sedangkan 0.9737 pada baris terakhir adalah akurasi model refit pada data uji yang tidak pernah menyentuh penalaan sama sekali. Selisih kecil di antara keduanya wajar karena data uji hanya berisi 114 baris, sehingga satu prediksi saja berarti hampir satu poin persen.

Peringkat lengkap pada keluaran juga memperlihatkan bentuk permukaan skornya, yaitu naik dari 0.01 ke 0.1 lalu menurun perlahan menuju 10.0. Bentuk semacam ini berguna ketika kisi perlu dipersempit pada iterasi penalaan berikutnya, karena arah lembah skornya terbaca dari kandidat yang sudah dicoba.

Kesalahan umum#

  • Menala model mentah ketika praproses ikut digunakan. Scaler yang dipasang di luar lipatan membuat skor tiap kandidat menggelembung. Perbaikannya dengan menaruh Pipeline ke dalam GridSearchCV agar praproses ikut ditala.
  • Menulis nama parameter tanpa awalan langkah, misalnya C alih-alih model__C. Pencarian gagal berjalan karena parameter itu tidak dikenali pada objek pipeline dan error dilempar sebelum pelatihan. Perbaikannya dengan menyamakan awalannya dengan nama langkah pada pipeline.
  • Menganggap refit=False masih menghasilkan model siap pakai. Tanpa refit, objek hasil pencarian hanya berisi peringkat kandidat dan predict tidak dapat dipanggil. Perbaikannya dengan membiarkan refit=True atau memanggil fit ulang pada konfigurasi terbaik.

Ringkasan#

  • Hyperparameter ditetapkan sebelum fit, sedangkan parameter terlatih dihitung dari data oleh fit, dan penalaan hanya beroperasi pada golongan pertama.
  • GridSearchCV mengevaluasi seluruh kombinasi kisi dengan cross-validation di dalam data latih, lalu refit=True melatih ulang pemenang pada seluruh data latih sehingga objeknya siap digunakan.
  • Penalaan dilakukan di atas Pipeline dengan awalan langkah seperti model__C agar praproses ikut ditala tanpa kebocoran data.
  • best_params_, best_score_, dan cv_results_ menyediakan kombinasi pemenang, rata-rata skornya, dan peringkat seluruh kandidat.

Referensi#