SVM 内核的速度?线性 vs RBF vs 多边形

Posted

技术标签:

【中文标题】SVM 内核的速度?线性 vs RBF vs 多边形【英文标题】:Speed of SVM Kernels? Linear vs RBF vs Poly 【发布时间】:2017-09-17 16:04:47 【问题描述】:

我在 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 只需要不到一秒的时间,而 linear 需要 90 秒,而 poly 需要几个小时。

我假设非线性内核会更复杂并且需要更多时间。线性比 rbf 花费的时间长得多,而 poly 比两者都花费的时间长得多,有什么原因吗?它会根据我的数据而有显着差异吗?

【问题讨论】:

你能在其他数据集上重现这种现象吗?你能提供造成这种情况的数据集吗? @thn 是的,这似乎是我使用的任何数据集的问题。然而,我正在研究的是 Michael J Fox Foundation Mobile Sensor 数据集 【参考方案1】:

您是否扩展了数据?

这可能会成为 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,并不仅仅阅读我链接的维基条目。这种间距使该过程需要更长的时间。试图在这个巨大的空间中分离类背后的数学变得更加复杂,特别是随着特征和观察的数量的增加。因此,始终扩展您的数据至关重要。即使您只是进行简单的线性回归,这也是一个很好的做法,因为您将消除对具有较大值的特征的任何可能的偏见。

【讨论】:

按规范化缩放?不,有些变量是数千,有些只是数百和数十,有些低于 1 或 0 到 100 之间的百分比。即使这引起了问题,我很惊讶它几乎不会影响 rbf,但如此强烈影响线性和多边形 感谢您的澄清,现在这很有意义。只是想知道,这会影响我结果的准确性,还是影响速度? 我会成像你会得到更好的准确性,但我必须测试它,我要离开过夜 我明白了,谢谢你的帮助!我很快尝试了一下,似乎它显着提高了 rbf 内核的准确度,但略微降低了线性内核的准确度。当将训练/测试数据拆分到几个不同的种子时,这是一致的。当然,它可能依赖于数据,但它确实似乎有所作为。

以上是关于SVM 内核的速度?线性 vs RBF vs 多边形的主要内容,如果未能解决你的问题,请参考以下文章

在 python scikit-learn 中,RBF 内核的性能比 SVM 中的线性差得多

SVM 自定义 RBF 内核 IndexError

SVM的类型和核函数选择

支持向量机的RBF核

OpenCV 线性 SVM 未训练

具有不平衡数据的 SKlearn SVM RBF