Random Forest untuk Analis: Kapan Cukup dan Kapan Berlebihan
TL;DR
Random forest ngegabungin ratusan pohon keputusan yang dilatih dari sampel acak, lalu ngambil suara terbanyak atau rata-ratanya. Model ini pas buat data tabular ribuan baris dengan hubungan antar kolom yang nggak lurus, dan jalan tanpa normalisasi. Dia jadi berlebihan kalau datamu cuma ratusan baris, polanya lurus, kamu butuh koefisien yang bisa dijelasin, atau perlu prediksi di luar rentang data latih. Patokan praktisnya: kalau selisih AUC dari regresi logistik di bawah 2 poin, ambil yang sederhana.
Random forest adalah model yang ngegabungin banyak pohon keputusan, lalu ngambil suara terbanyak (klasifikasi) atau rata-rata (regresi) dari semua pohon itu.
Tiap pohon dilatih pakai sampel data yang beda dan cuma boleh milih dari sebagian fitur di tiap percabangan. Keacakan itu yang bikin kesalahan antar pohon nggak seragam, jadi rata-ratanya lebih stabil.
Buat analis, random forest sering jadi pilihan pertama karena jalan tanpa banyak persiapan data. Tapi ada beberapa situasi di mana dia justru bikin kerjaanmu lebih susah, dan itu yang bakal aku bahas di bagian akhir.
Gimana cara kerja random forest?
Random forest bikin ratusan pohon keputusan dari sampel acak data latih, lalu tiap percabangan cuma boleh milih dari sebagian fitur yang diacak. Prediksi akhirnya diambil dari suara terbanyak antar pohon buat klasifikasi, atau rata-rata buat regresi. Dua lapis keacakan itu yang bikin model ini jarang kejebak pola khas satu sampel.
Dua mekanisme utamanya:
- Bootstrap sampling. Tiap pohon dilatih pakai sampel acak dengan pengembalian, jadi tiap pohon lihat data yang agak beda.
- Pemilihan fitur acak. Di tiap percabangan, model cuma mempertimbangkan sebagian fitur. Di scikit-learn, nilai bawaan buat klasifikasi adalah akar dari jumlah fitur.
Satu pohon tunggal gampang hafal data latih. Gabungan banyak pohon yang kesalahannya beda-beda bikin hasilnya lebih tahan banting.
Penjelasan resmi lengkap beserta parameternya ada di dokumentasi ensemble scikit-learn.
Kapan random forest itu pilihan yang pas?
Random forest cocok kalau datamu tabular, jumlah barisnya ribuan sampai ratusan ribu, hubungan antar variabelnya nggak lurus, dan kamu butuh hasil cepat tanpa banyak penyetelan. Dia juga tahan sama fitur yang skalanya beda jauh dan sama outlier sedang.
Situasi konkret yang pas:
- Prediksi pelanggan yang bakal berhenti langganan dari 30-an kolom perilaku.
- Nebak kategori keluhan dari data tiket yang udah dirapiin.
- Nyari fitur mana yang paling berpengaruh sebagai langkah awal sebelum bikin model yang lebih sederhana.
- Data punya interaksi antar kolom yang kamu nggak tau bentuknya.
Buat dua situasi terakhir, random forest kepakai sebagai alat penjajakan, bukan model akhir.
Kode random forest yang bisa langsung kamu jalanin
Contoh ini prediksi pelanggan berhenti langganan dari data toko. Empat langkah, semuanya pakai scikit-learn.
- Pisahin data latih dan data uji, pakai
stratifybiar proporsi kelasnya kejaga. - Latih model dengan jumlah pohon yang cukup.
- Ukur performanya pakai metrik yang cocok buat kelas timpang.
- Cek fitur mana yang paling berpengaruh pakai permutation importance.
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score
from sklearn.inspection import permutation_importance
df = pd.read_csv("pelanggan_toko_berkah.csv")
X = df.drop(columns=["churn"])
y = df["churn"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
model = RandomForestClassifier(
n_estimators=500,
min_samples_leaf=5,
class_weight="balanced",
n_jobs=-1,
random_state=42,
)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)[:, 1]
print(roc_auc_score(y_test, proba))
print(classification_report(y_test, model.predict(X_test)))
Kenapa min_samples_leaf=5? Nilai bawaannya 1, artinya pohon boleh tumbuh sampai tiap daun isinya satu baris. Naikin jadi 5 bikin model lebih kalem tanpa ngorbanin banyak akurasi.
Argumen class_weight="balanced" kepakai kalau kelas positifnya sedikit, misalnya cuma 12% pelanggan yang berhenti.
Baca pengaruh fitur dengan cara yang benar
Atribut feature_importances_ gampang dipanggil, tapi hasilnya condong ke fitur yang nilainya banyak variasi, misalnya ID atau nominal transaksi. Pakai permutation importance di data uji.
hasil = permutation_importance(
model, X_test, y_test,
n_repeats=20, random_state=42, n_jobs=-1
)
urut = pd.Series(hasil.importances_mean, index=X_test.columns)
print(urut.sort_values(ascending=False).head(10))
Cara ini ngukur seberapa turun performanya kalau satu kolom diacak nilainya. Peringatannya ada di dokumentasi permutation importance scikit-learn: kalau dua kolom saling berkorelasi kuat, pentingnya bisa kebagi dua dan keliatan kecil padahal berpengaruh.
Kapan random forest jadi berlebihan?
Ada lima situasi di mana model lain lebih masuk akal. Ini bagian yang paling sering dilewatin waktu orang baru belajar.
| Situasi | Kenapa random forest kurang pas | Pakai apa |
|---|---|---|
| Data cuma ratusan baris | Pohon gampang hafal, keuntungan ensemble-nya kecil | Regresi logistik atau linear |
| Hubungannya jelas lurus | Pohon nyusun tangga buat niru garis lurus | Regresi linear |
| Butuh koefisien yang bisa dijelasin ke manajemen | Ratusan pohon nggak punya satu angka pengaruh per variabel | Regresi logistik |
| Prediksi deret waktu murni | Model nggak bisa nembak nilai di luar rentang data latih | Model deret waktu atau regresi dengan tren |
| Perlu prediksi real time dengan memori kecil | 500 pohon berat disimpan dan lambat dipanggil | Model linear atau satu pohon terpangkas |
Keterbatasan ekstrapolasi di baris keempat itu yang paling sering bikin kaget. Kalau harga tertinggi di data latih Rp 5 juta, prediksi random forest nggak akan pernah keluar di atas rata-rata daun tertingginya.
Jadi buat data yang trennya naik terus, random forest bakal ngasih angka yang mentok.
Contoh kasus: prediksi berhenti langganan di toko_berkah
Dataset pelanggan toko_berkah punya 4.310 baris pelanggan dengan 14 kolom perilaku, dan 11,8% di antaranya berhenti belanja lebih dari 90 hari.
Aku bandingin dua model dengan pemisahan data yang sama:
| Model | ROC AUC | Recall kelas berhenti | Waktu latih |
|---|---|---|---|
| Regresi logistik | 0,784 | 0,61 | 0,4 detik |
| Random forest 500 pohon | 0,831 | 0,69 | 11 detik |
Selisih AUC-nya 0,047. Buat kasus ini layak dipakai, soalnya tiap kenaikan recall 8 poin berarti sekitar 41 pelanggan tambahan yang kedeteksi dari 509 pelanggan yang beneran berhenti.
Tapi coba lihat hasil lain. Waktu aku pangkas datanya jadi 400 baris acak, AUC random forest turun ke 0,742 sementara regresi logistik cuma turun ke 0,731. Bedanya tinggal 0,011.
Di data kecil, tambahan kerumitannya nggak kebayar.
Tiga fitur teratas dari permutation importance: jarak hari sejak transaksi terakhir, frekuensi belanja 6 bulan terakhir, dan jumlah kategori produk berbeda yang pernah dibeli. Tiga-tiganya masuk akal buat tim marketing, dan itu penting biar hasilnya dipercaya.
Kesalahan umum waktu pakai random forest
Percaya feature_importances_ mentah-mentah. Ukuran bawaan itu condong ke kolom dengan banyak nilai unik. Pakai permutation importance di data uji.
Ngukur akurasi doang di data timpang. Kalau cuma 12% pelanggan yang berhenti, model yang nebak semua orang bertahan udah dapat akurasi 88%. Pakai recall, presisi, atau AUC.
Nambah pohon buat naikin akurasi. Setelah beberapa ratus pohon, hasilnya datar. Yang lebih ngaruh itu min_samples_leaf dan max_features.
Bocornya informasi masa depan. Kolom kayak tanggal penutupan akun atau alasan berhenti nggak boleh masuk fitur. Model jadi keliatan hebat di data uji lalu gagal di dunia nyata.
Ngirim label kategori jadi angka urut. Kode kota 1 sampai 34 bikin pohon nganggap Aceh dan Papua punya urutan. Pakai one hot encoding atau encoder khusus kategori.
Nyetel parameter pakai data uji. Kalau kamu ngintip data uji tiap kali nyetel, angkanya jadi optimis palsu. Pakai cross validation di data latih.
FAQ
Berapa jumlah pohon yang pas buat random forest?
Mulai dari 300 sampai 500 pohon. Nambah pohon nggak bikin model hafal data latih, tapi keuntungannya makin kecil sementara waktu latih dan memorinya naik terus. Cara paling gampang ngeceknya: latih dengan 100, 300, dan 500 pohon lalu bandingin skornya. Kalau selisih 300 ke 500 udah di bawah satu poin, berhenti di situ dan alihin waktumu ke penyetelan parameter lain.
Random forest bisa overfitting nggak?
Bisa, walaupun lebih tahan dari satu pohon tunggal. Yang bikin hafal biasanya pohon yang dibiarin tumbuh sampai tiap daun isinya satu baris, apalagi di data yang barisnya sedikit. Naikin min_samples_leaf ke 5 atau 10 dan batasi max_depth kalau selisih skor data latih dan data uji lebar. Kalau skor latihmu 0,99 tapi uji cuma 0,72, itu tandanya.
Lebih bagus random forest atau gradient boosting?
Gradient boosting biasanya ngasih akurasi lebih tinggi di data tabular, tapi lebih sensitif sama setelan dan lebih gampang hafal kalau salah setel. Random forest lebih aman buat model pertama karena jalan lumayan bagus dengan setelan bawaan. Pola kerja yang praktis: pakai random forest buat patokan awal, lalu coba gradient boosting kalau selisih akurasinya beneran ngaruh ke keputusan bisnis.
Perlu normalisasi data sebelum pakai random forest?
Nggak perlu. Pohon keputusan mecah data pakai ambang nilai, jadi skala kolom nggak ngaruh ke hasilnya. Kolom umur dalam tahun dan kolom omzet dalam jutaan bisa dicampur tanpa masalah. Yang tetap perlu diurus itu kolom kategori dan nilai kosong, soalnya scikit-learn butuh angka dan nggak nerima NaN di implementasi random forest standarnya.
Gimana cara jelasin hasil random forest ke atasan yang nggak teknis?
Jangan mulai dari pohonnya. Mulai dari tiga hal: seberapa sering model bener, apa efeknya kalau salah, dan faktor apa yang paling berpengaruh menurut permutation importance. Buat penjelasan per pelanggan, pakai nilai SHAP yang nunjukin kontribusi tiap fitur ke satu prediksi. Cara ini jauh lebih meyakinkan daripada nunjukin gambar pohon yang nggak kebaca.
Penutup
Random forest itu titik awal yang bagus buat data tabular berukuran sedang, apalagi kalau hubungan antar kolomnya berbelok-belok.
Dia jadi berlebihan kalau datamu cuma ratusan baris, polanya lurus, atau kamu butuh angka pengaruh per variabel yang bisa dijelasin.
Aturan praktis yang aku pakai: latih regresi logistik dulu sebagai patokan, baru latih random forest. Kalau selisihnya di bawah 2 poin AUC, ambil yang sederhana.
Coba jalanin kode di atas ke data pelangganmu minggu ini, lalu bandingin sama patokan sederhananya. Lanjut baca regresi logistik buat nyiapin model pembandingnya.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas groupby: Agregasi Data ala Pivot di Python (2026)
groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.