2015-12-26 21 views
8

下面是代碼的糊狀:SVM sample codeSklearn SVM:SVR和SVC,得到同樣的預測對於每個輸入

我檢查了幾個其他的答案對這個問題......它似乎像這個問題的具體迭代有點不同。

首先,我的輸入被標準化,並且每點有五個輸入。這些值都是合理的大小(健康的0.5s和0.7s等 - 很少接近零或接近1的數字)。

我有大約70 x輸入對應於他們的70 y輸入。 y輸入也被歸一化(它們是每個時間步後我函數的百分比變化)。

我初始化我的SVR(和SVC),訓練它們,然後用30個樣本外的輸入進行測試......並對每個輸入進行完全相同的預測(並且輸入數據正在以合理的數量進行更改 - -0.3,0.6,0.5等)。我認爲,分類(至少)會有些區別......

這裏是我已經得到了代碼:

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

這裏是我的輸入樣本:

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

x_test矩陣(5x30)類似於x_training矩陣的大小和輸入方差......對於y_testry_testc也是如此。

目前,所有測試的預測是完全一樣的(0.00596的迴歸,以及1分類...)

如何獲得SVR和SVC功能吐出相關預測?或至少基於輸入的不同預測...

至少,分類器應該能夠做出選擇。我的意思是,即使我沒有提供足夠的尺寸來回歸...

+0

您需要提供一個自包含的,可運行的示例,其中包含實際演示問題的示例數據。 – BrenBarn

+0

好的。一秒(或等於10分鐘=) – bordeo

+0

@BrenBarn有一個鏈接到代碼的pastebin。我包括完整的數據... – bordeo

回答

7

嘗試增加您的C從默認值。看來你是不合適的。

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

p_classification = my_svc.predict(x_test) 

p_classification就變成了:

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

因爲你也想降低您的小量的情況下SVR

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就變成了:

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

你應該調整你的C參數使用交叉驗證,以便它能夠在大多數指標爲準事項向你表現最佳。你可能想看看GridSearchCV來幫助你做到這一點。

+0

好的...真棒,謝謝 - 分類工作。 SVR仍在起作用......但看起來我沒有做錯任何事情,所以這應該讓我走上正軌。你認爲scipy的最小化會有效嗎?無論如何,你知道PCA嗎?運行會改善情況嗎? (我想我會需要兩倍的訓練數據,儘管...可能會把我推回太久......) – bordeo

+0

剛剛添加了SVR案例的編輯。 PCA可能不會幫助你。首先嚐試使用「GridSearchCV」調整參數,然後您可以決定是否需要更多數據。 –

+0

實際上,查看更多數據是否有用的一個好方法是繪製學習曲線,您可以在其中改變數據量並測量訓練和CV損失。 –

1

我有同樣的問題,但是完全不同的原因,因此是尋找解決方案的完全不同的地方。

如果您的預測輸入由於任何原因被錯誤地縮放,您可以體驗與此處找到的相同症狀。這可能會在稍後的預測中忘記(或編碼)輸入值的縮放比例,或者由於輸入的順序錯誤。

0

在我的情況下,我需要使用sklearn包中的StandardScaler來擴展我的數據。

此外,我必須獨立縮放每組功能,在我的情況下,兩種距離分別進行縮放。

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]) 
相關問題