Membaca Kepentingan Fitur

Koefisien, kepentingan, dan kehati-hatiannya.

Daftar isi

Model yang sudah terlatih dapat ditanya fitur mana yang paling menentukan prediksinya, dan jawabannya tidak tunggal. Koefisien model linear, feature_importances_ pohon, dan kepentingan permutasi (permutation importance) mengukur tiga hal yang berbeda dengan cara yang berbeda pula. Topik ini membahas cara kerja ketiganya, syarat agar nilainya dapat dibandingkan, serta kehati-hatian membacanya pada dataset breast_cancer.

Koefisien model linear#

Koefisien pada model linear menyatakan perubahan prediksi apabila satu fitur naik satu satuan dengan fitur lainnya dijaga tetap. Angka itu hanya dapat diperbandingkan antar fitur apabila semua fitur berada pada skala yang sama, karena satu satuan pada fitur berbeda tidak berarti sama besarnya. Scaling dengan StandardScaler menyetarakannya, sehingga setelah itu besaran koefisien dapat diurutkan sebagai ukuran kontribusi, dan tandanya menunjuk arah menuju kelas positif.

Program berikut melatih pipeline StandardScaler dan LogisticRegression pada breast_cancer, lalu mengurutkan lima koefisien terbesar menurut nilai mutlaknya. Kelas positif pada dataset ini adalah kelas 1 yang berarti tumor jinak, sehingga koefisien negatif berarti nilai fitur yang naik mendorong prediksi ke arah kelas 0 yang ganas.

python koefisien-logreg.py
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

bc = load_breast_cancer()
X = pd.DataFrame(bc.data, columns=bc.feature_names)
X_train, X_test, y_train, y_test = train_test_split(
    X, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)

# scaling membuat satuan tiap fitur sama, sehingga koefisien dapat dibandingkan
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
model.fit(X_train, y_train)
print(f"Akurasi data uji: {model.score(X_test, y_test):.3f}")

koefisien = pd.Series(
    model.named_steps["logisticregression"].coef_[0], index=X.columns
)
teratas = koefisien.reindex(koefisien.abs().sort_values(ascending=False).index).head(5)
print("Lima koefisien terbesar menurut nilai mutlak:")
for nama_fitur, nilai in teratas.items():
    print(f"  {nama_fitur:<22} {nilai:+.3f}")
text Keluaran
Akurasi data uji: 0.986
Lima koefisien terbesar menurut nilai mutlak:
  worst texture          -1.250
  radius error           -1.070
  worst symmetry         -0.957
  worst concave points   -0.942
  area error             -0.941

Kelima koefisien teratas bertanda negatif, artinya nilai fitur yang naik mendorong prediksi menjauhi kelas jinak. Daftar ini juga memunculkan fitur yang tidak terduga secara sekilas, seperti worst texture dan radius error, karena koefisien menangkap kontribusi murni satu fitur ketika fitur lainnya dijaga tetap, bukan kekuatan korelasinya dengan target. Perbandingan antar fitur pada daftar ini sah dilakukan hanya karena scaling, dan pembacaan pada model tanpa scaling tidak bermakna.

Kepentingan berbasis pemisahan pohon#

feature_importances_ pada pohon menjumlahkan setiap penurunan ketidakmurnian yang dibawa sebuah fitur pada seluruh simpulnya, lalu menormalkan totalnya menjadi porsi yang berjumlah satu. Pada random forest, nilai itu dirata-rata atas ratusan pohon sehingga lebih stabil daripada satu pohon tunggal. Sinyal ini tidak membutuhkan scaling karena pohon hanya membandingkan urutan nilai, bukan jaraknya. Penilaiannya dilakukan melalui pemisahan yang benar-benar dipilih pohon, bukan melalui pengukuran langsung terhadap akurasi.

Program berikut melatih random forest pada breast_cancer, kemudian menyandingkan feature_importances_ dengan kepentingan permutasi pada model yang sama. Kepentingan permutasi mengukur penurunan skor ketika satu kolom diacak, sehingga nilai kecil berarti peran fitur tersebut mudah digantikan fitur lain.

python importances-rf.py
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

bc = load_breast_cancer()
X = pd.DataFrame(bc.data, columns=bc.feature_names)
X_train, X_test, y_train, y_test = train_test_split(
    X, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)

hutan = RandomForestClassifier(n_estimators=300, random_state=42).fit(X_train, y_train)
print(f"Akurasi data uji: {hutan.score(X_test, y_test):.3f}")

penting = pd.Series(hutan.feature_importances_, index=X.columns)
print("Lima feature_importances_ terbesar:")
for nama_fitur, nilai in penting.sort_values(ascending=False).head(5).items():
    print(f"  {nama_fitur:<22} {nilai:.3f}")

# permutasi dihitung pada data uji, bukan data latih
permutasi = permutation_importance(
    hutan, X_test, y_test, n_repeats=30, random_state=42
)
rata = pd.Series(permutasi.importances_mean, index=X.columns)
print("Lima permutation importance terbesar:")
for nama_fitur, nilai in rata.sort_values(ascending=False).head(5).items():
    print(f"  {nama_fitur:<22} {nilai:.3f}")
text Keluaran
Akurasi data uji: 0.958
Lima feature_importances_ terbesar:
  worst perimeter        0.146
  worst area             0.144
  worst concave points   0.115
  mean concave points    0.098
  worst radius           0.072
Lima permutation importance terbesar:
  worst texture          0.004
  worst perimeter        0.002
  worst concave points   0.002
  worst concavity        0.002
  mean concave points    0.001

