Tuning Hyperparameter Model Random Forest dengan Bayesian Optimization
Tuning hyperparameter adalah proses penting dalam pengembangan model-model machine learning termasuk Random Forest. Penentuan hyperparameter yang tepat dapat meningkatkan performa model secara signifikan, sebaliknya pemilihan yang kurang tepat dapat mengurangi akurasi prediksi. Terdapat beberapa teknik yang biasa digunakan meliputi Grid Search, Random Search dan Bayesian Optimization.
Bayesian Optimization merupakan salah satu teknik tuning hyperparameter model dengan pendekatan probabilistik untuk mencari kombinasi hyperparameter optimal dengan efisien. Teknik ini bekerja dengan menggunakan memodelkan fungsi objektif yang akan dioptimalkan dengan sebaran tertentu, kemudian menggunakan model ini untuk mengarahkan pencarian hyperparameter yang lebih baik. Dengan penentuan eksplorasi dan eksploitasi secara cerdas, Bayesian Optimization dapat menemukan hyperparameter yang optimal dengan lebih sedikit pengulangan dibandingkan metode seperti grid search atau random search.
Pada tutorial ini, kita akan membahas penggunaan Bayesian Optimization untuk tuning hyperparameter model Random Forest dengan Python. Pustaka yang akan digunakan untuk Bayesian Optimization adalah scikit-optimize
(skopt
) dan untuk model Random Forest akan menggunakan pustaka scikit-learn
.
Penyiapan Pustaka
Sebelum memulai pemodelan, kita perlu menyiapkan dua pustaka tersebut yaitu scikit-learn
dan scikit-optimize
. Keduanya dapat di-install menggunakan pip
dengan sintaks berikut:
Python
pip install scikit-learn scikit-optimize
Selanjutnya, kita mengimpor setiap pustaka yang dibutuhkan seperti yang disajikan berikut ini:
Python
# manipulasi dan pemrosesan data import numpy as np import pandas as pd # pembagian data from sklearn.model_selection import train_test_split # metrik evaluasi model klasifikasi from sklearn.metrics import accuracy_score, confusion_matrix, classification_report # model random forest from sklearn.ensemble import RandomForestClassifier # Bayesian Optimization from skopt import BayesSearchCV from skopt.space import Real, Integer
Memuat Dataset
Dataset yang akan digunakan adalah data Wine Quality yang sudah dimodifikasi menjadi klasifikasi biner. Dataset terdiri dari 1.143 observasi dengan 10 fitur (tanpa kolom id
) dan 1 peubah respon yaitu quality
(HIGH
atau LOW
). Jumlah observasi menurut kelas respon relatif seimbang serta tidak terdapat missing value pada seluruh observasi.
Dalam pemodelan, sangat disarankan untuk melakukan eksplorasi data secara mendalam agar memahami karakteristik data dengan lebih baik. Namun pada tulisan ini kita akan fokus pada tahapan pemodelan dan tuning hyperparameter menggunakan Bayesian Optimization. Silahkan pembaca melakukan eksplorasi secara mandiri jika diinginkan.
Python
# Memuat dataset dari URL url = "https://raw.githubusercontent.com/sainsdataid/dataset/main/wine-quality-binary.csv" data = pd.read_csv(url) # Melihat struktur data data.info() # Menghapus kolom 'id' data.drop(columns='id') # Melihat jumlah observasi per kelas respon print(data.groupby("quality").agg({"quality":"count"}))
# OUTPUT <class 'pandas.core.frame.DataFrame'> RangeIndex: 1143 entries, 0 to 1142 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 1143 non-null int64 1 fixed.acidity 1143 non-null float64 2 volatile.acidity 1143 non-null float64 3 citric.acid 1143 non-null float64 4 residual.sugar 1143 non-null float64 5 chlorides 1143 non-null float64 6 free.sulfur.dioxide 1143 non-null float64 7 total.sulfur.dioxide 1143 non-null float64 8 density 1143 non-null float64 9 pH 1143 non-null float64 10 sulphates 1143 non-null float64 11 alcohol 1143 non-null float64 12 quality 1143 non-null object dtypes: float64(11), int64(1), object(1) memory usage: 116.2+ KB quality quality HIGH 621 LOW 522
Pembagian Data Latih dan Data Uji
Pada langkah ini, dataset dibagi menjadi dua bagian: data latih dan data uji. Data latih (70% dari total data) digunakan untuk melatih model, sedangkan data uji (30% dari total data) digunakan untuk mengevaluasi kinerja model. Pembagian ini penting untuk memastikan bahwa model dapat digeneralisasikan dengan baik dan tidak overfitting pada data latih.
Python
# Memisahkan fitur dan respon X = data.drop(columns='quality') y = data['quality'] # Membagi dataset menjadi data latih dan data uji X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123)
Ruang Hyperparameter
Hyperparameter adalah parameter yang nilainya tidak dipelajari dari data. Berbeda dengan parameter model (seperti bobot dalam neural network) atau keofisen pada model regresi, hyperparameter ditentukan sebelum proses pelatihan dimulai dan sangat mempengaruhi kinerja model. Oleh karena itu, pemilihan hyperparameter yang tepat dapat memberikan hasil model dengan kinerja optimal.
Model random forest memiliki beberapa hyperparameter utama seperti jumlah pohon (n_estimators
), kedalaman pohon (max_depth
), jumlah maksimal fitur untuk penentuan splitting (max_features
) dan sebagainya. Untuk mendapatkan performa terbaik, kita perlu melakukan tuning hyperparameter ini. Dalam Bayesian Optimization, kita mendefinisikan ruang pencarian hyperparameter berupa rentang nilai atau daftar nilai setiap hyperparameter yang menjadi dasar pencarian.
Pada contoh berikut kita akan melakukan pencarian untuk 5 hyperparameter yaitu:
n_estimators
: jumlah pohon (100 hingga 500).max_depth
: kedalaman maksimal pohon (2 hingga 20).min_samples_split
: jumlah minimal sampel yang diperlukan untuk membagi node (2 hingga 20).min_samples_leaf
: jumlah minimal sampel yang harus ada pada daun node (1 hingga 20).max_features
: jumlah fitur yang dipertimbangkan pada pembagian setiap node (2 hingga 10 fitur).
Python
# ruang hyperparameter param_space = { 'n_estimators': Integer(100, 500), 'max_depth': Integer(2, 20), 'min_samples_split': Integer(2, 20), 'min_samples_leaf': Integer(1, 20), 'max_features': Integer(2, 11) }
Bayesian Optimization
Pertama, kita buat model awal Random Forest dengan menggunakan seluruh nilai parameter secara default. Model random forest untuk klasifikasi dapat dibuat menggunakan RandomForestClassifier
dari modul sklearn.ensemble
. Selanjutnya, dengan menggunakan BayesSearchCV
kita lakukan pencarian hyperparameter dengan pengaturan sebagai berikut:
estimator=model_rf
: Model yang akan dioptimalkan, dalam hal ini adalahRandomForestClassifier
.search_spaces=param_space
: Ruang pencarian hyperparameter yang telah kita definisikan sebelumnya untuk memberitahuBayesSearchCV
hyperparameter mana yang akan dioptimalkan dan rentang nilainya.n_iter=50
: Jumlah iterasi yang akan dijalankan dalam proses optimasi. Nilai ini menentukan berapa banyak kombinasi hyperparameter yang akan diuji. Semakin banyak iterasi, semakin besar kemungkinan menemukan kombinasi hyperparameter optimal, tetapi juga semakin banyak waktu komputasi yang dibutuhkan.cv=3
: Jumlah fold dalam proses cross-validation. Nilai ini berarti data pelatihan akan dibagi menjadi 3 bagian, dan model akan dilatih dan divalidasi sebanyak 3 kali dengan bagian data yang berbeda. Cross-validation membantu memastikan model tidak overfitting pada satu bagian data tertentu dan memberikan evaluasi yang lebih robust terhadap kinerja model.random_state=42
: Menetapkan seed tertentu untuk generator bilangan acak agar hasil yang diperoleh dapat direproduksin_jobs=-1
: Proses komputasi akan menggunakan seluruh processor yang tersedia
Berdasarkan hasil pencarian pada ruang hyperaparameter, dalam 50 iterasi kita memperoleh model terbaik dengan mengatur nilai max_depth=17
, max_features=7
, min_sample_leaf=1
, min_sample_split=2
dan n_estimators=500
. Akurasi model dengan pengaturan tersebut menggunakan validasi silang pada data latih adalah sebesar 0,790
.
Python
# membuat model awal (dengan seluruh parameter default) model_rf = RandomForestClassifier(random_state=123) # membuat model random forest dengan Bayesian optimization opt = BayesSearchCV( estimator=model_rf, search_spaces=param_space, n_iter=50, cv=3, random_state=123, n_jobs=-1 ) # fitting model opt.fit(X_train, y_train) # Menampilkan hyperparameter terbaik print(f"Best parameters found: {opt.best_params_}") # Menampilkan score terbaik selama pelatihan print(f"Best cross-validated score: {opt.best_score_:.3f}")
# OUTPUT Best parameters found: OrderedDict({ 'max_depth': 17, 'max_features': 7, 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 500}) Best cross-validated score: 0.790
Evaluasi Model
Model terbaik yang diperoleh selanjutnya kita evaluasi menggunakan data uji. Hasil evaluasi menunjukkan nilai akurasi model mencapai 0,787
. Artinya, model mampu memprediksi dengan benar 78,7 persen data keseluruhan data uji. Lebih detail, melalui confusion matrix dan classification report kita dapat melihat berbagai metrik lainnya. Misalnya recall, pada kelas HIGH
nilai recall adalah 0,79 di mana dari total 186
data uji dengan kelas HIGH
, sebanyak 79 persen (147 observasi) diprediksi benar, sedangkan sisanya sebanyak 39
diprediksi salah masuk sebagai kelas LOW
. Sebaliknya nilai recall pada kelas LOW
sebesar 0,78 di mana dari total 157
data uji dengan kelas LOW
, sebanyak 78 persen (123 observasi) diprediksi benar dan sisanya 34 observasi salah diprediksi sebagai kelas HIGH
.
Selain nilai akurasi, jika ingin menggunakan metrik evaluasi lainnya, pada modul sklearn.metrics
juga menyediakan berbagai fungsi untuk metrik klasifikasi seperti f1_score
, balanced_accuracy_score
, roc_auc_score
dan sebagainya.
Python
# mengambil model terbaik best_model = opt.best_estimator_ # menghitung akurasi pada data uji accuracy = best_model.score(X_test, y_test) print(f"Test set accuracy: {accuracy:.3f}") # menghitung akurasi berdasarkan hasil prediksi y_pred = best_model.predict(X_test) # Akurasi akurasi = accuracy_score(y_test, y_pred) print(f"\nAkurasi: {akurasi: .3f}") # Confusion matrix cm = confusion_matrix(y_test, y_pred) print(f"\nConfussion Matrix:\n{cm}") # Classification Report cr = classification_report(y_test, y_pred) print(f"\nClassification Report:\n{cr}")
# OUTPUT Test set accuracy: 0.787 Akurasi: 0.787 Confussion Matrix: [[147 39] [ 34 123]] Classification Report: precision recall f1-score support HIGH 0.81 0.79 0.80 186 LOW 0.76 0.78 0.77 157 accuracy 0.79 343 macro avg 0.79 0.79 0.79 343 weighted avg 0.79 0.79 0.79 343
Ringkasan
Tuning hyperparameter adalah langkah krusial dalam pengembangan model machine learning. Dengan menggunakan Bayesian Optimization, kita dapat mencari kombinasi hyperparameter optimal dengan lebih efisien dibandingkan metode pencarian grid atau random. Dalam tutorial ini, kita telah membahas penerapan Bayesian optimization untuk tuning hyperparameter model Random Forest menggunakan BayesSearchCV
. Tahapan yang dilakukan mencakup penyiapan pustaka; penyiapan data; pembagian data latih dan data uji; sampai dengan proses pencarian model terbaik dan evaluasinya.
API
- BayesSearchCV – scikit-optimize
- RandomForestClassifier – scikit-learn
- Metrics and scoring – scikit-learn