Почему SGDClassifier с потерей шарнира быстрее, чем реализация SV C в scikit-learn - PullRequest
1 голос
/ 04 февраля 2020

Как мы знаем, для машины опорных векторов мы можем использовать SV C, а также SGDClassifier с реализацией потери шарнира. Является ли SGDClassifier с реализацией потери шарнира быстрее, чем SV C. Почему?

Ссылки обеих реализаций SV C в scikit-learn: SV C SGDClassifier

Я прочитал на странице документации научного комплекта, что SV C использует некоторый алгоритм библиотеки libsvm для оптимизации. В то время как SGDClassifier использует SGD (очевидно).

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

Может быть, лучше начать пробовать некоторые практические примеры и прочитать код. Давайте начнем ...

Прежде всего, если мы прочитаем документацию SGD C, в ней будет сказано, что используется только линейный SVM:

Линейные классификаторы (SVM, logisti c регрессия, ао) с обучением SGD

Что если вместо обычного SV C мы используем LinearSV C?

Аналогичен SV C с параметром 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, но я так и сделал):

%%time
svc.fit(X, Y)

Время стены: 5,61 с

%%time
sgd.fit(X, Y)

Время стены: 24 мс

%%time
svcl.fit(X, Y)

Время стены: 26,5 мс

Как мы видим, существует огромная разница между всеми ними, но линейными и SGD C более или менее одинаковое время. Время продолжает немного отличаться, но это всегда будет происходить, поскольку выполнение каждого алгоритма происходит не из одного и того же кода.

Если вас интересует каждая реализация, я предлагаю вам прочитать код GitHub с помощью нового инструмента чтения GitHub, который действительно хорош!

Код linearSV C

Код SGD C

0 голосов
/ 04 февраля 2020

Я думаю, что из-за размера пакета, используемого в SGD, если вы используете полный пакет с классификатором SGD, это должно занять то же время, что и SVM, но изменение размера пакета может привести к более быстрой конвергенции.

0 голосов
/ 04 февраля 2020

Sklearn SVM в вычислительном отношении дорог по сравнению с sklearn SGD-классификатором с потерей = «шарнир». Следовательно, мы используем классификатор SGD, который работает быстрее. Это хорошо только для линейного SVM. Если мы используем ядро ​​'rbf', тогда SGD не подходит.

...