Scikit-learn'ın ileri seçimi / kademeli regresyon algoritması var mı?


37

Çok fazla özellik ile sorun üzerinde çalışıyorum ve modellerimin eğitimi çok uzun sürüyor. Özellikleri seçmek için ileri seçim algoritması kullandım.

Ancak, scikit-learn'ın ileri seçim / kademeli regresyon algoritması olduğunu mu merak ediyordum?


Bunun için kendi sınıfımı yarattım ama Sklearn'ün buna sahip olmadığına çok şaşırdım.
Maksud

1
Hipotez testlerini kullanmak, korkunç bir özellik seçimi yöntemidir. Bunları çok yapmak zorunda kalacaksınız ve elbette, birçok yanlış pozitif ve negatif olacaksınız.
Ricardo Cruz

Yanıtlar:


21

Hayır, sklearn'ün ileri seçim algoritması yok gibi görünüyor. Bununla birlikte, sıralı geriye doğru seçime benzer açgözlü bir özellik ortadan kaldırma algoritması olan özyinelemeli özellik ortadan kaldırılmasını sağlar. Buradaki belgelere bakın:

http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html


3
İyi öneri, ancak bilim kiti uygulamasındaki sorun, özellik öneminin model katsayıları ile ölçülmesidir, yani model coef_arayüz varsa. Bu, ağaç tabanlı yöntemi vb. Ekarte eder. Ancak, @Maksud'un istediği şeyin, James'in “geçerlilik belirleme doğruluğu” ile ölçülen önemine göre öznitelikle eklendiği / kaldırıldığı “İstatistiksel Öğrenmeye Giriş” bölümünde açıklandığı şey olduğunu düşünüyorum. . Bu sadece lineer parametrik olanlara değil, tüm model tiplerinde özellik seçimine izin verir.
eggie5

9

Sklearn DOES'in bir ileri seçim algoritması var, buna rağmen scikit-learn olarak adlandırılmıyor. Bilim seti- öğrenimde F_regression adı verilen özellik seçim yöntemi , modelde Közellikler bulunana kadar (K bir girdi) modeli en çok geliştiren özellikleri sırayla içerecektir .

Her bir özellik üzerindeki etiketleri ayrı ayrı regresyona sokarak başlar ve ardından hangi özelliğin F-istatistiğini en çok kullanan modeli geliştirdiğini gözlemleyerek başlar. Daha sonra kazanma özelliğini modele dahil eder. Ardından, F-istatistiklerini veya F testini kullanarak modeli en iyi hale getiren bir sonraki özelliği bulmak için geri kalan özellikler boyunca yinelenir. Modelde K özellikleri bulunana kadar bunu yapar.

Modele dahil edilen özelliklerle ilişkilendirilen kalan özelliklerin muhtemelen seçilmeyeceğine dikkat edin, çünkü artıklarla ilişkilendirilmezler (etiketlerle iyi ilişki kursalar bile). Bu, çoklu ortaklığa karşı korunmaya yardımcı olur.



1
K-en iyiyi seç demek mi istiyorsun ?
Nitro

Evet. Ayrıca şunu okumalısınız: stats.stackexchange.com/questions/204141/… .
Candic3

2
Bu bir çeşit ileri seçim. Ancak genel değildir - doğrusal bir regresyon modeline özgüdür, oysa tipik olarak ileri seçim RFE gibi herhangi bir modelle (model agnostik) çalışabilir ve sınıflandırma veya regresyon problemlerini çözebilir. Ancak çoğu insanın bu kullanım durumunu aradığından şüpheleniyorum ve burada belirtmek kesinlikle güzel.
Simon

2
Bu bir STEPWISE seçimi değildir, çünkü her p değeri, diğer tüm değişkenlerden bağımsız olarak tek değişkenli bir regresyon için hesaplanır.
David Dale

9

Scikit-learn gerçekten adım adım regresyonu desteklemiyor. Bunun nedeni, yaygın olarak 'basamaklı regresyon' olarak bilinen şeyin, doğrusal regresyon katsayılarının p-değerlerine dayanan bir algoritma olmasıdır ve scikit-learn, model öğrenmeye (anlamlılık testi vb.) Çıkarımsal yaklaşımı kasten önler. Dahası, saf OLS sayısız regresyon algoritmasından sadece biridir ve bilim-öğrenme açısından bakıldığında ne çok önemli ne de en iyilerinden biridir.

Bununla birlikte, doğrusal modellerle özellik seçimi için hala iyi bir yola ihtiyaç duyanlar için bazı tavsiyeler bulunmaktadır:

  1. Doğası gereği ElasticNetveya gibi seyrek modeller kullanın Lasso.
  2. Özelliklerinizi normalize edin StandardScalerve ardından özelliklerinizi yalnızca sipariş edin model.coef_. Mükemmel bağımsız değişkenler için p-değerlerine göre sıralamaya eşdeğerdir. Sınıf sklearn.feature_selection.RFEbunu sizin için RFECVyapacak ve optimum özellik sayısını bile değerlendirecek.
  3. Çalışılan düzeltilmiş ile bir ileri seçim uygulaması kullanın .R2statsmodels
  4. Çapraz onaylamada en sevdiğiniz metriği en üst düzeye çıkarmak için ileriye ya da geriye doğru kaba kuvvet uygulayın (kovaryantların sayısında yaklaşık kuadratik zaman alabilir). Bir scikit-learn uyumlu bir mlxtendpaket , bu yaklaşımı herhangi bir tahminci ve herhangi bir ölçüm için destekler .
  5. Eğer hala vanilya kademeli regresyon istiyorsanız statsmodels, bu paket sizin için p-değerleri hesapladığından baz almak kolaydır . Geriye dönük basit bir seçim şöyle görünebilir:

`

from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
import statsmodels.api as sm

data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target


def stepwise_selection(X, y, 
                       initial_list=[], 
                       threshold_in=0.01, 
                       threshold_out = 0.05, 
                       verbose=True):
    """ Perform a forward-backward feature selection 
    based on p-value from statsmodels.api.OLS
    Arguments:
        X - pandas.DataFrame with candidate features
        y - list-like with the target
        initial_list - list of features to start with (column names of X)
        threshold_in - include a feature if its p-value < threshold_in
        threshold_out - exclude a feature if its p-value > threshold_out
        verbose - whether to print the sequence of inclusions and exclusions
    Returns: list of selected features 
    Always set threshold_in < threshold_out to avoid infinite looping.
    See https://en.wikipedia.org/wiki/Stepwise_regression for the details
    """
    included = list(initial_list)
    while True:
        changed=False
        # forward step
        excluded = list(set(X.columns)-set(included))
        new_pval = pd.Series(index=excluded)
        for new_column in excluded:
            model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included+[new_column]]))).fit()
            new_pval[new_column] = model.pvalues[new_column]
        best_pval = new_pval.min()
        if best_pval < threshold_in:
            best_feature = new_pval.argmin()
            included.append(best_feature)
            changed=True
            if verbose:
                print('Add  {:30} with p-value {:.6}'.format(best_feature, best_pval))

        # backward step
        model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()
        # use all coefs except intercept
        pvalues = model.pvalues.iloc[1:]
        worst_pval = pvalues.max() # null if pvalues is empty
        if worst_pval > threshold_out:
            changed=True
            worst_feature = pvalues.argmax()
            included.remove(worst_feature)
            if verbose:
                print('Drop {:30} with p-value {:.6}'.format(worst_feature, worst_pval))
        if not changed:
            break
    return included

result = stepwise_selection(X, y)

print('resulting features:')
print(result)

Bu örnek aşağıdaki çıktıyı yazdırır:

Add  LSTAT                          with p-value 5.0811e-88
Add  RM                             with p-value 3.47226e-27
Add  PTRATIO                        with p-value 1.64466e-14
Add  DIS                            with p-value 1.66847e-05
Add  NOX                            with p-value 5.48815e-08
Add  CHAS                           with p-value 0.000265473
Add  B                              with p-value 0.000771946
Add  ZN                             with p-value 0.00465162
resulting features:
['LSTAT', 'RM', 'PTRATIO', 'DIS', 'NOX', 'CHAS', 'B', 'ZN']

Gönderilen ileriye doğru kademeli regresyon kodu düzgün çalışmıyor. Geriye doğru adım adım gerilemeye aynı sonuçları vermelidir, ancak vermez. Regresyonu yeniden başlattığınızda eşik değerden daha yüksek p-değerleri olan faktörler döndürüyor. Ayrıca aynı veri setini STATA ve aynı eşikleri adım adım geriye doğru kullanıp maddi olarak farklı sonuçlar elde ettim. Temel olarak, kullanmayın. Onun şablonu kullanarak kendi geriye doğru adım adım regresyon kodunu yazacağım.
Michael Corley MBA LSSBB

İleri ve geri kademeli gerileme hiçbir şekilde aynı çözüme ulaşma garantisi verilmez. Ve benim çözümümde bir hata olduğunu fark ederseniz, lütfen kodu yeniden yazmak için kodu ekleyin.
David Dale,

1

Aslında, Stats modellerini kullanan ve Forward'a modele bir değişken eklemek için kendi ölçümünüzü (AIC, BIC, Düzeltilmiş-R-Kare veya ne istersen) ayarlamanıza izin veren "Forward_Select" adında güzel bir algoritma var. Algoritma bu sayfanın yorumlar bölümünde bulunabilir - aşağı kaydırın ve sayfanın alt kısmında göreceksiniz.

https://planspace.org/20150423-forward_selection_with_statsmodels/

Algoritmanın da hoş bir özelliği olduğunu eklerdim: bunu sınıflandırma veya regresyon problemlerine uygulayabilirsiniz! Sadece söylemelisin.

Deneyin ve kendiniz görün.


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.