2017-10-05 118 views
2

據我所知,在Scikit學習中支持向量迴歸需要一個度數的整數。但是,在我看來,好像是不考慮低階多項式。在Scikit中找到混合度多項式學習支持向量迴歸

運行下面的例子:

import numpy 
from sklearn.svm import SVR 
X = np.sort(5 * np.random.rand(40, 1), axis=0) 
Y=(2*X-.75*X**2).ravel() 
Y[::5] += 3 * (0.5 - np.random.rand(8)) 
svr_poly = SVR(kernel='poly', C=1e3, degree=2) 
y_poly = svr_poly.fit(X, Y).predict(X) 

(如複製並從這裏http://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html略有修改)

繪製數據給出了一個相當差的擬合(甚至跳過管線5時,其中被賦予一個隨機誤差到Y值)。

似乎不考慮低階項。我試圖通過一個[1, 2]列表degree參數,但後來我得到了一個錯誤predict命令。有什麼方法可以包含它們嗎?我錯過了什麼明顯的東西?

+0

您點球C被設定爲1000,它基本上懲罰任何有效的參數。嘗試將其設置爲1或更低 – chrisckwong821

+0

它有幫助,但它不能解決我的一般問題,即考慮低階項的範圍。 – Eulenfuchswiesel

+0

此評論https://stats.stackexchange.com/questions/152610/extremly-poor-polynomial-fitting-with-svr-in-sklearn是非常有用的,但是如果包含較低順序的術語,我不能從中引用它 – Eulenfuchswiesel

回答

2

我認爲低階多項式項包含在擬合模型中,但在圖中不可見,因爲參數Cepsilon不適合數據。通常可以通過使用GridSearchCV微調參數來獲得更好的擬合。由於在這種情況下數據不居中,所以參數coef0也具有顯着效果。

下面的參數應該給更適合的數據:

svr_poly = SVR(kernel='poly', degree=2, C=100, epsilon=0.0001, coef0=5) 
+0

謝謝!我認爲一個「簡單」模型,超參數不會那麼重要。我會接受答案,因爲它讓我更加清楚地表明它們被包含在內的例子。我也會提供它作爲回答。 – Eulenfuchswiesel

1

scikit-learn.SVR運行較低階多項式。原始示例的修改清楚地表明瞭這一點。

X = np.sort(2*np.random.rand(40,1)-1,axis=0) 
Y = np.sin(6*X).ravel() 
svr_poly1 = SVR(kernel='poly', C=1e3, degree=3) 
y_poly1 = svr_poly1.fit(X, Y).predict(X) 
svr_poly2 = SVR(kernel='poly', C=100, epsilon=0.0001, coef0=5, degree=3) 
y_poly2 = svr_poly2.fit(X, Y).predict(X) 
svr_poly3 = SVR(kernel='poly', C=100, epsilon=0.0001, coef0=5, degree=5) 
y_poly3 = svr_poly3.fit(X, Y).predict(X) 

繪製這給

Result of the different SVR algorithms with two models using order 3 but different hyperparameters and one model using order 5