2015-12-26 16 views
8

Hier eine Paste aus dem Code: SVM sample codeSklearn SVM: SVR und SVC, die gleiche Vorhersage für jeden Eingang bekommen ist

ich ... auf dieses Problem ein paar der anderen Antworten ausgecheckt und es scheint, wie diese spezifische Iteration des Problems ist ein bisschen anders.

Zunächst sind meine Eingaben normalisiert, und ich habe fünf Eingänge pro Punkt. Die Werte sind alle vernünftig groß (gesunde 0.5s und 0.7s etc - wenige nahe Null oder nahe 1 Zahlen).

Ich habe etwa 70 x Eingänge entsprechend ihrer 70 y Eingänge. Die y-Eingaben werden ebenfalls normalisiert (sie sind prozentuale Änderungen meiner Funktion nach jedem Zeitschritt).

Ich initialisiere meinen SVR (und SVC), trainiere sie und teste sie dann mit 30 out-of-sample-Eingängen ... und bekomme für jeden Input die exakt gleiche Vorhersage (und die Inputs ändern sich um vernünftige Beträge- -0,3, 0,6, 0,5 usw.). Ich würde denken, dass der Klassifikator (zumindest) würde eine Differenzierung haben ...

Hier ist der Code ich habe:

# 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) 

Und hier sind Beispiele meiner Eingänge:

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. ...] 

Und die x_test Matrix (5x30) ist ähnlich der x_training Matrix in Bezug auf Größen und Varianz der Eingänge ... das gleiche für y_testr und y_testc.

Derzeit sind die Prognosen für alle Tests sind genau die gleichen (0,00596 für die Regression und 1 für die Klassifizierung ...)

Wie erhalte ich die SVR und Funktionen SVC relevanten Prognosen ausspucken ? Oder zumindest verschiedene Vorhersagen basierend auf den Eingaben ...

Zumindest sollte der Klassifikator in der Lage sein, Entscheidungen zu treffen. Ich meine, auch wenn ich nicht genügend Dimensionen für die Regression bereitgestellt habe ...

+0

Sie müssen ein eigenständiges, ausführbares Beispiel mit Beispieldaten bereitstellen, das das Problem tatsächlich veranschaulicht. – BrenBarn

+0

In Ordnung. Eine Sekunde (oder wie 10 min =) – bordeo

+0

@BrenBarn gibt es einen Link zu einem Pastebin des Codes. Ich habe die vollständigen Daten ... – bordeo

Antwort

7

Versuchen Sie, Ihr C von der Standardeinstellung zu erhöhen. Es scheint, dass Sie unterausgestattet sind.

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

p_classification = my_svc.predict(x_test) 

p_classification wird dann:

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.]) 

Für den Fall, dass Sie SVR auch Ihr epsilon reduzieren wollen.

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 wird dann:

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]) 

Sie Ihre C-Parameter unter Verwendung von Kreuzvalidierung abzustimmen aussehen sollte, so dass es in der Lage ist, auf welcher Metrik die meisten Fragen Sie am besten auszuführen. Sie können sich vielleicht GridSearchCV ansehen, um Ihnen dabei zu helfen.

+0

Ok ... fantastisch, danke - hat die Klassifizierung funktioniert. Der SVR agiert immer noch ... Aber es sieht so aus, als würde ich nichts falsch machen, das sollte mich auf den richtigen Weg bringen. Denkst du, Scipys Minimierung wird den Trick machen? Wie auch immer, kennst du PCA? Wird das Laufen die Situation verbessern? (Ich denke, ich würde doppelt so viele Trainingsdaten brauchen ... und das könnte mich zu weit in der Zeit zurückdrängen ...) – bordeo

+0

Ich habe gerade eine Bearbeitung für den SVR-Fall hinzugefügt. PCA wird dir wahrscheinlich nicht helfen. Versuchen Sie zuerst, Parameter mit 'GridSearchCV' abzustimmen, dann können Sie entscheiden, ob Sie mehr Daten benötigen. –

+0

Eigentlich ist es eine gute Möglichkeit herauszufinden, ob mehr Daten helfen, eine Lernkurve zu zeichnen, bei der Sie die Datenmenge variieren und sowohl das Training als auch den CV-Verlust messen. –

1

Ich hatte das gleiche Problem, aber eine ganz andere Ursache, und daher ein ganz anderer Ort, um nach einer Lösung zu suchen.

Wenn Ihre Vorhersageeingaben aus irgendeinem Grund falsch skaliert werden, können die gleichen Symptome auftreten, die hier gefunden werden. Dies könnte das Skalieren von Eingabewerten bei einer späteren Vorhersage oder aufgrund der falschen Reihenfolge der Eingaben vergessen (oder falsch codieren).

0

In meinem Fall musste ich meine Daten mit dem StandardScaler im sklearn-Paket skalieren.

Auch ich musste jede Reihe von Funktionen unabhängig in meinem Fall zwei Arten von Abständen skalieren individuell skaliert.

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])