簡體   English   中英

SVM 內核的速度? 線性 vs RBF vs Poly

[英]Speed of SVM Kernels? Linear vs RBF vs Poly

我在 Python 中使用 scikitlearn 來創建一些 SVM 模型,同時嘗試不同的內核。 代碼非常簡單,格式如下:

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 的時間比兩者都長得多,這是有原因的嗎? 它是否會根據我的數據發生顯着變化?

您是否擴展了數據?

這可能成為 SVM 的問題。 根據支持向量分類實用指南

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

現在舉個例子,我將使用 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) 的數據集中,我們通過一點點縮放獲得了相當大的性能提升。

此行為取決於具有較大值的特征。 考慮在無限維空間中工作。 當值,你填充他們的多維產品之間有變大的是無窮維空間中的空間變大了很多 我想強調的是很多不夠。 閱讀有關維度的詛咒,並且閱讀的不僅僅是我鏈接的 wiki 條目。 這個間隔使這個過程需要更長的時間。 試圖在這個巨大空間中分離類背后的數學變得更加復雜,尤其是隨着特征和觀察數量的增加。 因此,始終縮放數據至關重要。 即使您只是在做一個簡單的線性回歸,這也是一個很好的做法,因為您將消除對具有較大值的特征的任何可能的偏見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM