Kukla değişkenlerle özellik önemi


18

Kukla değişkenlere ayrılmış kategorik bir değişkenin önemini nasıl elde edebileceğimi anlamaya çalışıyorum. Ben sizin için kategorik değişkenleri R veya h2o yaptığı gibi işlemez scikit-learn kullanıyorum.

Kategorik bir değişkeni sahte değişkenlere ayırırsam, bu değişkente sınıf başına ayrı özellik içe aktarımları elde ederim.

Benim sorum şu, bu kukla değişken ithalatlarını sadece toplayarak kategorik bir değişken için önemli bir değere dönüştürmek mantıklı mı?

İstatistiksel Öğrenmenin Unsurları'nın 368. sayfasından:

Değişken in kareli nispi önemi , bölme değişkeni olarak seçildiği tüm iç düğümler üzerinde bu kareli iyileştirmelerin toplamıdırX

Bu, önem değerinin zaten her bir düğümde bir metriğin toplanmasıyla oluşturulduğundan, değişkenin seçildiğinden, kategorik değişkenin önemini "geri kazanmak" için kukla değişkenlerin değişken önem değerlerini birleştirebilmem gerektiğini düşündürüyor. Tabii ki bunun tam olarak doğru olmasını beklemiyorum, ancak bu değerler rastgele bir süreçte bulundukları için gerçekten kesin değerlerdir.

Bir soruşturma olarak aşağıdaki python kodunu (jupyter'de) yazdım:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestClassifier
import re

#%matplotlib inline
from IPython.display import HTML
from IPython.display import set_matplotlib_formats

plt.rcParams['figure.autolayout'] = False
plt.rcParams['figure.figsize'] = 10, 6
plt.rcParams['axes.labelsize'] = 18
plt.rcParams['axes.titlesize'] = 20
plt.rcParams['font.size'] = 14
plt.rcParams['lines.linewidth'] = 2.0
plt.rcParams['lines.markersize'] = 8
plt.rcParams['legend.fontsize'] = 14

# Get some data, I could not easily find a free data set with actual categorical variables, so I just created some from continuous variables
data = load_diabetes()
df = pd.DataFrame(data.data, columns=[data.feature_names])
df = df.assign(target=pd.Series(data.target))

# Functions to plot the variable importances
def autolabel(rects, ax):
    """
    Attach a text label above each bar displaying its height
    """
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2.,
                1.05*height,
                f'{round(height,3)}',
                ha='center',
                va='bottom')

def plot_feature_importance(X,y,dummy_prefixes=None, ax=None, feats_to_highlight=None):

    # Find the feature importances by fitting a random forest
    forest = RandomForestClassifier(n_estimators=100)
    forest.fit(X,y)
    importances_dummy = forest.feature_importances_

    # If there are specified dummy variables, combing them into a single categorical 
    # variable by summing the importances. This code assumes the dummy variables were
    # created using pandas get_dummies() method names the dummy variables as
    # featurename_categoryvalue
    if dummy_prefixes is None:
        importances_categorical = importances_dummy
        labels = X.columns
    else:
        dummy_idx = np.repeat(False,len(X.columns))
        importances_categorical = []
        labels = []

        for feat in dummy_prefixes:
            feat_idx = np.array([re.match(f'^{feat}_', col) is not None for col in X.columns])
            importances_categorical = np.append(importances_categorical,
                                                sum(importances_dummy[feat_idx]))
            labels = np.append(labels,feat)
            dummy_idx = dummy_idx | feat_idx
        importances_categorical = np.concatenate((importances_dummy[~dummy_idx],
                                                  importances_categorical))
        labels = np.concatenate((X.columns[~dummy_idx], labels))

    importances_categorical /= max(importances_categorical)
    indices = np.argsort(importances_categorical)[::-1]

    # Plotting

    if ax is None:
        fig, ax = plt.subplots()

    plt.title("Feature importances")
    rects = ax.bar(range(len(importances_categorical)),
                   importances_categorical[indices],
                   tick_label=labels[indices],
                   align="center")
    autolabel(rects, ax)

    if feats_to_highlight is not None:
        highlight = [feat in feats_to_highlight for feat in labels[indices]]
        rects2 = ax.bar(range(len(importances_categorical)),
                       importances_categorical[indices]*highlight,
                       tick_label=labels[indices],
                       color='r',
                       align="center")
        rects = [rects,rects2]
    plt.xlim([-0.6, len(importances_categorical)-0.4])
    ax.set_ylim((0, 1.125))
    return rects

