Bagging dan Random Forest

Bagging dan random forest: mengikis varians melalui perata-rataan banyak pohon.

Daftar isi

Goyahan pohon tunggal dapat diikis tanpa mengubah cara kerja pohon itu sendiri, yaitu dengan melatih banyak pohon sekaligus dan menggabungkan hasilnya. Topik ini menjelaskan bagging, singkatan dari bootstrap aggregating, beserta random forest yang menambahkan keacakan fitur agar pohon-pohonnya saling tidak berkorelasi. Keduanya termasuk keluarga ensemble, yaitu gabungan beberapa model menjadi satu prediksi. Praktiknya membandingkan satu pohon dengan random forest berisi sepuluh pohon dan seratus pohon pada dataset breast cancer, kemudian menjelaskan dari mana perbaikan akurasinya berasal.

Bagging: rata-rata dari sampel bootstrap#

Bagging membentuk banyak pohon dengan melatih satu pohon pada satu sampel bootstrap, yaitu sampel sebesar data latih yang diambil secara acak dengan pengembalian. Beberapa baris terambil lebih dari sekali, sementara sebagian baris tidak terpilih sama sekali pada sampel tertentu. Karena setiap pohon melihat campuran data yang berbeda, struktur pohonnya pun berbeda satu sama lain. Seluruh pohon dilatih secara paralel dan saling bebas, kemudian prediksinya digabung dengan voting, yaitu pemilihan kelas terbanyak, untuk klasifikasi atau rata-rata untuk regresi.

Penggabungan ini menurunkan varians tanpa menaikkan bias secara berarti. Setiap pohon tetap dalam dan bebas menghafal sampel bootstrap-nya sendiri, tetapi kesalahan penghafalan yang berbeda-beda antar pohon saling meniadakan ketika dirata-ratakan. Kesalahan yang muncul hanya pada sebagian kecil pohon akan kalah suara oleh mayoritas, sehingga hasil gabungan lebih stabil daripada anggota terbaik maupun terburuknya. Syarat efektifnya adalah pohon-pohon yang dihasilkan tidak terlalu mirip. Apabila semua pohon memilih fitur dan ambang yang sama, rata-ratanya hanya menyalin kelemahan yang sama, dan persoalan inilah yang dijawab random forest.

Baris yang tidak terpilih pada sampel bootstrap sebuah pohon disebut out-of-bag. Baris tersebut dapat digunakan sebagai data penilaian untuk pohon itu, dan scikit-learn menghitung skornya melalui oob_score=True tanpa perlu menyisihkan data uji. Ukuran ini memberi perkiraan kinerja yang cukup jujur selagi pelatihan berlangsung. Skor ini berperan sebagai pemeriksa cepat, sedangkan keputusan akhir tetap menggunakan data uji yang terpisah.

Random forest dan keacakan fitur#

Random forest melengkapi bagging dengan satu lapis keacakan lagi. Pada setiap pembagian simpul, pohon hanya boleh mempertimbangkan subset fitur yang diacak, dan lebarnya diatur melalui max_features. Nilai bawaan untuk klasifikasi adalah akar dari jumlah fitur, sehingga dataset breast cancer yang memiliki tiga puluh fitur hanya meninjau lima fitur pada setiap pembagian. Dengan begitu, pohon yang lahir dari sampel bootstrap dan subset fitur yang berbeda menempuh banyak jalan keputusan yang berbeda pula.

Keacakan fitur membuat fitur yang sangat kuat tidak selalu terpilih pada setiap pohon. Pada pohon yang kebetulan tidak meninjau fitur terkuat dataset, struktur yang terbentuk berasal dari fitur lain yang tetap membawa informasi. Pohon-pohon pun berbeda cara pandangnya dan saling tidak berkorelasi. max_features menjadi hyperparameter yang menyeimbangkan dua sisi. Nilai yang terlalu kecil membuat setiap pohon terlalu lemah untuk menangkap pola, sedangkan nilai yang terlalu besar membuat pohon-pohon saling meniru dan keuntungan bagging menipis.

