众所周知,对于支持向量机,我们可以将SVC以及SGDClassifier与铰链损耗实现一起使用。具有SGD的SGDClassifier具有比铰链损耗更快的实现速度。为什么?

scikit-learn中SVC的两种实现的链接:
SVC
SGDClassifier

我在sci-kit的文档页面上阅读后发现,SVC使用libsvm库的某些算法进行优化。而SGDClassifier使用SGD(显然)。

最佳答案

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

首先,如果我们阅读SGDC的文档,它说仅使用线性SVM:


  具有SGD训练的线性分类器(SVM,逻辑回归等)


如果使用LinearSVC而不是通常的SVC怎么办?


  与带有参数kernel ='linear'的SVC相似,但使用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中使用类似的方式,但这是我的方法):

%%time
svc.fit(X, Y)


挂墙时间:5.61 s

%%time
sgd.fit(X, Y)


挂墙时间:24ms

%%time
svcl.fit(X, Y)


挂墙时间:26.5ms

正如我们所看到的,它们之间存在巨大差异,但是线性和SGDC几乎同时存在。时间会有所不同,但这总是会发生,因为每种算法的执行都不是来自同一代码。

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

linearSVC的代码

SGDC的代码

关于python - 为什么带有铰链丢失的SGDClassifier比scikit-learn中的SVC实现要快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60061412/

10-12 19:28