2015-08-26 35 views
0

我試圖通過一個玩具示例來獲得SVM迴歸的感覺。我生成了1到100之間的隨機數作爲預測變量,然後記錄它們的日誌並添加高斯噪聲來創建目標變量。這個數據彈出到sklearn的SVR模塊產生一個合理的期待型號:通過添加多項式特徵損壞了SVM迴歸

enter image description here

然而,當我在原來的預測變量的平方扔增加訓練數據,一切都亂了套:

enter image description here

我知道RBF內核的功能類似於採用原始功能的功能,所以投入第二個功能大多是多餘的。但是,SVM在處理特徵冗餘方面是否真的很糟糕?或者我做錯了什麼?

這裏是我用來生成這些圖形代碼:

from sklearn.svm import SVR 
import numpy as np 
import matplotlib.pyplot as plt 

# change to highest_power=2 to get the bad model 
def create_design_matrix(x_array, highest_power=1): 
    return np.array([[x**k for k in range(1, highest_power + 1)] for x in x_array]) 

N = 1000 

x_array = np.random.uniform(1, 100, N) 
y_array = np.log(x_array) + np.random.normal(0,0.2,N) 

model = SVR(C=1.0, epsilon=0.1) 
print model 

X = create_design_matrix(x_array) 
#print X 
#print y_array 

model = model.fit(X, y_array) 


test_x = np.linspace(1.0, 100.0, num=10000) 
test_y = model.predict(create_design_matrix(test_x)) 
plt.plot(x_array, y_array, 'ro') 
plt.plot(test_x, test_y) 
plt.show() 

我會很感激這種神祕任何幫助!

+1

你有沒有亂用C? – NBartley

+0

是的,我嘗試C的值從0.01到1000(和epsilon一起玩),但無法獲得合理的曲線。 – Site

回答

0

它看起來像你的模型在異常值太大的情況下拾取的,這是差異的一個症狀。這是有道理的,因爲添加多項式特徵會增加模型的方差。您應該嘗試通過調整參數來通過交叉驗證來調整偏差 - 方差權衡。要修改的參數是C,epsilon和gamma。當使用RBF內核時,gamma參數非常重要,所以我會從那裏開始。

與這些參數手動擺弄(這是不推薦 - 見下文)給我的以下模型:

enter image description here

這裏使用的參數爲C = 5,ε= 0.1,γ= 2 * * -15。

選擇這些參數確實是合適的模型選擇框架的一項任務。我更喜歡模擬退火+交叉驗證。目前最好的scikit學習是隨機網格搜索+交叉。我幫助過的模擬退火模塊的無恥插頭:https://github.com/skylergrammer/SimulatedAnnealing

注意:多項式特徵實際上是尺寸爲d(有替換)的所有組合的產品,而不僅僅是特徵的平方。在二度情況下,因爲你只有一個特徵,所以它們是相同的。 Scikit學習有一個類將會計算這些:sklearn.preprocessing.PolynomialFeatures