Setiap model machine learning membawa dua lapis pengaturan yang sering tertukar, yaitu parameter yang dipelajari dari data dan hyperparameter yang ditetapkan sebelum pelatihan dimulai. Topik ini memisahkan kedua lapis itu secara tegas, menjelaskan mengapa penalaan (tuning) hanya menyentuh hyperparameter, dan menunjukkan keduanya pada scikit-learn menggunakan dataset breast cancer. Praktiknya berupa satu skrip yang membaca koefisien LogisticRegression sebagai contoh parameter, kemudian mengukur efek max_depth pada pohon keputusan sebagai contoh hyperparameter.
Dua lapis pengaturan model#
Parameter adalah nilai internal model yang disesuaikan oleh algoritma pelatihan pada data latih. Contohnya koefisien dan intersep pada regresi logistik, ambang pembelahan pada pohon keputusan, serta bobot pada jaringan saraf. Pelatihan adalah proses mencari nilai parameter yang meminimalkan fungsi biaya, dan hasilnya itulah isi model yang bekerja saat prediksi dijalankan.
Hyperparameter adalah pengaturan yang menentukan bagaimana pencarian parameter itu dijalankan, dan nilainya ditulis oleh pemodel sebelum pelatihan. Contohnya max_depth yang membatasi kedalaman pohon, C yang mengatur kekuatan regularisasi, dan n_estimators yang menetapkan banyaknya pohon pada random forest. Algoritma pelatihan tidak pernah mengubah nilai hyperparameter, karena hyperparameter berada di luar jangkauan proses penurunan gradien maupun pembelahan pohon.
| Aspek | Parameter | Hyperparameter |
|---|---|---|
| Penentu nilai | Algoritma pelatihan pada data latih | Ditulis sebelum pelatihan |
| Contoh pada scikit-learn | coef_, intercept_, ambang pembelahan pohon | max_depth, C, n_estimators |
| Cara mengubahnya | Latih ulang model | Atur nilainya, lalu latih ulang |
| Sasaran penalaan | Bukan | Ya |
Pembagian di atas menjelaskan letak kerja penalaan. Karena parameter sudah diurus oleh pelatihan, satu-satunya lapis yang tersisa bagi pemodel untuk dikendalikan adalah hyperparameter. Penalaan dengan demikian adalah pencarian kombinasi hyperparameter, sedangkan setiap pencobaannya tetap membiarkan pelatihan menyesuaikan parameter pada data latihnya sendiri.
Kedudukan keduanya dalam penalaan#
Saat max_depth dinaikkan dari tiga menjadi lima, yang berubah adalah batas ruang parameter yang boleh dijelajahi pohon, bukan nilai parameternya. Pelatihan tetap yang memilih ambang pembelahan terbaik di dalam batas itu. Dengan kata lain, hyperparameter menetapkan batas yang tersedia, sedangkan pelatihan menentukan nilai parameter di dalam batas tersebut. Kerancuan ini membuat penalaan sering dikira pekerjaan pelatihan, padahal keduanya berada pada lapis yang berbeda.
Hyperparameter juga menjadi tuas utama mengendalikan kapasitas model, yaitu kemampuannya menyerap pola yang makin rumit. Pohon dengan max_depth=None bebas menghafal seluruh data latih sehingga rentan overfitting, sedangkan pohon yang terlalu dangkal gagal menangkap pola dan mengalami underfitting. Penalaan mencari titik tengah di antara dua kutub itu. Titik tengah tersebut hanya dapat ditemukan melalui pengukuran pada data yang bukan data latih, misalnya data validasi atau cross-validation.
scikit-learn menampung kedua lapis pada tempat yang berbeda. Parameter terbaca dari atribut model setelah pelatihan, sedangkan hyperparameter terbaca dari argumen konstruktor sebelum pelatihan. Konvensi penamaannya konsisten, yaitu atribut yang diakhiri garis bawah seperti coef_ dan intercept_ baru terisi setelah metode fit selesai dijalankan.
Membaca keduanya pada scikit-learn#
Skrip berikut memisahkan kedua lapis pada dataset breast cancer. Bagian pertamanya melatih LogisticRegression di atas fitur terskalakan, lalu mencetak bentuk coef_ dan intercept_ sebagai parameter hasil pelatihan bersama hyperparameter C yang tidak tersentuh pelatihan. Bagian keduanya melatih DecisionTreeClassifier dengan lima nilai max_depth, kemudian membandingkan akurasi data latih dan data uji untuk setiap nilai tersebut. Skrip dijalankan dari direktori topiknya dengan python3 -B parameter-vs-hyperparameter.py.
"""Memisahkan parameter yang disesuaikan pelatihan dari hyperparameter yang ditetapkan."""
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
X, y = load_breast_cancer(return_X_y=True)
X_latih, X_uji, y_latih, y_uji = train_test_split(
X, y, test_size=0.20, random_state=42, stratify=y
)
# parameter: nilai yang disesuaikan oleh proses pelatihan
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=5000))
model.fit(X_latih, y_latih)
logreg = model.named_steps["logisticregression"]
print(f"Jumlah fitur : {X.shape[1]}")
print(f"Bentuk koefisien (coef_) : {logreg.coef_.shape}")
print(f"Bentuk intersep (intercept_) : {logreg.intercept_.shape}")
koef = ", ".join(f"{v:.4f}" for v in logreg.coef_[0][:3])
print(f"Tiga koefisien pertama : {koef}")
print(f"Hyperparameter C : {logreg.C} (tetap, tidak diubah pelatihan)")
# hyperparameter: nilai yang ditetapkan sebelum pelatihan dimulai
print()
print("Efek hyperparameter max_depth pada DecisionTreeClassifier:")
print(f"{'max_depth':>9} | {'akurasi latih':>13} | {'akurasi uji':>11}")
for kedalaman in (1, 2, 3, 5, None):
pohon = DecisionTreeClassifier(max_depth=kedalaman, random_state=42)
pohon.fit(X_latih, y_latih)
print(
f"{str(kedalaman):>9} | {pohon.score(X_latih, y_latih):>13.4f} | "
f"{pohon.score(X_uji, y_uji):>11.4f}"
)Jumlah fitur : 30
Bentuk koefisien (coef_) : (1, 30)
Bentuk intersep (intercept_) : (1,)
Tiga koefisien pertama : -0.5115, -0.5527, -0.4763
Hyperparameter C : 1.0 (tetap, tidak diubah pelatihan)
Efek hyperparameter max_depth pada DecisionTreeClassifier:
max_depth | akurasi latih | akurasi uji
1 | 0.9231 | 0.9211
2 | 0.9582 | 0.8947
3 | 0.9758 | 0.9386
5 | 0.9934 | 0.9211
None | 1.0000 | 0.9123Bagian pertama menunjukkan bahwa regresi logistik pada 30 fitur menyimpan 30 koefisien dan satu intersep, sehingga modelnya memuat 31 parameter dan semuanya ditentukan oleh pelatihan. Nilai C tercetak 1.0 karena nilai itu ditetapkan pada konstruktor, dan pelatihan hanya menggunakannya tanpa mengubahnya. Bagian kedua memperlihatkan pola yang khas. Akurasi data latih naik terus dari 0.9231 hingga 1.0000 ketika max_depth dilonggarkan, sedangkan akurasi data uji berpuncak pada max_depth=3 sebesar 0.9386 lalu menurun kembali. Pohon tanpa batas kedalaman menghafal data latih sempurna tetapi hanya mencapai 0.9123 pada data uji.
Puncak pada nilai tengah itulah wilayah yang dicari penalaan. Kolom data uji pada tabel hanya ditampilkan untuk demonstrasi, karena penilaian yang sah dilakukan pada data validasi atau melalui cross-validation, bukan pada data uji yang disisihkan untuk evaluasi akhir. Dengan pemisahan tersebut, kombinasi hyperparameter terpilih dinilai oleh data yang tidak ikut menentukan pemilihannya.
Kesalahan umum#
- Menganggap semua angka dalam model sebagai parameter.
C,max_depth, dann_estimatorstidak pernah diubah oleh pelatihan, sehingga mencari nilai terbaiknya adalah pekerjaan penalaan yang menuntut pencobaan terpisah. Perbaikannya adalah membedakan atribut berakhiran garis bawah dari argumen konstruktor. - Mengubah hyperparameter sambil memantau skor data uji. Setelah beberapa kali digunakan, data uji tidak lagi netral karena pilihannya ikut menentukan keputusan penalaan. Penilaian dilakukan pada data validasi atau cross-validation.
- Mengubah hyperparameter pada model yang sudah dilatih tanpa melatih ulang. Nilai
max_depthhanya dibaca ketika pohon dibentuk, sehingga mengubahnya setelahfittidak menggeser skor sama sekali. Setiap nilai diuji pada model baru yang dilatih dari awal. - Menala
random_stateseperti hyperparameter model.random_statehanya mengatur pengacakan dan tidak mengubah perilaku model, sehingga kombinasi terbaiknya hanya mencerminkan keberuntungan seed.random_statedipatok tetap, sedangkan ketidakpastian pengacakan diukur melalui cross-validation. - Menyamakan skor data latih yang tinggi dengan model yang baik. Kenaikan
max_depthselalu menaikkan skor data latih, padahal skor data uji pada keluaran di atas justru menurun setelah puncaknya. Kombinasi hyperparameter diputuskan dari skor data yang tidak ikut dilatih.
Ringkasan#
- Parameter disesuaikan oleh algoritma pelatihan pada data latih, sedangkan hyperparameter ditetapkan sebelum pelatihan dan tidak pernah diubah olehnya.
- Pada scikit-learn, parameter terbaca dari atribut berakhiran garis bawah seperti
coef_danintercept_, sedangkan hyperparameter terbaca dari argumen konstruktor danget_params(). - Penalaan hanya bekerja pada hyperparameter karena lapis itulah satu-satunya yang tidak diurus pelatihan.
- Tabel
max_depthmemperlihatkan akurasi latih yang naik terus dan akurasi uji yang berpuncak pada nilai tengah, yaitu wilayah yang dikejar penalaan.
Referensi#
- Tuning the hyper-parameters of an estimator — scikit-learn — Panduan resmi penalaan hyperparameter beserta ruang pencarian dan skor pembandingnya.
- sklearn.linear_model.LogisticRegression — scikit-learn
— Dokumentasi model contoh dengan atribut parameter
coef_beserta hyperparameterC. - sklearn.tree.DecisionTreeClassifier — scikit-learn
— Dokumentasi pohon keputusan beserta daftar hyperparameter seperti
max_depthdanmin_samples_leaf.