Kombinasi banyak pohon yang beragam itulah yang menjadikan random forest andalan pada data tabular. Penambahan n_estimators membuat hasilnya makin stabil, dengan keuntungan yang makin menurun setelah ratusan pohon.

Membandingkan satu pohon dan hutan#

Skrip berikut menilai tiga model pada data uji yang sama, yaitu satu DecisionTreeClassifier tanpa batasan kedalaman, random forest dengan sepuluh pohon, dan random forest dengan seratus pohon. Ketiganya menggunakan random_state=42 dan data latih yang persis sama, sehingga perbedaan angka murni berasal dari cara kerja ketiga model. Pelatihan ketiganya tetap berjalan cepat karena dataset yang dipakai kecil dan pohon-pohonnya saling bebas.

python pohon-vs-hutan.py
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
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.2, random_state=42
)

satu_pohon = DecisionTreeClassifier(random_state=42).fit(X_latih, y_latih)
print(f"Akurasi data uji, satu pohon      : {satu_pohon.score(X_uji, y_uji):.4f}")

hutan_10 = RandomForestClassifier(
    n_estimators=10, random_state=42
).fit(X_latih, y_latih)
print(f"Akurasi data uji, hutan 10 pohon  : {hutan_10.score(X_uji, y_uji):.4f}")

hutan_100 = RandomForestClassifier(
    n_estimators=100, random_state=42
).fit(X_latih, y_latih)
print(f"Akurasi data uji, hutan 100 pohon : {hutan_100.score(X_uji, y_uji):.4f}")
text Keluaran
Akurasi data uji, satu pohon      : 0.9474
Akurasi data uji, hutan 10 pohon  : 0.9561
Akurasi data uji, hutan 100 pohon : 0.9649

Akurasi naik dari 0.9474 pada satu pohon menjadi 0.9561 dengan sepuluh pohon, lalu 0.9649 dengan seratus pohon. Perbaikan tidak berasal dari pohon anggota yang lebih unggul, karena setiap anggota random forest adalah pohon yang sama kedalamannya dengan pohon tunggal tadi. Sumber perbaikannya adalah perataan. Kesalahan penghafalan contoh tertentu berbeda antar pohon karena sampel bootstrap dan subset fiturnya berbeda, sehingga kesalahan itu saling mengoreksi ketika digabung.

Pola kenaikan seperti ini juga menggambarkan urutan kerja yang dianjurkan. Satu pohon tetap berguna untuk memahami data dan membangun baseline, sedangkan random forest menjadi langkah berikutnya ketika goyahan pohon tunggal mulai terlihat. Yang dicari bukan satu model yang lebih rumit, melainkan banyak model sederhana yang digabungkan.

Menambah jumlah pohon tidak sama sifatnya dengan menambah kedalaman. Nilai n_estimators yang lebih besar tidak membuat model menghafal lebih dalam, melainkan membuat rata-ratanya makin stabil. Karena itu, menaikkan jumlah pohon hampir tidak berisiko overfitting. Biayanya murni waktu pelatihan dan prediksi, dan nilai ratusan pohon menjadi pilihan yang lazim karena keuntungannya menurun perlahan.

Ringkasan#

  • Bagging melatih banyak pohon pada sampel bootstrap yang berbeda, lalu menggabungkannya dengan voting atau rata-rata.
  • Perataan mengikis varians tanpa menaikkan bias berarti karena kesalahan penghafalan antar pohon saling menghapus.
  • Random forest menambahkan subset fitur acak melalui max_features agar pohon-pohonnya saling tidak berkorelasi.
  • Baris out-of-bag memberi penilaian tanpa menyentuh data uji, sedangkan n_estimators yang besar menstabilkan hasil dengan keuntungan yang menurun.

Referensi#