CodeBlanks Logo Icon CodeBlanks

Feature importance

Ağaç tabanlı modeller, özellik önem derecesini hesaplar.

Önemle seçim: SelectFromModel

Gömülü yöntemde seçim modelin kendi ölçüsüne dayanır. SelectFromModel, önemi bir eşiğin (varsayılan: ortalama önem) üstünde olan özellikleri tutar:

from sklearn.feature_selection import SelectFromModel
sfm = SelectFromModel(RandomForestClassifier(n_estimators=200, random_state=0)).fit(X, y)
print(sfm.get_support(indices=True))
sfm2 = SelectFromModel(Lasso(alpha=0.05)).fit(Xs, y_reg)   # sıfır olmayan katsayılar

Lasso katsayıları sıfıra iterek doğal bir seçim yapar; bunu düzenlileştirme dersinde ayrıntılı göreceksin.

İlişkili özellikler sorunu

İki özellik aynı bilgiyi taşıyorsa ağaçlar önemi aralarında paylaştırır; ikisi de eşiğin altına düşüp atılabilir. Lasso ise genellikle birini seçip diğerini sıfırlar; hangisini seçeceği veriye göre değişir:

# x ve x + küçük gürültü: ikiz özellikler
# orman: ~0.25 + ~0.25   (ayrı ayrı küçük görünür)
# lasso: 0.5 + 0.0       (biri keyfi seçilir)

Seçim sonuçlarını "bu özellik gereksizdir" diye değil, "bu kümeyle yeterli başarı elde edilir" diye yorumlamak daha doğrudur.

Uygulama Ormanla seçim

Yapay veride SelectFromModel(RandomForestClassifier(n_estimators=200, random_state=0)) eğit. Seçilen indeksleri ve seçilen sütunlarla ölçekli lojistik regresyonun 5 katlı CV doğruluğunu (round(..., 3)) alt alta yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=400, n_features=20, n_informative=4, n_redundant=2, shuffle=False, random_state=0)
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=400, n_features=20, n_informative=4, n_redundant=2, shuffle=False, random_state=0)
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

sfm = SelectFromModel(RandomForestClassifier(n_estimators=200, random_state=0)).fit(X, y)
idx = sfm.get_support(indices=True)
print(idx)
m = make_pipeline(StandardScaler(), LogisticRegression())
print(round(cross_val_score(m, X[:, idx], y, cv=5).mean(), 3))

Beklenen çıktı

[0 1 2 3 4 5]
0.653

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 SelectFromModel varsayılan eşiği nedir?

  • Medyan
  • En büyük önem
  • Önemlerin ortalaması Doğru cevap
  • Sıfır

Açıklama: threshold="median" ya da "1.5*mean" gibi değerlerle değiştirilebilir.

2 Önemi medyanın üstünde olanları tut.

Soru
sfm = SelectFromModel(model, threshold=____)
Cevap
sfm = SelectFromModel(model, threshold="median")

Açıklama: Medyan eşik özelliklerin yarısını tutar.

3 Yöntemleri eşleştir.

Kavram Anlamı
SelectFromModel Önem eşiğiyle seçim
Lasso Katsayıyı sıfırlar
ikiz özellikler Önemi paylaşır
threshold Seçim sınırı

Orta seviye bölümündeki tüm dersler