Python 为什么在scikit learn中,带铰链损失的SGDClassizer比SVC实现更快

Python 为什么在scikit learn中,带铰链损失的SGDClassizer比SVC实现更快,python,machine-learning,scikit-learn,svm,gradient-descent,Python,Machine Learning,Scikit Learn,Svm,Gradient Descent,正如我们所知,对于支持向量机,我们可以使用SVC和SGDClassizer来实现铰链损耗。带铰链损耗的Is SGDClassizer实现速度比SVC快。为什么? scikit学习中SVC的两种实现的链接: 我在sci工具包的文档页面上读到SVC使用libsvm库的一些算法进行优化。而SGD分类器使用SGD(显然)。与具有loss='铰链'的sklearn SGD分类器相比,sklearn SVM的计算成本较高。因此,我们使用更快的SGD分类器。这仅适用于线性SVM。如果我们使用“rbf”核,

正如我们所知,对于支持向量机,我们可以使用SVC和SGDClassizer来实现铰链损耗。带铰链损耗的Is SGDClassizer实现速度比SVC快。为什么?

scikit学习中SVC的两种实现的链接:


我在sci工具包的文档页面上读到SVC使用libsvm库的一些算法进行优化。而SGD分类器使用SGD(显然)。

与具有loss='铰链'的sklearn SGD分类器相比,sklearn SVM的计算成本较高。因此,我们使用更快的SGD分类器。这仅适用于线性SVM。如果我们使用“rbf”核,那么SGD是不合适的

我认为这是因为SGD中使用的批量大小,如果使用SGD分类器的完整批量,则需要与SVM相同的时间,但更改批量大小可能会导致更快的收敛。

也许最好开始尝试一些实际案例并阅读代码。让我们开始

首先,如果我们阅读SGDC的文档,它说线性支持向量机仅用于:

具有SGD训练的线性分类器(SVM、logistic回归、a.o.)

如果我们不使用通常的SVC,而是使用

与SVC类似,参数为kernel='linear',但采用liblinear而不是libsvm实现,因此它在惩罚函数和损失函数的选择方面具有更大的灵活性,并且应该更好地扩展到大量样本

让我们为三种类型的算法添加一个示例:

from sklearn.svm import SVC
from sklearn.linear_model import SGDClassifier
from sklearn.svm import LinearSVC
from sklearn import datasets
import numpy as np

iris = datasets.load_iris()
X = np.random.rand(20000,2)

Y = np.random.choice(a=[False, True], size=(20000, 1))

# hinge is used as the default
svc = SVC(kernel='linear')

sgd = SGDClassifier(loss='hinge')

svcl = LinearSVC(loss='hinge')
使用jupyter和命令
%%time
我们可以得到执行时间(您可以在普通python中使用类似的方法,但我就是这样做的):

壁时间:5.61秒

%%time
sgd.fit(X, Y)
墙时间:24毫秒

%%time
svcl.fit(X, Y)
壁时间:26.5ms

正如我们所看到的,它们之间存在着巨大的差异,但是线性和SGDC的时间或多或少是相同的。时间一直有点不同,但这总是会发生的,因为每个算法的执行并不来自同一个代码

如果您对每个实现都感兴趣,我建议您使用新的github阅读工具阅读github代码,这非常好

代码


你做过任何研究吗?是的,主要问题是SVC使用libsvm,而SGDC使用liblinear,LinearSVC使用liblinear,因此执行时间将与SGDC相当
%%time
svcl.fit(X, Y)