Random Forest adalah ensemble, yaitu model gabungan yang terdiri atas banyak decision tree yang dilatih sekaligus dan berprediksi melalui voting mayoritas. Satu pohon keputusan cenderung menghafal data latihnya, tetapi ratusan pohon yang melihat data yang sedikit berbeda dapat saling meniadakan kesalahannya. Topik ini membahas mekanisme bagging yang menjadi fondasinya, skor out-of-bag yang menghemat data uji, peran parameter n_estimators, serta pembacaan singkat feature_importances_. Seluruh contoh dijalankan pada dataset breast_cancer bawaan scikit-learn.
Bagging: sampel bootstrap dan subset fitur#
Random Forest dibangun dengan teknik bagging, singkatan dari bootstrap aggregating, yaitu menggabungkan hasil banyak model yang masing-masing dilatih pada versi data yang berbeda. Setiap pohon menerima sampel bootstrap, yaitu sampel acak dengan pengembalian seukuran data latih. Proses pengambilan dengan pengembalian menyebabkan sebagian sampel muncul lebih dari satu kali, sedangkan sebagian lain tidak terambil sama sekali. Pohon kedua, ketiga, dan seterusnya menerima sampel bootstrap yang berbeda, sehingga strukturnya berbeda pula.
Variasi kedua terjadi pada tingkat pemisahan. Saat memilih pertanyaan pada setiap simpul, pohon hanya boleh mempertimbangkan subset acak fitur dan bukan seluruhnya, yang diatur oleh parameter max_features dengan nilai bawaan akar kuadrat dari jumlah fitur. Tanpa pembatasan ini, seluruh pohon akan memilih pemisahan yang sama pada fitur terkuat, sehingga hasilnya mirip dan menggabungkannya tidak membawa manfaat. Dengan dua sumber keacakan tersebut, pohon-pohon dalam forest saling melengkapi, dan keputusan akhirnya diambil dari voting mayoritas atas prediksi seluruh pohon.
Skor out-of-bag#
Sampel yang tidak terambil oleh sampel bootstrap suatu pohon disebut out-of-bag (OOB), atau di luar kantong, dan sampel inilah yang menjadi dasar estimasi performa bawaan. Setiap sampel data latih dinilai oleh gabungan pohon-pohon yang tidak pernah melihatnya, kemudian hasilnya dirata-rata menjadi oob_score_. Proses ini memberikan estimasi akurasi tanpa menyisihkan satu pun baris data, karena setiap sampel tetap digunakan untuk pelatihan pada pohon-pohon lain. Mekanisme ini bekerja hanya apabila jumlah pohon cukup banyak, karena sampel yang kebetulan masuk ke setiap sampel bootstrap tidak memiliki penilai yang jujur.
Program berikut melatih RandomForestClassifier dengan oob_score=True pada breast_cancer, kemudian membandingkan oob_score_ dengan akurasi pada data uji yang benar-benar disisihkan. Seluruh data latih tetap digunakan untuk pelatihan, sehingga tidak ada baris yang dikorbankan untuk mendapatkan estimasinya.
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
bc = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
bc.data, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)
# oob_score=True mengaktifkan estimasi out-of-bag saat pelatihan
hutan = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=42)
hutan.fit(X_train, y_train)
print("Skor out-of-bag (tanpa data uji):", round(hutan.oob_score_, 3))
print("Akurasi data uji :", round(hutan.score(X_test, y_test), 3))
print()
importance = hutan.feature_importances_
urut = np.argsort(importance)[::-1][:3]
print("Tiga fitur dengan kepentingan terbesar:")
for idx in urut:
print(f" {bc.feature_names[idx]:<25} {importance[idx]:.3f}")Skor out-of-bag (tanpa data uji): 0.962
Akurasi data uji : 0.958
Tiga fitur dengan kepentingan terbesar:
worst area 0.150
worst concave points 0.127
mean concave points 0.105Kedua skor berjarak hanya 0.004, yaitu 0.962 berbanding 0.958, sehingga estimasi out-of-bag pada dataset ini hampir persis sama dengan akurasi data uji. Kesesuaian seperti ini yang membuat oob_score=True berguna pada tahap eksplorasi, karena gambaran performa diperoleh langsung saat fit tanpa perlu menyisihkan data uji terlebih dahulu. Rangkuman kepentingan fitur di bagian bawah keluaran konsisten dengan sifat data breast_cancer, yang ukuran dan bentuk selnya paling menentukan kelas. Fitur teratas tidak menyerap porsi yang dominan, karena ratusan pohon pada subset fitur yang berbeda-beda mendistribusikan kontribusi lebih merata daripada satu pohon tunggal.
Jumlah pohon pada forest#
Parameter n_estimators menentukan jumlah pohon yang digabungkan. Menambah jumlah pohon tidak membuat forest menghafal data lebih dalam, melainkan memperhalus voting mayoritas, sehingga skornya naik cepat pada awalnya kemudian mendatar. Jumlah pohon juga mengendalikan keandalan skor out-of-bag, karena makin banyak pohon, makin kecil peluang sebuah sampel tidak pernah keluar dari kantong. Program berikut mengukur efek itu dengan mengubah n_estimators sambil membaca skor out-of-bag dan akurasi data uji pada pemecahan data yang sama.
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
bc = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
bc.data, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)
for n in [25, 50, 100]:
hutan = RandomForestClassifier(n_estimators=n, oob_score=True, random_state=42)
hutan.fit(X_train, y_train)
print(f"n_estimators={n:>3}: oob={hutan.oob_score_:.3f}, "
f"test={hutan.score(X_test, y_test):.3f}")n_estimators= 25: oob=0.951, test=0.951
n_estimators= 50: oob=0.960, test=0.951
n_estimators=100: oob=0.962, test=0.958Pola keluarannya jelas. Skor oob naik dari 0.951 pada 25 pohon menjadi 0.962 pada 100 pohon, sedangkan skor test bergerak kecil di sekitar 0.951 hingga 0.958. Tidak ada tanda penurunan ketika jumlah pohon ditambah, karena agregasi lebih banyak pohon hanya menstabilkan keputusan. Konsekuensi praktisnya, n_estimators bukan parameter yang sensitif dan nilai bawaan 100 sudah layak sebagai titik awal, sedangkan biayanya berupa waktu pelatihan dan prediksi yang tumbuh linear terhadap jumlah pohon. Parameter yang jauh lebih menentukan hasil adalah parameter tiap pohon, terutama max_depth dan max_features, apabila penyetelan diperlukan.
Kesalahan umum#
Kesalahan pertama adalah menghitung skor oob pada data yang sangat kecil. Sampel out-of-bag tiap pohon hanya sekitar sepertiga data latih, sehingga pada data puluhan baris estimasinya berubah tajam antareksekusi dan mudah menyesatkan. Pada kondisi demikian, cross-validation memberikan estimasi yang lebih andal.
Kesalahan kedua adalah membiarkan keacakan forest tanpa benih. Tanpa random_state=42 atau benih serupa, dua eksekusi yang sama menghasilkan forest berbeda dan skor yang berbeda, sehingga perbandingan antarpercobaan menjadi tidak sah. Menetapkan benih pada model dan pemecahan data menjaga seluruh eksperimen dapat direproduksi.
Kesalahan ketiga adalah memperlakukan oob_score_ sebagai pengganti penuh evaluasi pada data yang benar-benar baru. Skor oob dihitung dari sisa sampel bootstrap yang tetap berasal dari distribusi data latih, sehingga kecocokannya dengan data uji sesungguhnya tidak dijamin pada setiap dataset. Angka ini ideal untuk iterasi cepat, sedangkan laporan akhir tetap membutuhkan data uji yang tidak tersentuh.
Ringkasan#
- Random Forest menggabungkan banyak pohon yang masing-masing dilatih pada sampel bootstrap dan subset fitur, lalu memutuskan dengan voting mayoritas.
oob_score=Truemenghasilkan estimasi akurasi dari sampel yang tidak pernah dilihat tiap pohon, dan pada breast_cancer hasilnya 0.962 berbanding 0.958 pada data uji.- Menambah
n_estimatorsmenstabilkan voting tanpa risiko overfitting tambahan, dengan biaya waktu yang tumbuh linear. feature_importances_meringkas kontribusi fitur lintas ratusan pohon, sehingga lebih stabil daripada kepentingan satu pohon.
Referensi#
- 1.11. Ensembles: gradient boosting, random forests, bagging, voting, stacking — scikit-learn documentation — Bagian user guide yang mengulas random forest dan skor out-of-bag.
- sklearn.ensemble.RandomForestClassifier — scikit-learn documentation
— Rujukan parameter
n_estimators,oob_score,max_features, serta atributoob_score_. - sklearn.datasets.load_breast_cancer — scikit-learn documentation — Dataset breast_cancer yang digunakan pada seluruh contoh topik ini.