2015-12-26 4 views
8

Oto pasta kodu: SVM sample codeSklearn SVM: SVR i SVC, otrzymuję ten sam prognozy dla każdego wejścia

I wyrejestrowany kilka innych odpowiedzi na ten problem ... i wydaje się, podobnie jak ta konkretna iteracja problemu jest nieco inna.

Po pierwsze, moje wejścia są znormalizowane, a ja mam pięć wejść na punkt. Wszystkie wartości są w rozsądnej wielkości (zdrowe 0,5 s i 0,7 s itd. - kilka bliskich zeru lub blisko 1 liczb).

Mam około 70 x wejść odpowiadających ich 70-krotnym wejściom. Wejścia y są również znormalizowane (są to zmiany procentowe mojej funkcji po każdym kroku czasowym).

Inicjuję mój SVR (i SVC), trenuję je, a następnie testuję na 30 wejściach poza próbą ... i uzyskuję dokładnie takie same prognozy dla każdego wejścia (a dane wejściowe zmieniają się w rozsądnych ilościach) -0,3, 0,6, 0,5 itd.). Myślę, że klasyfikator (co najmniej) miałby pewne zróżnicowanie ...

Oto kod mam:

# train svr 

my_svr = svm.SVR() 
my_svr.fit(x_training,y_trainr) 

# train svc 

my_svc = svm.SVC() 
my_svc.fit(x_training,y_trainc) 


# predict regression 

p_regression = my_svr.predict(x_test) 
p_r_series = pd.Series(index=y_testing.index,data=p_regression) 

# predict classification 

p_classification = my_svc.predict(x_test) 
p_c_series = pd.Series(index=y_testing_classification.index,data=p_classification) 

A oto próbki moich wejść:

x_training = [[ 1.52068627e-04 8.66880301e-01 5.08504362e-01 9.48082047e-01 
7.01156322e-01], 
       [ 6.68130520e-01 9.07506250e-01 5.07182647e-01 8.11290634e-01 
6.67756208e-01], 
       ... x 70 ] 

y_trainr = [-0.00723209 -0.01788079 0.00741741 -0.00200805 -0.00737761 0.00202704 ...] 

y_trainc = [ 0. 0. 1. 0. 0. 1. 1. 0. ...] 

Macierz x_test (5x30) jest podobna do macierzy x_training pod względem wielkości i wariancji wejść ... takich samych dla y_testr i y_testc.

Obecnie przewidywania dla wszystkich testów są dokładnie takie same (0,00596 dla regresji i 1 klasyfikacji ...)

Jak mogę uzyskać SVR i funkcje SVC wypluć odpowiednich prognoz ? Lub przynajmniej różne prognozy oparte na danych wejściowych ...

Przynajmniej klasyfikator powinien mieć możliwość dokonywania wyborów. Mam na myśli, nawet jeśli nie podałem wystarczająco dużo wymiarów dla regresji ...

+0

Musisz podać samodzielny, działający przykład z przykładowymi danymi, które faktycznie demonstrują problem. – BrenBarn

+0

W porządku. Jedna sekunda (lub jak 10 min =) – bordeo

+0

@BrenBarn znajduje się link do pastebin kodu. Zawarłem pełne dane ... – bordeo

Odpowiedz

7

Spróbuj zwiększyć C z domyślnego. Wygląda na to, że się nie nadajesz.

my_svc = svm.SVC(probability=True, C=1000) 
my_svc.fit(x_training,y_trainc) 

p_classification = my_svc.predict(x_test) 

p_classification wówczas postać:

array([ 1., 0., 1., 0., 1., 1., 1., 1., 1., 1., 0., 0., 0., 
     1., 0., 0., 0., 0., 0., 1., 1., 0., 1., 1., 1., 1., 
     1., 1., 1., 1.]) 

Dla przypadku SVR Będziesz także chcą, aby zmniejszyć epsilon.

my_svr = svm.SVR(C=1000, epsilon=0.0001) 
my_svr.fit(x_training,y_trainr) 

p_regression = my_svr.predict(x_test) 

p_regression wówczas postać:

array([-0.00430622, 0.00022762, 0.00595002, -0.02037147, -0.0003767 , 
     0.00212401, 0.00018503, -0.00245148, -0.00109994, -0.00728342, 
     -0.00603862, -0.00321413, -0.00922082, -0.00129351, 0.00086844, 
     0.00380351, -0.0209799 , 0.00495681, 0.0070937 , 0.00525708, 
     -0.00777854, 0.00346639, 0.0070703 , -0.00082952, 0.00246366, 
     0.03007465, 0.01172834, 0.0135077 , 0.00883518, 0.00399232]) 

Należy spojrzeć dostroić parametr C za pomocą walidacji krzyżowej tak, że jest w stanie wykonać najlepiej w zależności od tego metrycznych najważniejsze dla Ciebie. Możesz poprosić o pomoc w tym celu pod numerem GridSearchCV.

+0

Ok ... niesamowite, dzięki - dostałem klasyfikację działa. SVR wciąż działa ... Ale wygląda na to, że nie robię niczego złego, więc to powinno ustawić mnie na właściwej drodze. Czy myślisz, że minimalizacja scipy wystarczy? W każdym razie, czy znasz PCA? Czy biegnie, aby poprawić sytuację? (Wydaje mi się, że potrzebowałbym dwa razy więcej danych treningowych ... i to może odsunąć mnie zbyt daleko w czasie ...) – bordeo

+0

Właśnie dodano edycję przypadku SVR. PCA prawdopodobnie ci nie pomoże. Najpierw spróbuj dostroić parametry za pomocą 'GridSearchCV', a następnie zdecyduj, czy potrzebujesz więcej danych. –

+0

Właściwie, dobrym sposobem sprawdzenia, czy pomocna jest większa liczba danych, jest wykreślenie krzywej uczenia się, w której zmienia się ilość danych i mierzy zarówno trening, jak i utratę CV. –

1

Miałem ten sam problem, ale zupełnie inną przyczynę, a więc zupełnie inne miejsce do szukania rozwiązania.

Jeśli dane wejściowe predykcji są skalowane nieprawidłowo z dowolnego powodu, mogą wystąpić te same objawy, które występują tutaj. Może to być zapominanie (lub błędne kodowanie) skalowania wartości wejściowych w późniejszej prognozie lub z powodu wprowadzania danych w niewłaściwej kolejności.

0

W moim przypadku potrzebowałem przeskalować dane przy użyciu narzędzia StandardScaler w pakiecie sklearn.

Musiałem również skalować każdy zestaw funkcji niezależnie w moim przypadku dwoma rodzajami odległości skalowanymi indywidualnie.

from sklearn.preprocessing import StandardScaler 
ss = StandardScaler() 
ss.fit(X[:,0:10]) 
X[:,0:10] = ss.transform(X[:,0:10]) 
ss = StandardScaler() 
ss.fit(X[:,10:20]) 
X[:,10:20] = ss.transform(X[:,10:20]) 
Powiązane problemy