LinearSVC против SVC (kernel = 'linear'): конфликтующие аргументы?

Из моего исследования я нашел три противоречивых результата:

  1. SVC(kernel="linear") лучше
  2. LinearSVC лучше
  3. Не имеет значения

Может кто-нибудь объяснить, когда использовать LinearSVC против SVC(kernel="linear")?

Кажется, что LinearSVC немного лучше, чем SVC, и обычно более привередливы. Но если scikit решил потратить время на реализацию конкретного случая для линейной классификации, почему бы LinearSVC не превзойти SVC?

Ответ 1

Математически оптимизация SVM представляет собой проблему выпуклой оптимизации, обычно с уникальным минимизатором. Это означает, что есть только одно решение этой проблемы математической оптимизации.

Различия в результатах исходят из нескольких аспектов: SVC и LinearSVC должны оптимизировать ту же проблему, но на самом деле все оценки liblinear наказывают перехват, тогда как libsvm не имеют (IIRC), Это приводит к другой проблеме математической оптимизации и, следовательно, к разным результатам. Могут быть и другие тонкие отличия, такие как масштабирование и функция потери по умолчанию (отредактируйте: убедитесь, что вы установили loss='hinge' в LinearSVC). Далее, в классификации многоклассов, liblinear делает по умолчанию один-vs-rest, тогда как libsvm делает одно-vs-one.

SGDClassifier(loss='hinge') отличается от двух других в том смысле, что он использует стохастический градиентный спуск, а не точный градиентный спуск и не может сходиться к одному и тому же решению. Однако полученное решение может лучше обобщаться.

Между SVC и LinearSVC одним важным критерием принятия решения является то, что LinearSVC стремится быстрее сходиться, чем больше число выборок. Это связано с тем, что линейное ядро ​​является частным случаем, оптимизированным в Liblinear, но не в Libsvm.

Ответ 2

Реальная проблема заключается в проблеме с подходом scikit, где они называют SVM , которая не является SVM. LinearSVC фактически сводит к минимуму потери в квадрате петли вместо того, чтобы просто потерять шарнир, кроме того, он штрафует размер смещения (который не является SVM), более подробно см. Другой вопрос: При каких параметрах SVC и LinearSVC в эквиваленте scikit-learn?

Так какой из них использовать? Это чисто проблема. Поскольку из-за отсутствия бесплатной обеденной теоремы невозможно сказать, что "эта функция потерь лучше всего, период". Иногда квадрат потеря будет работать лучше, иногда нормальный шарнир.