# Create importance plots leaving everything as categorical variables. I'm highlighting bmi and age as I will convert those into categorical variables later
X = df.drop('target',axis=1)
y = df['target'] > 140.5

plot_feature_importance(X,y, feats_to_highlight=['bmi', 'age'])
plt.title('Feature importance with bmi and age left as continuous variables')

#Create an animation of what happens to variable importance when I split bmi and age into n (n equals 2 - 25) different classes
# %%capture

fig, ax = plt.subplots()

def animate(i):
    ax.clear()

    # Split one of the continuous variables up into a categorical variable with i balanced classes
    X_test = X.copy()
    n_categories = i+2
    X_test['bmi'] = pd.cut(X_test['bmi'],
                           np.percentile(X['bmi'], np.linspace(0,100,n_categories+1)),
                           labels=[chr(num+65) for num in range(n_categories)])
    X_test['age'] = pd.cut(X_test['age'],
                           np.percentile(X['age'], np.linspace(0,100,n_categories+1)),
                           labels=[chr(num+65) for num in range(n_categories)])
    X_test = pd.get_dummies(X_test, drop_first=True)

    # Plot the feature importances
    rects = plot_feature_importance(X_test,y,dummy_prefixes=['bmi', 'age'],ax=ax, feats_to_highlight=['bmi', 'age'])
    plt.title(f'Feature importances for {n_categories} bmi and age categories')
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    ax.spines['left'].set_visible(False)

    return [rects,]

anim = animation.FuncAnimation(fig, animate, frames=24, interval=1000)

HTML(anim.to_html5_video())

İşte sonuçların bazıları:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Değişken önemin çoğunlukla kategori sayısına bağlı olduğunu gözlemleyebiliriz, bu da beni genel olarak bu tabloların faydasını sorgulamaya yöneltiyor. Özellikle age sürekli muadillerinden çok daha yüksek değerlere ulaşmanın önemi .

Ve son olarak, onları sahte değişkenler olarak bırakırsam bir örnek (sadece bmi):

# Split one of the continuous variables up into a categorical variable with i balanced classes
X_test = X.copy()
n_categories = 5
X_test['bmi'] = pd.cut(X_test['bmi'],
                       np.percentile(X['bmi'], np.linspace(0,100,n_categories+1)),
                       labels=[chr(num+65) for num in range(n_categories)])
X_test = pd.get_dummies(X_test, drop_first=True)

# Plot the feature importances
rects = plot_feature_importance(X_test,y, feats_to_highlight=['bmi_B','bmi_C','bmi_D', 'bmi_E'])
plt.title(f"Feature importances for {n_categories} bmi categories")

resim açıklamasını buraya girin

Yanıtlar:


8

"Özellik önemi" üzerinde çalışırken genellikle bir düzenleme yaklaşımının genellikle iyi bir alternatif olduğunu hatırlamakta fayda vardır. Eldeki sorun için otomatik olarak "en önemli özellikleri seçecektir". Şimdi, düzenlileşme kavramını (genellikle regresyon bağlamında) takip etmek istemezsek, rastgele orman sınıflandırıcıları ve permütasyon testleri kavramı, değişken grubunun önemini ortaya çıkarmak için doğal olarak bir çözüm sunar. Bu aslında burada daha önce sorulmuştur: Birkaç yıl önce " R'deki rastgele orman sınıflamasında bir dizi belirleyicinin göreceli önemi ". Gregorutti et al. Gibi daha titiz yaklaşımlar: " Rasgele ormanlarla gruplandırılmış değişken önem ve çok değişkenli fonksiyonel veri analizine uygulamaChakraborty & Pal'un Bağlantıcı Bir Çerçevede Yararlı Özellik Gruplarını Seçmesi bu görevi Çok Katmanlı Algılayıcı bağlamında inceler. Gregorutti ve ark. Kağıdına geri dönme yöntemleri doğrudan her türlü sınıflandırma / regresyon algoritması için geçerlidir Kısacası, eğitim sırasında kullanılan her çanta dışı numunede rastgele izin verilen bir versiyon kullanıyoruz.

Yukarıdakileri belirterek, permütasyon testleri sonuçta bir sezgisel olmakla birlikte, geçmişte doğru bir şekilde çözülmüş olan, kukla değişkenlerin düzenli regresyon bağlamında cezalandırılmasıdır. Bu sorunun cevabı Grup-LASSO , Grup-LARS ve Grup-Garotte'dir . Bu çalışmada yer alan temel makaleler Yuan ve Lin'in: " Gruplandırılmış değişkenlerle regresyonda model seçimi ve tahmini " (2006) ve Meier ve ark.: " Lojistik regresyon için grup kement " (2008). Bu metodoloji şu durumlarda çalışmamızı sağlar: " her faktörün birkaç seviyesi olabilir ve bir grup sahte değişken aracılığıyla ifade edilebilir " (Y&L 2006). Etkisi öyle ki "grup kement, faktörü, faktör düzeyinde teşvik eder. "(E-L, 2006). Temel fikir, aşırı ayrıntılara inmeden standart olmasıdır ceza pozitif tanımlı matrislerin normu ile değiştirilir , burada bir . biz CV Grubu-lasso ilgili birkaç iyi konuları vardır grup sayısını incelemek burada , burada ve burada . Bu konuyu daha fazla devam etmek istiyorsan [biz özellikle Python söz Çünkü: Python'ın kullanmadıysanız paketi ama içerir görünmektedir kement gruplandırılmış düzenlileştirme .]l1Kjj={1,,J}Jpyglmnet

Sonuçta, tek tek kukla değişkenlerden değişken önemi basitçe "toplamak" mantıklı değildir, çünkü aralarındaki ilişkiyi yakalamayacak ve potansiyel olarak anlamsız sonuçlara yol açmayacaktır. Bununla birlikte, hem grup cezalandırılmış yöntemler hem de permütasyon değişken önem yöntemleri, tutarlı ve (özellikle permütasyon önem prosedürlerinde) genel olarak uygulanabilir bir çerçeve sağlar.

Son olarak, açık bir şekilde ifade etmek için: sürekli verileri bölmeyin . Kötü uygulama, bu konuda burada (ve burada ) mükemmel bir iplik var . Sürekli değişkenin ayrıklaştırılmasından sonra sahte sonuçları gözlemlememiz ageşaşırtıcı değildir. Frank Harrell ayrıca sürekli değişkenlerin kategorize edilmesinden kaynaklanan problemler üzerine geniş kapsamlı yazılar yazmıştır .


Sen bağlantı R rastgele ormanlar sınıflandırma prediktörlerin bir dizi Bağıl önemini doğrudan soru cevaplar. Geri kalanı da doğrudan alakalı olduğunu düşünmüyorum ve bağlantı cevapta kolayca kaybolabileceğinden, referansı bu bağlantıya en başa taşırsanız kabul etmekten mutluluk duyarım.
Dan

Sorun değil. Bazı alakalı düzenlemeler yaptım. Düzenli regresyon kavramını göz ardı etmeyin, metinden bahsettiğim gibi, regülasyon yaklaşımları özellik önemi / sıralamasına mükemmel derecede geçerli bir alternatif sunar.
usεr11852

Düzenli regresyon bu sorunun cevabı değildir, farklı bir soruyu, yani özelliklerin önemine alternatifleri cevaplayabilir, ancak bu soru özelliklerin bir özellik önemi grafiğinde tek bir kategorik özellikte toplanmasıyla ilgilidir. Gerçekten soruyu cevaplayan bağlantıyı başlangıca taşımalısınız.
Dan

2

Soru:

bu kukla değişken ithalatları kategorik bir değişken için basit bir şekilde toplayarak önem değerine dönüştürmek mantıklı mıdır?

Kısa cevap:

Basit cevap hayır. Ders kitabına göre (sayfa 368) ve böylece Sonuç olarak, önce kare kökü almalıdır.

Importance(Xl)=I
(I)2=t=1J1i2I(v(t)=)
I=t=1J1i2I(v(t)=)

Daha uzun, daha pratik cevap ..

Kukla değişkenler için bağımsız değişken önem değerlerini bir araya getiremezsiniz, çünkü

önemli değişkenlerin yüksek korelasyonlu oldukları başkaları tarafından maskelenmesi. (sayfa 368)

Olası çoklu doğrusallık gibi konular değişken önem değerlerini ve sıralamalarını bozabilir.

Çok değişkenli olma gibi sorunlardan değişken önemi nasıl etkilediğini anlamak aslında çok ilginç bir sorundur. Çeşitli Korelasyonel ve Dağılım Koşulları Altında Çoklu Regresyonda Öngörücü Önemini Belirleme makalesi, değişken önemi hesaplamak için çeşitli yöntemleri tartışmakta ve tipik istatistiksel varsayımları ihlal eden veriler için performansı karşılaştırmaktadır. Yazarlar

Her ne kadar çoklu bağlantı doğrusallık göreceli önem yöntemlerinin performansını etkilese de, çok değişkenli normal olmayanlık etkilememiştir. (BEYAZLATICI p366)


İkinci teklifinizin alakalı olduğunu düşünmüyorum. Bunlar yüksek derecede korelasyonlu değişkenler değildir, aynı değişkendir ve bir karar ağacının iyi bir şekilde uygulanması OHE gerektirmez, ancak bunları tek bir değişken olarak ele alır. Bir şey varsa, çok doğrusallık yapay olarak OHE tarafından sokulur.
Dan

İlk noktanıza gelince, bana Breiman tarafından önerilen göreceli önem sayısı kare değer gibi yaralar. Bu yüzden sklearn'ün önerdiğin gibi kare kökleri aldığından emin değilim. Ayrıca, eğer öyleyse, önce değerleri karelemeli, eklemeli ve toplamı kare köklendirmemeliyim? Önce kare kökü alma önerinizi anladığımdan emin değilim.
Dan

@ecedavis Ders kitabı ile ne demek istiyorsun? Bir bağlantı veya daha eksiksiz bir alıntı sağlayabilir misiniz lütfen.
see24

Merhaba, eleştiriler ve yeni bir üye olarak ilk oylamam için teşekkür ederim. Yorumlarınız, revizyonumda ele alacağım belirli ayrıntıları işaret ediyor, ancak cevabımın genel kalitesi hakkında görüşünüzü de alabilir miyim? Bu benim ilk görevim ve düzenli olarak katkıda bulunmayı planlıyorum. En azından, cevabımın genellikle yararlı ve iyi bir tarzda olmasını umuyorum. Düşüncelerin neler?
ecedavis

Yanıtınızın tarzı iyi, ancak bazı bilgi ve içerikler tam olarak doğru görünmüyor. Bağlantı verdiğiniz makale çoklu regresyonda yordayıcı önemi ile ilgili soru ise rastgele ormandaki önem ile ilgilidir. Tam cümlenin "Ayrıca, büzülme nedeniyle (Bölüm 10.12.1) önemli değişkenlerin yüksek derecede korelasyonlu oldukları başkaları tarafından maskelenmesi de sorundan daha azdır." çok farklı bir anlamı var.
see24
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.