SVM内核的速度?线性与RBF对比

时间:2017-04-20 20:32:22

标签: python scikit-learn svm

我在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比两者都要长得多?它可以根据我的数据发生巨大变化吗?

1 个答案:

答案 0 :(得分:9)

您是否扩展了数据?

这可能成为SVM的一个问题。根据{{​​3}}

  

因为内核值通常取决于内部产品   特征向量,例如线性内核和多项式内核,大的属性值可能会导致数值问题。

现在举个例子,我将使用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),我们通过一点扩展得到了非常显着的性能提升。

此行为取决于具有较大值的功能。考虑在无限维空间中工作。随着您在无限维空间中填充的值越大,其多维产品之间的空间越大,大量越大。我不能强调很多。阅读A Practical Guide to Support Vector Classification,并阅读不仅仅是我链接的wiki条目。这种间距使得该过程需要更长的时间。试图在这个巨大的空间中分离类的数学背后变得非常复杂,特别是随着特征和观察数量的增加。因此,始终扩展数据至关重要。即使您只是进行简单的线性回归,这也是一种很好的做法,因为您将消除对具有较大值的要素的任何可能偏差。