Skip to main content

Hyperparameter Tuning by Hand (Manual)

Setelah membuat baseline model, langkah berikutnya adalah mencoba meningkatkan performa model dengan melakukan hyperparameter tuning.

Pada materi sebelumnya kita telah mempelajari bahwa terdapat beberapa cara untuk melakukan tuning:

  1. Tuning secara manual atau by hand.
  2. Menggunakan RandomizedSearchCV.
  3. Menggunakan GridSearchCV.

Pada materi ini kita akan fokus pada metode pertama:

Hyperparameter Tuning by Hand

Artinya, kita sendiri yang menentukan nilai hyperparameter, menjalankan model, mengevaluasi hasilnya, kemudian mencoba konfigurasi lainnya.

Secara sederhana:

Baseline Model
↓
Evaluate
↓
Ubah Hyperparameter
↓
Train Again
↓
Evaluate Again
↓
Bandingkan
↓
Ulangi

Pendekatan ini sederhana dan sangat baik untuk memahami bagaimana hyperparameter memengaruhi performa model sebelum menggunakan metode tuning otomatis.


Mengapa Membutuhkan Validation Set?​

Ketika kita hanya memiliki:

Training Set
Test Set

kita dapat menggunakan training set untuk melatih model dan test set untuk evaluasi.

Namun, jika kita terus-menerus melihat hasil test set untuk memilih hyperparameter terbaik, keputusan tuning secara tidak langsung mulai menyesuaikan model terhadap test set.

Karena itu, dalam konsep pembelajaran tiga pembagian data, kita dapat menggunakan:

Training Set
Validation Set
Test Set

Ketiga bagian tersebut memiliki fungsi berbeda.


Tiga Pembagian Data​

Secara umum:

Dataset
│
├───────────────┬───────────────┐
▼ ▼ ▼
Training Validation Test
70-80% 10-15% 10-15%
│ │ │
▼ ▼ ▼
Training Tuning Final
Model Selection Evaluation

Persentase tersebut bukan aturan mutlak.

Pembagian aktual dapat disesuaikan dengan ukuran dataset, karakteristik data, dan metode evaluasi yang digunakan.

hyperparameter


Training Set​

Training set adalah data yang digunakan model untuk mempelajari pola.

Contohnya:

70% Training Data

Model akan melakukan:

model.fit(X_train, y_train)

Data training digunakan untuk mempelajari parameter internal model.

Analogi sederhananya adalah:

Training set seperti materi perkuliahan atau catatan yang digunakan untuk belajar.


Validation Set​

Validation set digunakan untuk mengevaluasi model selama proses eksperimen dan membantu memilih konfigurasi model atau hyperparameter.

Contohnya:

15% Validation Data

Setelah model dilatih:

model.fit(X_train, y_train)

kita dapat mengevaluasinya:

y_valid_preds = model.predict(X_valid)

Kemudian:

evaluate_preds(
y_valid,
y_valid_preds
)

Validation set dapat dianalogikan sebagai:

Ujian latihan atau try out sebelum ujian akhir.

Kita dapat menggunakan hasil validation set untuk menentukan konfigurasi model yang akan digunakan.


Test Set​

Test set digunakan untuk evaluasi akhir terhadap model yang sudah dipilih.

Contohnya:

15% Test Data

Idealnya, test set tidak digunakan berulang kali untuk memilih hyperparameter.

Setelah proses tuning selesai:

Best Configuration
↓
Final Model
↓
Test Set
↓
Final Evaluation

Analogi sederhananya:

Test set seperti ujian akhir.


Analogi Train, Validation, dan Test​

Bayangkan kita sedang belajar untuk ujian.

Training
↓
Belajar materi

Validation
↓
Try Out
↓
Perbaiki strategi belajar

Test
↓
Ujian Akhir

Jika kita terus melihat soal ujian akhir selama belajar, hasil ujian tidak lagi menjadi evaluasi yang benar-benar independen.

Hal yang sama berlaku pada Machine Learning.


Parameter vs Hyperparameter​

Sebelum melakukan tuning, kita perlu mengingat kembali perbedaan antara parameter dan hyperparameter.

