2013-03-18 5 views
7

Sto tentando di applicare un metodo di selezione delle caratteristiche univariate utilizzando il modulo Python scikit-impara a un set di dati di regressione (cioè valori a risposta continua) in formato svmlight.Scikit: consente di selezionare la funzione per i dati di regressione

Sto lavorando con scikit-learn versione 0.11.

Ho provato due approcci - il primo dei quali fallito e il secondo dei quali ha funzionato per il set di dati del mio giocattolo, ma credo avrebbe dato risultati privi di significato per un set di dati reale.

Desidero ricevere suggerimenti su un approccio di selezione delle caratteristiche univariata appropriato che potrei applicare per selezionare le principali funzionalità N per un set di dati di regressione. Vorrei entrambi (a) capire come far funzionare la funzione f_regression o (b) ascoltare suggerimenti alternativi.

I due approcci sopra menzionati:

  1. Ho provato ad utilizzare sklearn.feature_selection.f_regression (X, Y).

Questo non è riuscita con il seguente messaggio di errore: "TypeError: copy() prende esattamente 1 argomento (2 dato)"

  1. Ho provato ad utilizzare Chi2 (X, Y). Questo "ha funzionato" ma sospetto che ciò sia dovuto al fatto che i due valori di risposta 0.1 e 1.8 nel set di dati del mio giocattolo venivano trattati come etichette di classe? Presumibilmente, ciò non produrrebbe una statistica chi-quadro significativa per un set di dati reale per il quale ci sarebbe un gran numero di possibili valori di risposta e il numero in ogni cella [con un particolare valore di risposta e valore per l'attributo sottoposto a test] sarebbe Basso?

Si prega di trovare il mio dataset giocattolo incollato alla fine di questo messaggio.

Il seguente frammento di codice dovrebbe fornire i risultati che ho descritto sopra.

from sklearn.datasets import load_svmlight_file 

X_train_data, Y_train_data = load_svmlight_file(svmlight_format_train_file) #i.e. change this to the name of my toy dataset file 

from sklearn.feature_selection import SelectKBest 
featureSelector = SelectKBest(score_func="one of the two functions I refer to above",k=2) #sorry, I hope this message is clear 
featureSelector.fit(X_train_data,Y_train_data) 
print [1+zero_based_index for zero_based_index in list(featureSelector.get_support(indices=True))] #This should print the indices of the top 2 features 

Grazie in anticipo.

Richard

contenuto del mio file di svmlight artificiosa - con righe vuote supplementari inseriti per chiarezza:

1.8 1: 1.000000 2: 1.000000 4: 1.000000 6: 1.000000 # mA

1.8 1: 1.000000 2: 1.000000 # mB

0,1 5: 1.000000 # mC

1,8 1: 1.000000 2: 1.000000 # mD

0.123.516,41 mila

0,1 3: 1.000000 4: 1.000000 # mE

0,1 3: 1.000000 # mF

1,8 2: 1.000000 4: 1.000000 5: 1.000000 6: 1.000000 # mG

1,8 2: 1.000000 # mH

+1

'chi2' è solo per la classificazione. Per farlo funzionare in un'impostazione di regressione, devi bin i tuoi valori Y. –

+0

Grazie Larsmans. Ho pensato che fosse il caso, ma stavo ipotizzando che chi2 potesse internamente distribuire valori di regressione y "dietro le quinte". Mi rendo conto che la mia attuale installazione di scikit-learn è vecchia, quindi proverò f_regression con l'ultima versione prima di sollevare nuovamente il problema. – user1735732

risposta

5

Come larsman ha notato, chi2 non può essere utilizzato per la selezione delle funzioni con i dati di regressione.

In seguito all'aggiornamento alla versione 0.13 di scikit-learn, il codice seguente ha selezionato le due funzioni principali (in base al test f_regression) per il set di dati giocattolo descritto in precedenza.

def f_regression(X,Y): 
    import sklearn 
    return sklearn.feature_selection.f_regression(X,Y,center=False) #center=True (the default) would not work ("ValueError: center=True only allowed for dense data") but should presumably work in general 

from sklearn.datasets import load_svmlight_file 

X_train_data, Y_train_data = load_svmlight_file(svmlight_format_train_file) #i.e. change this to the name of my toy dataset file 

from sklearn.feature_selection import SelectKBest 
featureSelector = SelectKBest(score_func=f_regression,k=2) 
featureSelector.fit(X_train_data,Y_train_data) 
print [1+zero_based_index for zero_based_index in list(featureSelector.get_support(indices=True))] 
1

Si può anche provare a eseguire la selezione delle funzioni mediante la regolarizzazione L1/Lazo. La classe appositamente progettata per questo è RandomizedLasso che formerà LassoRegression su più sottocampioni dei dati e selezionerà le funzioni selezionate più frequentemente da questi modelli. Puoi anche usare semplicemente Lasso, LassoLars o SGDClassifier per fare la stessa cosa senza il vantaggio di ricampionare ma più velocemente.

Problemi correlati