Tuning Hyperparameter Model Random Forest dengan Bayesian Optimization

Bayesian Optimization untuk Tuning Hyperparameter model Random Forest Python

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 adalah RandomForestClassifier.
  • search_spaces=param_space: Ruang pencarian hyperparameter yang telah kita definisikan sebelumnya untuk memberitahu BayesSearchCV 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 direproduksi
  • n_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

Tulisan Lainnya

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Isi