web-dev-qa-db-ja.com

LinearSVCとSVC(kernel = "linear")の違いは何ですか?

_sklearn.svm.LinearSVC_sklearn.svm.SVC(kernel='linear') を見つけました。これらは私と非常に似ているように見えますが、ロイターでは非常に異なる結果が得られます。

_sklearn.svm.LinearSVC: 81.05% in   28.87s train /    9.71s test
sklearn.svm.SVC      : 33.55% in 6536.53s train / 2418.62s test
_

どちらも線形カーネルを持っています。 LinearSVCの許容誤差はSVCの許容誤差よりも高くなっています。

_LinearSVC(C=1.0, tol=0.0001, max_iter=1000, penalty='l2', loss='squared_hinge', dual=True, multi_class='ovr', fit_intercept=True, intercept_scaling=1)
SVC      (C=1.0, tol=0.001,    max_iter=-1, shrinking=True, probability=False, cache_size=200, decision_function_shape=None)
_

他の点では両方の関数はどのように異なりますか?_kernel='linear_、_tol=0.0001_、_max_iter=1000 and_ decision_function_shape = 'ovr'を設定してもtheSVC _takes much longer than_ LinearSVC`。どうして?

私は_sklearn 0.18_を使用し、両方ともOneVsRestClassifierでラップされています。これが_multi_class='ovr'_/_decision_function_shape='ovr'_と同じになるかどうかはわかりません。

8
Martin Thoma

確かに、LinearSVCSVC(kernel='linear')は異なる結果をもたらします。 e。異なるアプローチを使用するため、メトリックスコアと決定境界。以下のおもちゃの例はそれを証明しています:

_from sklearn.datasets import load_iris
from sklearn.svm import LinearSVC, SVC

X, y = load_iris(return_X_y=True)

clf_1 = LinearSVC().fit(X, y)  # possible to state loss='hinge'
clf_2 = SVC(kernel='linear').fit(X, y)

score_1 = clf_1.score(X, y)
score_2 = clf_2.score(X, y)

print('LinearSVC score %s' % score_1)
print('SVC score %s' % score_2)

--------------------------
>>>    0.96666666666666667
>>>    0.98666666666666669
_

その違いの主な原則は次のとおりです。

  • デフォルトのスケーリングでは、LinearSVCはヒンジ損失の二乗を最小化し、SVCは通常のヒンジ損失を最小化します。 lossLinearSVCパラメータの「ヒンジ」文字列を手動で定義することができます。
  • LinearSVCはOne-vs-All( One-vs-Rest とも呼ばれます)マルチクラス削減を使用し、SVCOne-vs-One)を使用します マルチクラス削減。 ここ にも注意してください。また、マルチクラス分類問題の場合、SVCN * (N - 1) / 2モデルに適合します。ここでNはクラスの量です。対照的に、LinearSVCは、単にNモデルに適合します。分類問題がバイナリの場合、両方のシナリオに適合するモデルは1つだけです。 _multi_class_パラメーターと_decision_function_shape_パラメーターに共通点はありません。 2つ目は、決定関数の結果を_(n_features, n_samples)_の便利な形に変換するアグリゲーターです。 _multi_class_は、ソリューションを確立するためのアルゴリズムによるアプローチです。
  • LinearSVCの基礎となる推定量はliblinearであり、実際には切片にペナルティを課します。 SVCは使用しないlibsvm推定量を使用します。 liblinear推定量は、線形(特殊)の場合に最適化されているため、libsvmよりも大量のデータに速く収束します。そのため、LinearSVCは問題の解決にかかる時間が短くなります。

実際、LinearSVCは、コメントセクションで述べたように、切片のスケーリング後に実際には線形ではありません。

13
E.Z.