Parameters​

Parameter dipelajari oleh model dari data training.

Contohnya:

Model
↓
Training Data
↓
Learn Parameters

Contoh pada model linear:

weight
coefficient
intercept

Hyperparameters​

Hyperparameter merupakan konfigurasi yang kita tentukan untuk mengatur model.

Contohnya pada Random Forest:

RandomForestClassifier(
n_estimators=100,
max_depth=10
)

Beberapa hyperparameter yang dapat disesuaikan:

n_estimators
max_depth
max_features
min_samples_leaf
min_samples_split

RandomForestClassifier​

Pada materi ini kita menggunakan:

RandomForestClassifier

Random Forest merupakan ensemble method yang terdiri dari banyak decision tree.

Secara sederhana:

Random Forest
│
├── Decision Tree 1
├── Decision Tree 2
├── Decision Tree 3
├── Decision Tree 4
└── ...
│
▼
Final Prediction

Beberapa hyperparameter Random Forest dapat memengaruhi kompleksitas, kapasitas, dan proses pembentukan forest.


Hyperparameter n_estimators​

n_estimators menentukan jumlah tree yang digunakan dalam Random Forest.

Contoh:

RandomForestClassifier(
n_estimators=100
)

Artinya model menggunakan 100 decision tree.

Contoh konfigurasi:

n_estimators=50
n_estimators=100
n_estimators=200

Semakin besar nilai n_estimators, jumlah tree yang dilatih semakin banyak sehingga waktu dan sumber daya komputasi juga dapat meningkat.

Penambahan tree dapat membantu performa sampai titik tertentu, tetapi tidak berarti semakin banyak tree selalu menghasilkan peningkatan performa yang signifikan.


Hyperparameter max_depth​

max_depth menentukan kedalaman maksimum setiap decision tree.

Contoh:

RandomForestClassifier(
max_depth=5
)

atau:

RandomForestClassifier(
max_depth=10
)

Secara sederhana:

max_depth kecil
↓
Tree lebih dangkal
↓
Model lebih terbatas

max_depth besar
↓
Tree dapat lebih dalam
↓
Model dapat mempelajari pola lebih kompleks

Nilai yang terlalu kecil dapat menyebabkan model terlalu sederhana.

Nilai yang terlalu besar dapat meningkatkan kompleksitas dan berpotensi menyebabkan overfitting.


Hyperparameter max_features​

max_features menentukan jumlah fitur yang dipertimbangkan ketika mencari split pada node.

Contoh:

RandomForestClassifier(
max_features="sqrt"
)

atau nilai tertentu:

RandomForestClassifier(
max_features=5
)

Hyperparameter ini memengaruhi seberapa banyak fitur yang dipertimbangkan dalam proses pembentukan setiap tree.


Hyperparameter min_samples_leaf​

min_samples_leaf menentukan jumlah minimum sampel yang harus dimiliki oleh sebuah leaf node.

Contoh:

RandomForestClassifier(
min_samples_leaf=2
)

Jika nilai ini diperbesar, leaf harus memiliki lebih banyak sampel.

Secara umum, pengaturan ini dapat membantu membatasi kompleksitas tree.


Hyperparameter min_samples_split​

min_samples_split menentukan jumlah minimum sampel yang diperlukan agar sebuah node dapat dibagi menjadi child nodes.

Contoh:

RandomForestClassifier(
min_samples_split=5
)

Misalnya:

min_samples_split = 2

maka node dapat dibagi dengan minimal 2 sampel.

Jika:

min_samples_split = 10

maka diperlukan minimal 10 sampel agar node dapat dibagi.


Melihat Hyperparameters​

Scikit-Learn menyediakan:

get_params()

untuk melihat konfigurasi estimator.

Contoh:

from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()

clf.get_params()

Hasilnya berupa dictionary yang berisi berbagai konfigurasi.

Contoh sebagian:

{
'n_estimators': 100,
'criterion': 'gini',
'max_depth': None,
'min_samples_split': 2,
'min_samples_leaf': 1,
...
}

Nilai default dapat berbeda berdasarkan versi Scikit-Learn yang digunakan.


