2015-12-26 31 views
8

Ecco una pasta del codice: SVM sample codeSklearn SVM: SVR e SVC, ottenendo la stessa previsione per ogni ingresso

ho controllato un paio delle altre risposte a questo problema ... e sembra come questa specifica iterazione del problema è un po 'diversa.

Prima di tutto, i miei ingressi sono normalizzati e ho cinque ingressi per punto. I valori sono tutti ragionevolmente dimensionati (sani 0,5 e 0,7 ecc. Ecc. - pochi vicini allo zero o vicino a 1 numeri).

Ho circa 70 ingressi x corrispondenti ai loro ingressi 70 y. Anche gli ingressi y sono normalizzati (sono variazioni percentuali della mia funzione dopo ogni passo temporale).

Inizializzo il mio SVR (e SVC), li alleno, quindi li collaudo con 30 ingressi fuori campione ... e ottengo la stessa identica previsione per ogni input (e gli input cambiano in quantità ragionevoli- -0.3, 0.6, 0.5, ecc.). Vorrei pensare che il classificatore (almeno) avrebbe qualche differenziazione ...

Ecco il codice che ho:

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

E qui sono campioni dei miei ingressi:

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

E la matrice x_test (5x30) è simile alla matrice x_training in termini di magnitudo e varianza degli ingressi ... stessa per y_testr e y_testc.

Attualmente, le previsioni per tutti i test sono esattamente gli stessi (0,00,596 mila per la regressione, e 1 per la classificazione ...)

Come faccio ad avere lo SVR e funzioni SVC a sputare previsioni rilevanti ? O almeno previsioni diverse basate sugli input ...

Per lo meno, il classificatore dovrebbe essere in grado di fare delle scelte. Voglio dire, anche se non ho fornito abbastanza dimensioni per la regressione ...

+0

È necessario fornire un esempio autonomo e eseguibile con dati di esempio che dimostrino effettivamente il problema. – BrenBarn

+0

OK. Un secondo (o come 10 min =) – bordeo

+0

@BrenBarn c'è un collegamento ad un pastebin del codice. Ho incluso i dati completi ... – bordeo

risposta

7

Prova ad aumentare il C dall'impostazione predefinita. Sembra che tu stia bene.

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

p_classification = my_svc.predict(x_test) 

p_classification diventa allora:

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

Per il SVR caso in cui si vuole anche ridurre l'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 diventa allora:

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

Si dovrebbe cercare di ottimizzare il parametro C utilizzando la convalida incrociata in modo che sia in grado di svolgere al meglio su qualunque materia metriche di più per voi. Potresti voler dare un'occhiata a GridSearchCV per aiutarti a farlo.

+0

Ok ... fantastico, grazie - ha funzionato la classificazione. L'SVR sta ancora agendo ... Ma sembra che non stia facendo nulla di male, quindi questo dovrebbe darmi la giusta via. Pensi che minimizzare lo scipy farà il trucco? Ad ogni modo, conosci PCA? Funzionerà che migliorerà la situazione? (Suppongo che mi servirebbe il doppio dei dati di allenamento, però ... e questo potrebbe spingermi troppo indietro nel tempo ...) – bordeo

+0

Ho appena aggiunto una modifica per il caso SVR. Probabilmente PCA non ti aiuterà. Prima prova i parametri di ottimizzazione usando 'GridSearchCV', quindi puoi decidere se hai bisogno di più dati. –

+0

In realtà, un buon modo per vedere se più dati saranno utili è tracciare una curva di apprendimento in cui si varia la quantità di dati e si misura sia l'allenamento che la perdita CV. –

1

Ho avuto lo stesso problema, ma una causa completamente diversa, e quindi un luogo completamente diverso per cercare una soluzione.

Se gli input di previsione vengono ridimensionati in modo errato per qualsiasi motivo, è possibile riscontrare gli stessi sintomi rilevati qui. Questo potrebbe essere l'oblio (o l'errata interpretazione) del ridimensionamento dei valori di input in una previsione successiva, o dovuto al fatto che gli input sono nell'ordine sbagliato.

0

Nel mio caso ho avuto bisogno di scalare i miei dati usando lo StandardScaler nel pacchetto sklearn.

Inoltre ho dovuto ridimensionare ciascuna serie di funzioni in modo indipendente nel mio caso due tipi di distanze, ciascuna scalata individualmente.

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