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

Nic*_*san 6 python svm scikit-learn

我在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)
Run Code Online (Sandbox Code Playgroud)

数据是8个特征和超过3000个观测值.我很惊讶地看到rbf在一秒钟内完成,而线性花费了90秒,而poly则需要数小时.

我认为非线性内核会更复杂并且需要更多时间.是否有一个原因是线性比rbf花费的时间长得多,并且poly比两者都要长得多?它可以根据我的数据发生巨大变化吗?

Grr*_*Grr 9

您是否扩展了数据?

这可能成为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))
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,在这个具有形状(560,30)的数据集中,我们通过一点扩展得到了非常显着的性能提升.

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