Mengambil Hyperparameter Tertentu​

Kita dapat menyimpan hasil get_params():

params = clf.get_params()

Kemudian mengambil nilai tertentu:

print(params["n_estimators"])

Contoh:

100

Kita juga dapat melihat:

print(params["max_depth"])

atau:

print(params["min_samples_split"])

Cara ini berguna untuk memeriksa konfigurasi model sebelum melakukan eksperimen.


Membuat Fungsi Evaluasi​

Ketika melakukan tuning secara manual, kita akan melatih dan mengevaluasi model berkali-kali.

Jika kita menulis kode evaluasi secara berulang:

accuracy_score(...)
precision_score(...)
recall_score(...)
f1_score(...)

kode dapat menjadi panjang dan berulang.

Untuk menghindarinya, kita dapat membuat sebuah fungsi.

Contoh:

from sklearn.metrics import (
accuracy_score,
precision_score,
recall_score,
f1_score
)

def evaluate_preds(y_true, y_preds):
accuracy = accuracy_score(y_true, y_preds)
precision = precision_score(y_true, y_preds)
recall = recall_score(y_true, y_preds)
f1 = f1_score(y_true, y_preds)

metric_dict = {
"accuracy": accuracy,
"precision": precision,
"recall": recall,
"f1": f1
}

print(f"Accuracy : {accuracy:.2f}")
print(f"Precision: {precision:.2f}")
print(f"Recall : {recall:.2f}")
print(f"F1 Score : {f1:.2f}")

return metric_dict

Sekarang fungsi tersebut dapat digunakan berkali-kali.


Prinsip DRY​

Pendekatan tersebut menerapkan prinsip:

DRY
Don't Repeat Yourself

Daripada menulis:

accuracy_score(...)
precision_score(...)
recall_score(...)
f1_score(...)

berulang kali untuk setiap model, kita cukup memanggil:

evaluate_preds(
y_valid,
y_valid_preds
)

Dengan demikian, eksperimen menjadi lebih mudah dibaca dan dipelihara.


Menyiapkan Dataset​

Misalnya kita memiliki DataFrame:

heart_disease

dengan target:

target

Kita dapat mengacak data terlebih dahulu.

heart_disease_shuffled = heart_disease.sample(
frac=1,
random_state=42
)

Parameter:

frac=1

berarti seluruh data digunakan, tetapi urutannya diacak.

random_state=42 membuat proses pengacakan dapat direproduksi.


Memisahkan Features dan Target​

Setelah data diacak, pisahkan features dan target dari DataFrame yang sudah diacak.

X = heart_disease_shuffled.drop(
"target",
axis=1
)

y = heart_disease_shuffled["target"]

Sekarang:

X → Features
y → Target

Hal ini penting karena kita nantinya menggunakan slicing:

X[:train_split]

dan:

y[:train_split]

Jika X dan y dibuat dari DataFrame asli yang belum diacak, maka pembagian data tidak mengikuti urutan heart_disease_shuffled.


Memeriksa Jumlah Data​

Kita dapat memeriksa jumlah seluruh data:

len(heart_disease_shuffled)

Misalnya hasilnya:

303

Kita kemudian akan membaginya menjadi:

Training → 70%
Validation → 15%
Test → 15%

Menghitung Batas Pembagian Data​

Kita dapat menentukan indeks batas menggunakan:

train_split = round(
0.7 * len(heart_disease_shuffled)
)

valid_split = round(
train_split + 0.15 * len(heart_disease_shuffled)
)

Misalnya jumlah data:

303

Maka:

70% × 303 ≈ 212
15% × 303 ≈ 45

Sehingga validation berakhir sekitar:

212 + 45 = 257

Data dapat dibagi menjadi:

0 ───────────────── 212 ───────────── 257 ─────────── 303
│ │ │ │
│ Training │ Validation │ Test │
│ 70% │ 15% │ 15% │

Full Code Pembagian Train, Validation, dan Test​

Berikut adalah kode lengkap untuk membagi data menjadi training, validation, dan test set secara manual:

# Shuffle the data
heart_disease_shuffled = heart_disease.sample(
frac=1,
random_state=42
)

# Separate features and target
X = heart_disease_shuffled.drop(
"target",
axis=1
)

y = heart_disease_shuffled["target"]

# Split data into train, validation & test sets
train_split = round(
0.7 * len(heart_disease_shuffled)
) # 70% of data

valid_split = round(
train_split + 0.15 * len(heart_disease_shuffled)
) # 15% of data

X_train, y_train = X[:train_split], y[:train_split]

X_valid, y_valid = (
X[train_split:valid_split],
y[train_split:valid_split]
)

X_test, y_test = X[valid_split:], y[valid_split:]

Kode tersebut menghasilkan enam variabel:

X_train
y_train

X_valid
y_valid

X_test
y_test

Pembagiannya:

X_train, y_train
↓
Training Set
70%

X_valid, y_valid
↓
Validation Set
15%

X_test, y_test
↓
Test Set
15%

Memeriksa Hasil Pembagian​

Setelah melakukan split, kita dapat memeriksa ukuran masing-masing dataset:

print(f"Training data : {X_train.shape}")
print(f"Validation data: {X_valid.shape}")
print(f"Test data : {X_test.shape}")

Kita juga dapat memeriksa target:

print(f"Training target : {y_train.shape}")
print(f"Validation target: {y_valid.shape}")
print(f"Test target : {y_test.shape}")

Untuk dataset dengan 303 samples, hasilnya kurang lebih:

Training data : (212, ...)
Validation data: (45, ...)
Test data : (46, ...)

Perbedaan satu sample dapat terjadi karena penggunaan round() pada batas indeks.


Mengapa Menggunakan round()?​

Pada kode:

train_split = round(
0.7 * len(heart_disease_shuffled)
)

kita mendapatkan indeks integer yang digunakan untuk slicing.

Misalnya:

0.7 × 303 = 212.1

Kemudian:

round(212.1)

menghasilkan:

212

Begitu juga dengan validation split.

Cara ini memudahkan pembagian data secara manual berdasarkan persentase.


Membuat Baseline Model​

Setelah data dibagi, kita dapat membuat baseline model.

Contoh:

from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(
random_state=42
)

Kemudian training:

clf.fit(
X_train,
y_train
)

Membuat Baseline Predictions​

Setelah model selesai dilatih:

y_valid_preds = clf.predict(
X_valid
)

Sekarang kita dapat mengevaluasi baseline.

baseline_metrics = evaluate_preds(
y_valid,
y_valid_preds
)

Contoh output:

Accuracy : 0.78
Precision: 0.80
Recall : 0.76
F1 Score : 0.78

Angka tersebut hanya contoh.

Yang penting adalah kita memiliki baseline sebagai titik pembanding.


Eksperimen Hyperparameter Pertama​

Sekarang kita dapat membuat model kedua.

Misalnya kita ingin mengubah:

n_estimators

menjadi:

100

Contoh:

clf_2 = RandomForestClassifier(
n_estimators=100,
random_state=42
)

Kemudian:

clf_2.fit(
X_train,
y_train
)

Buat prediksi:

y_valid_preds_2 = clf_2.predict(
X_valid
)

Kemudian evaluasi:

clf_2_metrics = evaluate_preds(
y_valid,
y_valid_preds_2
)

Membandingkan Baseline dan Model Kedua​

Misalnya:

Baseline

Accuracy : 0.78
Precision: 0.80
Recall : 0.76
F1 Score : 0.78

Model kedua:

n_estimators = 100

Accuracy : 0.81
Precision: 0.83
Recall : 0.78
F1 Score : 0.80

Kita dapat membandingkan hasil tersebut:

Metric Baseline Model 2
---------------------------------
Accuracy 0.78 0.81
Precision 0.80 0.83
Recall 0.76 0.78
F1 0.78 0.80

Dalam contoh tersebut, konfigurasi kedua menghasilkan nilai yang lebih tinggi pada metrik-metrik yang diamati.

Namun, keputusan model terbaik sebaiknya mempertimbangkan tujuan problem dan evaluasi yang digunakan, bukan hanya satu angka.


Mencoba Hyperparameter Lain​

Setelah mencoba:

n_estimators=100

kita dapat mencoba konfigurasi lain.

Misalnya:

clf_3 = RandomForestClassifier(
n_estimators=200,
random_state=42
)

Kemudian:

clf_3.fit(
X_train,
y_train
)

y_valid_preds_3 = clf_3.predict(
X_valid
)

clf_3_metrics = evaluate_preds(
y_valid,
y_valid_preds_3
)

Kita dapat mengulang proses tersebut untuk berbagai konfigurasi.


Eksperimen Beberapa Hyperparameter​

Tidak hanya n_estimators, kita juga dapat mencoba:

clf = RandomForestClassifier(
n_estimators=200,
max_depth=10,
min_samples_split=5,
min_samples_leaf=2,
random_state=42
)

Kemudian:

clf.fit(
X_train,
y_train
)

y_valid_preds = clf.predict(
X_valid
)

metrics = evaluate_preds(
y_valid,
y_valid_preds
)

Dengan cara ini kita dapat melihat pengaruh kombinasi beberapa hyperparameter.


Membuat Tabel Eksperimen​

Agar eksperimen lebih mudah dilacak, kita dapat membuat tabel:

Modeln_estimatorsmax_depthAccuracyPrecisionRecallF1
BaselineDefaultDefault0.780.800.760.78
Model 2100Default0.810.830.780.80
Model 3200100.820.840.790.81

Tabel seperti ini sangat membantu dalam proses eksperimen.


Mengapa Tuning by Hand Bisa Melelahkan?​

Bayangkan kita memiliki:

n_estimators → 5 pilihan
max_depth → 5 pilihan
min_samples_split → 5 pilihan
min_samples_leaf → 5 pilihan

Jumlah kombinasi:

5 × 5 × 5 × 5
= 625 kombinasi

Jika setiap konfigurasi harus dibuat dan diuji secara manual, prosesnya akan sangat panjang.

Kita juga berisiko:

  • Lupa konfigurasi yang sudah dicoba.
  • Salah mencatat hasil.
  • Menulis banyak kode yang sama.
  • Membutuhkan waktu lebih lama.
  • Tidak sistematis dalam mengeksplorasi ruang hyperparameter.

Kelebihan Tuning by Hand​

Meskipun sederhana, manual tuning memiliki beberapa kelebihan.

Mudah Dipahami​

Kita dapat melihat secara langsung:

Hyperparameter
↓
Model
↓
Training
↓
Evaluation

Hal ini sangat baik untuk belajar konsep hyperparameter.


Cocok untuk Eksperimen Kecil​

Jika hanya ingin mencoba beberapa konfigurasi:

n_estimators = 100
n_estimators = 200
n_estimators = 300

manual tuning masih cukup praktis.


Membantu Memahami Model​

Dengan mencoba nilai yang berbeda, kita dapat memahami bagaimana hyperparameter tertentu memengaruhi model.


Kekurangan Tuning by Hand​

Membutuhkan Banyak Waktu​

Semakin banyak hyperparameter, semakin banyak eksperimen yang harus dilakukan.


Sulit Jika Kombinasi Sangat Banyak​

Contoh:

10 × 10 × 10
= 1.000 kombinasi

Tidak praktis jika semuanya diuji secara manual.


Risiko Human Error​

Karena proses dilakukan manual, kita dapat:

  • Salah menulis nilai.
  • Salah mencatat hasil.
  • Lupa konfigurasi.
  • Salah membandingkan eksperimen.

Validation Set sebagai Dasar Pemilihan Model​

Selama proses tuning manual:

Training Set
↓
Train Model
↓
Validation Set
↓
Evaluate
↓
Ubah Hyperparameter
↓
Train Again
↓
Validation Again

Validation set digunakan untuk membantu memilih konfigurasi.

Setelah konfigurasi terbaik dipilih, test set dapat digunakan untuk evaluasi akhir.


Evaluasi Final pada Test Set​

Misalnya setelah beberapa eksperimen kita memilih konfigurasi:

best_model = RandomForestClassifier(
n_estimators=200,
max_depth=10,
random_state=42
)

Model tersebut kemudian dilatih pada data training yang sesuai:

best_model.fit(
X_train,
y_train
)

Setelah konfigurasi final dipilih, kita dapat mengevaluasi model pada test set:

y_test_preds = best_model.predict(
X_test
)

Kemudian:

final_metrics = evaluate_preds(
y_test,
y_test_preds
)

Test set digunakan sebagai evaluasi akhir yang tidak dijadikan target tuning berulang kali.


Catatan tentang Tiga Data Split​

Pembagian:

70% Train
15% Validation
15% Test

hanyalah contoh.

Tidak ada aturan universal bahwa dataset Machine Learning harus selalu dibagi persis seperti itu.

Pembagian aktual dapat disesuaikan dengan:

  • Ukuran dataset.
  • Karakteristik data.
  • Kebutuhan eksperimen.
  • Metode evaluasi.
  • Ketersediaan data.

Untuk dataset kecil, menyisihkan validation set secara manual dapat mengurangi jumlah data yang tersedia untuk training.

Dalam praktik modern, cross-validation sering digunakan sebagai alternatif untuk memperoleh estimasi validasi yang lebih efisien, terutama ketika data terbatas.


Workflow Lengkap Hyperparameter Tuning by Hand​

Secara keseluruhan:

Dataset
│
▼
Shuffle Data
│
▼
Split Train/Valid/Test
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Training Validation Test
│ │ │
▼ │ │
Baseline Model │ │
│ │ │
▼ │ │
Predictions ───────┘ │
│ │
▼ │
Evaluation │
│ │
▼ │
Change Hyperparameters │
│ │
▼ │
Train Again ───────────────────────┘
│
▼
Validation Evaluation
│
▼
Select Configuration
│
▼
Final Evaluation on Test Set

Full Code Hyperparameter Tuning by Hand​

Berikut contoh kode lengkap yang menggabungkan proses:

1. Shuffle data
2. Membuat X dan y
3. Membagi train, validation, dan test
4. Membuat fungsi evaluasi
5. Membuat baseline model
6. Membuat model dengan hyperparameter berbeda
7. Membandingkan hasil
import pandas as pd
import numpy as np

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import (
accuracy_score,
precision_score,
recall_score,
f1_score
)

# ==========================================
# 1. Shuffle the data
# ==========================================

heart_disease_shuffled = heart_disease.sample(
frac=1,
random_state=42
)

# ==========================================
# 2. Separate features and target
# ==========================================

X = heart_disease_shuffled.drop(
"target",
axis=1
)

y = heart_disease_shuffled["target"]

# ==========================================
# 3. Split data into train,
# validation & test sets
# ==========================================

train_split = round(
0.7 * len(heart_disease_shuffled)
) # 70% of data

valid_split = round(
train_split + 0.15 * len(heart_disease_shuffled)
) # 15% of data

X_train, y_train = X[:train_split], y[:train_split]

X_valid, y_valid = (
X[train_split:valid_split],
y[train_split:valid_split]
)

X_test, y_test = X[valid_split:], y[valid_split:]

# ==========================================
# 4. Evaluation function
# ==========================================

def evaluate_preds(y_true, y_preds):
accuracy = accuracy_score(
y_true,
y_preds
)

precision = precision_score(
y_true,
y_preds
)

recall = recall_score(
y_true,
y_preds
)

f1 = f1_score(
y_true,
y_preds
)

metrics = {
"accuracy": accuracy,
"precision": precision,
"recall": recall,
"f1": f1
}

print(f"Accuracy : {accuracy:.2f}")
print(f"Precision: {precision:.2f}")
print(f"Recall : {recall:.2f}")
print(f"F1 Score : {f1:.2f}")

return metrics

# ==========================================
# 5. Baseline model
# ==========================================

clf = RandomForestClassifier(
random_state=42
)

clf.fit(
X_train,
y_train
)

# Baseline predictions
y_valid_preds = clf.predict(
X_valid
)

# Baseline evaluation
baseline_metrics = evaluate_preds(
y_valid,
y_valid_preds
)

# ==========================================
# 6. Model with tuned hyperparameters
# ==========================================

clf_2 = RandomForestClassifier(
n_estimators=100,
random_state=42
)

clf_2.fit(
X_train,
y_train
)

# Predictions
y_valid_preds_2 = clf_2.predict(
X_valid
)

# Evaluation
clf_2_metrics = evaluate_preds(
y_valid,
y_valid_preds_2
)

# ==========================================
# 7. Another configuration
# ==========================================

clf_3 = RandomForestClassifier(
n_estimators=200,
max_depth=10,
random_state=42
)

clf_3.fit(
X_train,
y_train
)

# Predictions
y_valid_preds_3 = clf_3.predict(
X_valid
)

# Evaluation
clf_3_metrics = evaluate_preds(
y_valid,
y_valid_preds_3
)

# ==========================================
# 8. Display comparison
# ==========================================

results = pd.DataFrame({
"Baseline": baseline_metrics,
"Model 2": clf_2_metrics,
"Model 3": clf_3_metrics
})

print(results)

Kode tersebut menunjukkan pola dasar tuning manual:

Model 1
↓
Evaluate

Model 2
↓
Evaluate

Model 3
↓
Evaluate

Compare Results

Full Code Evaluasi Model Final​

Setelah melakukan beberapa eksperimen dan memilih konfigurasi model berdasarkan validation set, model final dapat dievaluasi pada test set.

Contoh:

# Create final model using the selected configuration
final_model = RandomForestClassifier(
n_estimators=200,
max_depth=10,
random_state=42
)

# Train final model
final_model.fit(
X_train,
y_train
)

# Make predictions on test data
y_test_preds = final_model.predict(
X_test
)

# Final evaluation
final_metrics = evaluate_preds(
y_test,
y_test_preds
)

print("\nFinal Test Metrics:")
print(final_metrics)

Alurnya:

Training Set
│
▼
Final Model
│
▼
Test Set
│
▼
Final Predictions
│
▼
Final Metrics

Test set pada tahap ini digunakan untuk memperoleh gambaran performa akhir model terhadap data yang tidak digunakan untuk memilih konfigurasi selama tuning.


Mengapa Test Set Tidak Digunakan Saat Tuning?​

Misalnya kita melakukan:

Model A → Test Score
Model B → Test Score
Model C → Test Score
Model D → Test Score

Kemudian memilih model berdasarkan test score.

Walaupun model tidak dilatih langsung menggunakan test set, keputusan kita sudah menggunakan informasi dari test set.

Jika proses tersebut dilakukan berkali-kali, test set tidak lagi menjadi evaluasi akhir yang benar-benar independen.

Lebih baik:

Training Set
↓
Training

Validation Set
↓
Tuning & Selection

Test Set
↓
Final Evaluation

Kelebihan Tuning by Hand​

Meskipun sederhana, manual tuning memiliki beberapa kelebihan.

Mudah Dipahami​

Kita dapat melihat secara langsung:

Hyperparameter
↓
Model
↓
Training
↓
Evaluation

Hal ini sangat baik untuk belajar konsep hyperparameter.


Cocok untuk Eksperimen Kecil​

Jika hanya ingin mencoba beberapa konfigurasi:

n_estimators = 100
n_estimators = 200
n_estimators = 300

manual tuning masih cukup praktis.


Membantu Memahami Model​

Dengan mencoba nilai yang berbeda, kita dapat memahami bagaimana hyperparameter tertentu memengaruhi model.


Kekurangan Tuning by Hand​

Membutuhkan Banyak Waktu​

Semakin banyak hyperparameter, semakin banyak eksperimen yang harus dilakukan.


Sulit Jika Kombinasi Sangat Banyak​

Contoh:

10 × 10 × 10
= 1.000 kombinasi

Tidak praktis jika semuanya diuji secara manual.


Risiko Human Error​

Karena proses dilakukan manual, kita dapat:

  • Salah menulis nilai.
  • Salah mencatat hasil.
  • Lupa konfigurasi.
  • Salah membandingkan eksperimen.

Checklist Hyperparameter Tuning by Hand​

