_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'を設定してもthe
SVC _takes much longer than
_ LinearSVC`。どうして?
私は_sklearn 0.18
_を使用し、両方ともOneVsRestClassifier
でラップされています。これが_multi_class='ovr'
_/_decision_function_shape='ovr'
_と同じになるかどうかはわかりません。
確かに、LinearSVC
とSVC(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
は通常のヒンジ損失を最小化します。 loss
のLinearSVC
パラメータの「ヒンジ」文字列を手動で定義することができます。LinearSVC
はOne-vs-All( One-vs-Rest とも呼ばれます)マルチクラス削減を使用し、SVC
は One-vs-One)を使用します マルチクラス削減。 ここ にも注意してください。また、マルチクラス分類問題の場合、SVC
はN * (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
は、コメントセクションで述べたように、切片のスケーリング後に実際には線形ではありません。