Kedua daftar untuk model yang sama berbeda jauh. feature_importances_ menonjolkan fitur ukuran sel seperti worst perimeter dan worst area, sedangkan kepentingan permutasinya kecil semua dengan puncak 0.004. Penyebabnya adalah korelasi yang kuat antar fitur ukuran. Saat satu kolom diacak, kolom lain yang bergerak bersamanya menutupi perannya. Pemisahan pohon, sebaliknya, tetap menghitung penurunan ketidakmurnian pada setiap fitur yang digunakan.

Kepentingan permutasi pada model apa pun#

Kepentingan permutasi tidak menuntut bentuk model tertentu, karena pengukurannya hanya membutuhkan predict. Prosedurnya mengacak satu kolom pada data uji, mengukur penurunan skor, mengembalikan kolomnya, lalu mengulangi proses sebanyak n_repeats untuk memperoleh simpangan. Pengulangan dihitung pada data uji, bukan data latih, karena model yang sudah menghafal data latih akan tetap memprediksi dengan baik meskipun satu fiturnya dirusak.

Program berikut menerapkan prosedur yang sama pada pipeline regresi logistik yang sudah dilatih, dan diagram berikut merangkum ketiga sinyal beserta syarat pembacaannya.

Koefisien model lineardibaca setelah scalingagar sebanding antar fiturtanda menunjukkan arah kelasfeature_importances_berbasis pemisahan simpul pohontanpa syarat scalingkorelasi antarfitur membagi nilaipermutation_importanceskor turun saat fitur diacakdiukur pada data ujiberlaku untuk model apa punKetiga sinyal menyatakan asosiasi dengan target, bukan sebab akibat.
Tiga sinyal kepentingan fitur beserta syarat dan kehati-hatiannya
python permutasi-logreg.py
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.inspection import permutation_importance
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

bc = load_breast_cancer()
X = pd.DataFrame(bc.data, columns=bc.feature_names)
X_train, X_test, y_train, y_test = train_test_split(
    X, bc.target, test_size=0.25, stratify=bc.target, random_state=42
)

# pipeline apa pun dapat dinilai karena permutasi hanya membutuhkan predict
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
model.fit(X_train, y_train)
print(f"Akurasi data uji: {model.score(X_test, y_test):.3f}")

permutasi = permutation_importance(
    model, X_test, y_test, n_repeats=10, random_state=42, scoring="accuracy"
)
rata = pd.Series(permutasi.importances_mean, index=X.columns)
simpangan = pd.Series(permutasi.importances_std, index=X.columns)
print("Lima permutation importance terbesar (rata-rata ± simpangan):")
for nama_fitur in rata.sort_values(ascending=False).head(5).index:
    print(f"  {nama_fitur:<22} {rata[nama_fitur]:.3f} ± {simpangan[nama_fitur]:.3f}")
text Keluaran
Akurasi data uji: 0.986
Lima permutation importance terbesar (rata-rata ± simpangan):
  worst texture          0.034 ± 0.009
  radius error           0.028 ± 0.008
  worst area             0.020 ± 0.009
  area error             0.018 ± 0.006
  worst radius           0.018 ± 0.009

Daftar ini mendekati daftar koefisien karena keduanya bersumber dari model linear yang sama, dengan worst texture dan radius error tetap di dua posisi teratas. Urutannya tidak identik karena koefisien membaca kontribusi pada data latih, sedangkan permutasi membaca penurunan akurasi pada data uji. Simpangan sekitar 0.006 sampai 0.009 pada sepuluh pengulangan juga mengingatkan bahwa peringkat fitur tengah mudah berubah. Ketiga daftar pada topik ini sama-sama menunjuk kelompok ukuran dan tekstur sel, dengan urutan yang bergantung pada sinyal yang dipilih.

Kesalahan umum#

  • Membandingkan koefisien pada model tanpa scaling. Fitur dengan satuan besar memperoleh koefisien kecil bukan karena tidak penting, melainkan karena satuannya lebar. Perbaikannya dengan menaruh StandardScaler di depan model dan membaca koefisien dari langkah modelnya.
  • Menghitung permutation_importance pada data latih. Model yang menghafal data latih kehilangan sedikit skor saat satu fitur diacak, sehingga kepentingan semua fitur tampak mengecil dan peringkatnya menyesatkan. Perbaikannya dengan selalu memberikan data uji yang tidak ikut dilatih.
  • Menyandingkan nilai kepentingan antar model yang berbeda secara langsung. Satuannya berbeda, yaitu penurunan ketidakmurnian untuk pohon, penurunan akurasi untuk permutasi, dan satuan log-odds untuk koefisien. Perbaikannya dengan membandingkan urutan relatif dalam satu sinyal, bukan nilai lintas sinyal.

Ringkasan#

  • Koefisien model linear baru dapat diperbandingkan antar fitur setelah StandardScaler, dan tandanya menunjukkan arah menuju kelas positif.
  • feature_importances_ pohon menjumlahkan penurunan ketidakmurnian pada pemisahan yang dipilih, tanpa membutuhkan scaling.
  • Kepentingan permutasi mengukur penurunan skor ketika satu kolom diacak pada data uji, dan berlaku untuk model apa pun yang memiliki predict.
  • Ketiga sinyal menyatakan asosiasi, dan korelasi antar fitur membagi atau menutupi kepentingan sehingga daftarnya dibaca hati-hati.

Referensi#