Sebelum melakukan tuning manual, pastikan:

  • Sudah memiliki baseline model.
  • Training set sudah ditentukan.
  • Validation set sudah ditentukan.
  • Test set disimpan untuk evaluasi akhir.
  • Metric evaluasi sudah ditentukan.
  • Hyperparameter yang akan diuji sudah ditentukan.
  • Setiap eksperimen dicatat.
  • Konfigurasi dibandingkan menggunakan prosedur evaluasi yang konsisten.
  • Tidak menggunakan test set sebagai target tuning berulang kali.
  • Model final dievaluasi pada test set setelah proses tuning selesai.

Ringkasan​

Hyperparameter tuning by hand merupakan pendekatan paling sederhana untuk melakukan optimasi model.

Prosesnya:

1. Buat baseline
2. Train model
3. Evaluasi validation set
4. Ubah hyperparameter
5. Train kembali
6. Evaluasi kembali
7. Bandingkan hasil
8. Pilih konfigurasi
9. Evaluasi final pada test set

Pada RandomForestClassifier, beberapa hyperparameter yang dapat diuji adalah:

n_estimators
max_depth
max_features
min_samples_leaf
min_samples_split

Untuk menghindari pengulangan kode evaluasi, kita dapat membuat fungsi:

evaluate_preds()

Kemudian menggunakannya pada setiap eksperimen.


Cheat Sheet​

Shuffle Data​

heart_disease_shuffled = heart_disease.sample(
frac=1,
random_state=42
)

Membuat Features dan Target​

X = heart_disease_shuffled.drop(
"target",
axis=1
)

y = heart_disease_shuffled["target"]

Membagi Data​

train_split = round(
0.7 * len(heart_disease_shuffled)
)

valid_split = round(
train_split + 0.15 * len(heart_disease_shuffled)
)

X_train, y_train = X[:train_split], y[:train_split]

X_valid, y_valid = (
X[train_split:valid_split],
y[train_split:valid_split]
)

X_test, y_test = X[valid_split:], y[valid_split:]

Membuat Model​

model = RandomForestClassifier(
n_estimators=200,
max_depth=10,
random_state=42
)

Training​

model.fit(
X_train,
y_train
)

Prediction​

y_valid_preds = model.predict(
X_valid
)

Evaluation​

evaluate_preds(
y_valid,
y_valid_preds
)

Melihat Hyperparameters​

model.get_params()

Evaluasi Final​

y_test_preds = model.predict(
X_test
)

evaluate_preds(
y_test,
y_test_preds
)

Kesimpulan​

Hyperparameter tuning by hand membantu kita memahami bahwa performa model Machine Learning dapat dipengaruhi oleh konfigurasi hyperparameter.

Prosesnya dilakukan secara iteratif:

Baseline
↓
Evaluation
↓
Change Hyperparameter
↓
Training
↓
Validation
↓
Compare
↓
Repeat

Dalam pendekatan tiga pembagian data:

Training Set
↓
Melatih model

Validation Set
↓
Memilih dan menyesuaikan model

Test Set
↓
Evaluasi akhir

Beberapa hyperparameter RandomForestClassifier yang dapat dieksperimenkan antara lain:

n_estimators
max_depth
max_features
min_samples_leaf
min_samples_split

Tuning secara manual sangat berguna untuk memahami konsep dasar, tetapi menjadi semakin tidak efisien ketika jumlah kombinasi hyperparameter bertambah.

Karena itu, setelah memahami tuning secara manual, kita dapat menggunakan pendekatan otomatis dari Scikit-Learn:

RandomizedSearchCV
GridSearchCV

Kedua metode tersebut memungkinkan proses pencarian hyperparameter dilakukan secara lebih sistematis dengan memanfaatkan cross-validation.

Pada Materi Berikutnya​

Pada materi berikutnya kita akan mempelajari Hyperparameter Tuning menggunakan RandomizedSearchCV, mulai dari membuat param_distributions, menentukan jumlah percobaan dengan n_iter, menggunakan cross-validation, menentukan scoring, hingga mendapatkan konfigurasi terbaik melalui best_params_.