2017-04-20 94 views
3

我在Python中使用scikitlearn來創建一些SVM模型,同時嘗試不同的內核。代碼非常簡單,並遵循以下形式:SVM內核的速度?線性與RBF vs Poly

from sklearn import svm 
clf = svm.SVC(kernel='rbf', C=1, gamma=0.1) 
clf = svm.SVC(kernel='linear', C=1, gamma=0.1) 
clf = svm.SVC(kernel='poly', C=1, gamma=0.1) 
t0 = time() 
clf.fit(X_train, y_train) 
print "Training time:", round(time() - t0, 3), "s" 
pred = clf.predict(X_test) 

該數據是8個功能和3000多個觀察點。我很驚訝地看到rbf在一秒之內就被安裝了,而線性需要90秒,poly需要幾個小時。

我認爲非線性內核會更復雜,需要更多時間。是否有一個原因是線性需要比rbf更長的時間,並且poly比兩個都花費了更多的時間?根據我的數據,它可以有很大的不同嗎?

+1

您可以在其他數據集上重現該現象嗎?你能提供導致這種情況的數據集嗎? – THN

+0

@thn是的,它似乎是我使用的任何數據集的問題。然而,我正在處理的是邁克爾J福克斯基金會移動傳感器數據集 –

回答

6

您是否擴展了您的數據?

這可能會成爲SVM的問題。根據A Practical Guide to Support Vector Classification

因爲內核值通常取決於特徵向量的內積,例如,線性核和多項式核,大的屬性值可能會導致數值問題。

現在對於一個例子,我將使用sklearn乳腺癌數據集:

from time import time 

from sklearn.datasets import load_breast_cancer 
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.svm import SVC 

data = load_breast_cancer() 
X = data.data 
y = data.target 
X_train, X_test, y_train, y_test = train_test_split(X, y) 

clf_lin = SVC(kernel='linear', C=1.0, gamma=0.1) 
clf_rbf = SVC(kernerl='rbf', C=1.0, gamma=0.1) 

start = time() 
clf_lin.fit(X_train, y_train) 
print("Linear Kernel Non-Normalized Fit Time: {0.4f} s".format(time() - start)) 
start = time() 
clf_rbf.fit(X_train, y_train) 
print("RBF Kernel Non-Normalized Fit Time: {0.4f} s".format(time() - start)) 

scaler = MinMaxScaler() # Default behavior is to scale to [0,1] 
X = scaler.fit_transform(X) 
X_train, X_test, y_train, y_test = train_test_split(X, y) 

start = time() 
clf_lin.fit(X_train, y_train) 
print("Linear Kernel Normalized Fit Time: {0.4f} s".format(time() - start)) 
start = time() 
clf_rbf.fit(X_train, y_train) 
print("RBF Kernel Normalized Fit Time: {0.4f} s".format(time() - start)) 

輸出:

Linear Kernel Non-Normalized Fit Time: 0.8672 
RBF Kernel Non-Normalized Fit Time: 0.0124 
Linear Kernel Normalized Fit Time: 0.0021 
RBF Kernel Normalized Fit Time: 0.0039 

所以你可以看到,在這個數據集的形狀(560,30 )我們從小的縮放中獲得了非常顯着的性能改進。

此行爲取決於具有較大值的功能。考慮在無限維空間中工作。由於您在無限維空間中填充的值越大,其多維產品之間的空間就越大很多變大。我不能強調很多不夠。閱讀The Curse of Dimensionality,閱讀更多的不僅僅是我鏈接的wiki條目。這個間距是使過程花費更長時間的原因。試圖在這個巨大的空間中分離類的背後的數學變得非常複雜,特別是隨着特徵和觀測數量的增加。因此,對於總是縮放您的數據至關重要。即使你只是做一個簡單的線性迴歸,這是一個很好的做法,因爲你將消除對具有較大值的特徵的任何可能的偏差。

+0

規模化的規模?不,一些變量是成千上萬,有些變量只有幾百和幾十,還有一些變量低於1或者是0到100之間的百分比。即使這引起了一個問題,我很驚訝它幾乎不會影響rbf,但如此強烈影響線性和聚合 –

+0

感謝澄清,這使得現在很有意義。只是想知道,這會影響我的結果的準確性,還是僅僅是速度? –

+0

我會成像你會得到更好的準確性,但我將不得不測試它,我即將離開過夜 – Grr