Kolom feature_importances_ pada random forest adalah salah satu angka yang paling sering dikutip laporan data science — dan salah satu yang paling sering disalahbaca. Angka-angka itu bukan ukuran “seberapa penting fitur bagi dunia”, melainkan ukuran spesifik tentang bagaimana satu model tertentu, pada satu data tertentu, memakai fitur tersebut. Bab ini membedah dua ukuran pengaruh fitur yang paling umum — impurity importance yang dihitung pohon keputusan dari dalam, dan permutation importance yang kita kenal di chapter Explainable AI
— lalu membandingkannya langsung pada satu dataset yang sama. Hasilnya mengajarkan pelajaran penting: dua ukuran itu bisa memberi pangkat yang sama sekali berbeda pada fitur yang sama.
Dua Ukuran, Dua Pertanyaan #
| Aspek | Impurity importance (feature_importances_) | Permutation importance |
|---|---|---|
| Cara menghitung | Jumlahkan berapa banyak tiap fitur menurunkan impurity (ketidakmurnian) di semua percabangan pohon | Kocok satu kolom pada data uji, ukur seberapa jauh akurasi jatuh |
| Dihitung pada | Data latih — bagian dari proses melatih | Data uji — setelah model jadi |
| Pertanyaan yang dijawab | “Fitur mana yang sering dipakai pohon untuk membelah?” | “Fitur mana yang benar-benar ditumpu prediksi saat menghadapi data baru?” |
| Bias utama | Fitur dengan banyak nilai unik mendapat lebih banyak kandidat ambang, sehingga skornya menggelembung | Fitur yang informasinya tumpang tindih dengan fitur lain saling meniadakan kreditnya |
| Bisa negatif? | Tidak — selalu positif dan berjumlah 1 | Bisa — tanda fitur tidak membantu |
Bias “banyak nilai unik” pada impurity importance layak dijelaskan. Sebuah fitur dengan 10 nilai unik menawarkan lebih banyak posisi ambang pemisah dibanding fitur dengan 4 nilai unik; pohon kerap menemukan ambang yang kebetulan memurnikan data latih pada fitur kaya ambang itu, padahal polanya tidak berlaku pada data baru. Fitur identifikasi — nomor pelanggan, nomor undian, kode pos — adalah penyakit menahun kasus ini.
Praktik: Tiga Jendela pada Dataset yang Sama #
Kita pakai kembali dataset pelanggan Toko Kopi Kita dari chapter Imbalanced Learning
, ditambah satu fitur baru: kode_undi, nomor undian acak yang tidak punya hubungan apa pun dengan label. Fitur ini sengaja ditanam sebagai pemancing: bila sebuah ukuran memberi skor tinggi kepadanya, kita tahu ukuran itu sedang tertipu. Tiga jendela akan kita buka — korelasi mentah terhadap label, impurity importance, dan permutation importance pada data uji.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
rng = np.random.default_rng(42)
X = pd.DataFrame({
"kunjungan_bulan": np.concatenate([rng.integers(5, 15, 32), rng.integers(3, 11, 8)]),
"jumlah_keluhan": np.concatenate([rng.integers(0, 4, 32), rng.integers(1, 6, 8)]),
"umur_member": np.concatenate([rng.integers(3, 41, 32), rng.integers(1, 31, 8)]),
"kode_undi": rng.uniform(100, 999, 40), # nomor undian acak, murni derau
})
y = pd.Series(np.array([0] * 32 + [1] * 8), name="berhenti")
X_latih, X_uji, y_latih, y_uji = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=42
)
model = RandomForestClassifier(n_estimators=200, random_state=42)
model.fit(X_latih, y_latih)
hasil = permutation_importance(model, X_uji, y_uji, n_repeats=30, random_state=42)
banding = pd.DataFrame({
"fitur": X.columns,
"impurity_latih": model.feature_importances_.round(3),
"permutation_uji": hasil.importances_mean.round(4),
"simpangan": hasil.importances_std.round(4),
})
print(banding.to_string(index=False))
print()
print("Jumlah nilai unik tiap fitur (data uji):")
print(X_uji.nunique().to_string())Output yang Dihasilkan:
fitur impurity_latih permutation_uji simpangan
kunjungan_bulan 0.216 0.0700 0.0737
jumlah_keluhan 0.225 0.0433 0.0496
umur_member 0.432 0.0133 0.0884
kode_undi 0.126 0.0367 0.0482
Jumlah nilai unik tiap fitur (data uji):
kunjungan_bulan 7
jumlah_keluhan 4
umur_member 9
kode_undi 10Sebelum membaca hasilnya, kita buka jendela ketiga: korelasi mentah tiap fitur terhadap label, tanpa melibatkan model sama sekali.
import numpy as np
import pandas as pd
rng = np.random.default_rng(42)
X = pd.DataFrame({
"kunjungan_bulan": np.concatenate([rng.integers(5, 15, 32), rng.integers(3, 11, 8)]),
"jumlah_keluhan": np.concatenate([rng.integers(0, 4, 32), rng.integers(1, 6, 8)]),
"umur_member": np.concatenate([rng.integers(3, 41, 32), rng.integers(1, 31, 8)]),
"kode_undi": rng.uniform(100, 999, 40),
})
y = pd.Series(np.array([0] * 32 + [1] * 8), name="berhenti")
korelasi = X.corrwith(y).sort_values()
print("Korelasi Pearson tiap fitur dengan label 'berhenti':")
print(korelasi.round(3).to_string())Output yang Dihasilkan:
Korelasi Pearson tiap fitur dengan label 'berhenti':
umur_member -0.490
kunjungan_bulan -0.428
kode_undi -0.052
jumlah_keluhan 0.408Sekarang tiga jendela itu bisa kita baca berdampingan:
- Baris 17-19 (
permutation_importancepadaX_uji): pengukuran dilakukan setelah model jadi dan pada data yang tidak dilatih — inilah jendela paling jujur tentang kontribusi nyata, meskipun dengan derau karena data uji hanya 10 baris (perhatikan kolom simpangan yang besarnya sebanding nilainya). kode_undi, fitur jebakan: korelasi hampir nol (−0,052) dan permutation mendapati kontribusinya di dalam derau (0,0367 dengan simpangan 0,0482). Tetapi impurity importance tetap menggelontorkan 0,126 — lebih besar daripada sepertiga nilaijumlah_keluhanyang sungguh-sungguh informatif. Ini bias nilai-unik sedang bekerja: 10 nilai unik berarti banyak ambang kandidat, dan sebagian kebetulan memurnikan data latih.umur_member, sang juara palsu: impurity memberinya mahkota (0,432, terbesar dari semua fitur). Padahal korelasi menunjukkan fitur ini memang terkait label (−0,490 — terkuat sekaligus dalam arah negatif), namun permutation mengatakan model nyaris tidak menumpu padanya (0,0133, jauh di bawah simpangannya). Dua hal terjadi sekaligus: banyaknya nilai unik menggelembungkan skor impurity, dan sinyalnya tumpang tindih denganjumlah_keluhan(keduanya berkorelasi −0,39 satu sama lain) sehingga saat model sudah memakai keluhan, umur tinggal menyumbang sisa informasi.- Kesimpulan bacaan: pangkat fitur berubah total antar jendela. Tidak ada satu angka tunggal bernama “pentingnya fitur” — yang ada adalah jawaban atas pertanyaan berbeda dari sudut berbeda.
Rangkuman #
feature_importances_mengukur seberapa sering fitur dipakai membelah pohon pada data latih; permutation importance mengukur jatuhnya akurasi pada data uji saat kolom itu dikocok.- Impurity importance condong memberi skor berlebih ke fitur dengan banyak nilai unik — terbukti pada
kode_undimurni acak yang tetap memperoleh 0,126. - Permutation importance bisa mengecil atau menghapus kredit fitur yang tumpang tindih informasinya dengan fitur lain, seperti
umur_memberyang redundan denganjumlah_keluhan. - Korelasi mentah dengan label adalah jendela ketiga yang murah: fitur yang penting bagi dunia belum tentu penting bagi model yang sudah diberi fitur penggantinya.
- Membaca importance berarti membaca pertanyaannya: pisahkan “berapa hubungannya dengan label”, “berapa sering dipakai pohon”, dan “berapa sumbangannya pada prediksi data baru”.
Ada satu pertanyaan yang tidak bisa dijawab ukuran mana pun di atas: apakah fitur yang penting itu menyebabkan label, ataukah keduanya hanya berjalan beriringan. Pertanyaan itulah yang membuka wilayah penalaran sebab-akibat pada chapter berikutnya: Causal Inference .
Referensi: