2013-03-18 16 views
7

Próbuję zastosować metodę jednowymiarowej selekcji cech za pomocą modułu scikit modułu Python-learn do regresu (tj. Wartości ciągłych wartości odpowiedzi) w formacie svmlight.Wybór funkcji uczenia się naukowego dla danych regresji

Pracuję z scikit-learn version 0.11.

Próbowałem dwóch podejść - z których pierwsza się nie udała, a druga z nich zadziałała dla zbioru danych zabawek, ale sądzę, że dałoby to bezsensowne wyniki dla prawdziwego zestawu danych.

Chciałbym uzyskać poradę dotyczącą odpowiedniego podejścia opartego na jednowariantowej selekcji cech, które mógłbym zastosować, aby wybrać najlepsze N ​​cech dla zestawu danych regresji. Chciałbym również (a) dowiedzieć się, jak włączyć funkcję f_regression lub (b) usłyszeć alternatywne sugestie.

Obydwa wspomniane powyżej sposoby:

  1. I wypróbowany przy sklearn.feature_selection.f_regression (X, Y).

ta nie powiodła się z następującym komunikatem o błędzie: "TypeError: copy() wykonuje dokładnie 1 argument (2)" dany

  1. Próbowałem za pomocą chi2 (X, Y). To "działało", ale podejrzewam, że tak jest, ponieważ dwie wartości odpowiedzi 0.1 i 1.8 w zbiorze danych dotyczących zabawek były traktowane jako etykiety klasowe? Można przypuszczać, że nie przyniosłoby to znaczącej statystyki chi-kwadrat dla prawdziwego zbioru danych, dla którego istnieje duża liczba możliwych wartości odpowiedzi, a liczba w każdej komórce [z konkretną wartością odpowiedzi i wartością dla testowanego atrybutu] byłaby Niska?

Proszę odnaleźć mój zestaw danych zabawek na końcu tej wiadomości.

Poniższy fragment kodu powinien dać wyniki, które opisałem powyżej.

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 

Z góry dziękuję.

Richard

Zawartość mojego contrived pliku svmlight - z dodatkowych pustych wierszy wstawionych dla jasności:

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,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' jest tylko do klasyfikacji. Aby działał w ustawieniu regresji, musisz odłożyć swoje wartości Y. –

+0

Dziękuję larsmans. Myślałem, że tak było, ale spekulowałem, że chi2 może wewnętrznie regresować bin wartości y "za kulisami". Zdaję sobie sprawę, że moja obecna instalacja naukowa jest stara, więc spróbuję f_regression z najnowszą wersją, zanim ponownie zgłoszę problem. – user1735732

Odpowiedz

5

Jak zauważyli larsowie, chi2 nie może być używany do wyboru cech z danymi regresji.

Po zaktualizowaniu do wersji zapoznawczej scikit 0.13, poniższy kod wybrał dwie pierwsze funkcje (zgodnie z testem f_regression) dla opisanego powyżej zestawu danych zabawek.

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

Można również spróbować wybrać funkcję przez regulację L1/Lasso. Specjalnie zaprojektowana klasa to RandomizedLasso, która będzie trenować LassoRegression na wielu podpróbkach danych i wybierać funkcje wybierane najczęściej przez te modele. Możesz także po prostu użyć Lasso, LassoLars lub SGDClassifier, aby zrobić to samo bez korzystania z resamplingu, ale szybciej.

Powiązane problemy