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 #

AspekImpurity importance (feature_importances_)Permutation importance
Cara menghitungJumlahkan berapa banyak tiap fitur menurunkan impurity (ketidakmurnian) di semua percabangan pohonKocok satu kolom pada data uji, ukur seberapa jauh akurasi jatuh
Dihitung padaData latih — bagian dari proses melatihData 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 utamaFitur dengan banyak nilai unik mendapat lebih banyak kandidat ambang, sehingga skornya menggelembungFitur yang informasinya tumpang tindih dengan fitur lain saling meniadakan kreditnya
Bisa negatif?Tidak — selalu positif dan berjumlah 1Bisa — 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.

python
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:

text
          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          10

Sebelum membaca hasilnya, kita buka jendela ketiga: korelasi mentah tiap fitur terhadap label, tanpa melibatkan model sama sekali.

python
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:

text
Korelasi Pearson tiap fitur dengan label 'berhenti':
umur_member       -0.490
kunjungan_bulan   -0.428
kode_undi         -0.052
jumlah_keluhan     0.408

Sekarang tiga jendela itu bisa kita baca berdampingan:

  1. Baris 17-19 (permutation_importance pada X_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).
  2. 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 nilai jumlah_keluhan yang sungguh-sungguh informatif. Ini bias nilai-unik sedang bekerja: 10 nilai unik berarti banyak ambang kandidat, dan sebagian kebetulan memurnikan data latih.
  3. 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 dengan jumlah_keluhan (keduanya berkorelasi −0,39 satu sama lain) sehingga saat model sudah memakai keluhan, umur tinggal menyumbang sisa informasi.
  4. 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_undi murni acak yang tetap memperoleh 0,126.
  • Permutation importance bisa mengecil atau menghapus kredit fitur yang tumpang tindih informasinya dengan fitur lain, seperti umur_member yang redundan dengan jumlah_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: