2014-04-09 3 views
6

Esiste un modo integrato per eseguire la selezione delle funzioni di forza bruta in scikit-learn? Cioè Esamina in modo esauriente tutte le possibili combinazioni delle funzionalità di input, quindi trova il sottoinsieme migliore. Ho familiarità con la classe "Eliminazione caratteristica ricorsiva" ma sono particolarmente interessante nel valutare tutte le possibili combinazioni delle caratteristiche di input una dopo l'altra.Presenta in modo completo la selezione in scikit-learn?

+0

Qualcosa come la selezione di funzionalità avide? –

+0

@AbhishekThakur Grazie. ma No, voglio una "stupida" selezione di funzionalità a forza bruta - in realtà posso farlo in un ciclo su tutte le combinazioni. Ma preferire un metodo/pipeline integrato se esiste? – Dov

risposta

5

No, la migliore selezione di sottoinsiemi non è implementata. Il modo più semplice per farlo è scriverlo da solo. Questo dovrebbe iniziare:

from itertools import chain, combinations 
from sklearn.cross_validation import cross_val_score 

def best_subset_cv(estimator, X, y, cv=3): 
    n_features = X.shape[1] 
    subsets = chain.from_iterable(combinations(xrange(k), k + 1) 
            for k in xrange(n_features)) 

    best_score = -np.inf 
    best_subset = None 
    for subset in subsets: 
     score = cross_val_score(estimator, X[:, subset], y, cv=cv).mean() 
     if score > best_score: 
      best_score, best_subset = score, subset 

    return best_subset, best_score 

Esegue k fold convalida incrociata all'interno del ciclo, in modo che si adatti k ᵖ stimatori quando dare dati con p caratteristiche.

+0

Grazie per la tua risposta !! – Dov

+2

C'è un errore nel codice. Dovrebbe essere 'combinazioni (xrange (n_features))'. – nopper

+0

Suggerimento per le prestazioni: quando si confrontano modelli diversi della stessa dimensione k, non è necessario eseguire cv: è sufficiente confrontare una statistica del treno come R^2. È necessario solo confrontare i migliori candidati di diverse dimensioni cv. Vedi il capitolo 6 in questo eccellente libro: http://www-bcf.usc.edu/~gareth/ISL/ – ihadanny

0

Se si sta eseguendo questo codice in Python 3 xrange() è stato rinominato in range().