私の研究から、3つの矛盾する結果が見つかりました。
誰かがLinearSVC
対SVC(kernel="linear")
を使用するタイミングを説明できますか?
LinearSVCはSVCよりもわずかに優れているようで、通常は細かくなります。しかし、scikit
が線形分類の特定のケースの実装に時間を費やすことにした場合、なぜLinearSVC
はSVC
を上回らないのでしょうか?
数学的には、SVMの最適化は凸の最適化の問題であり、通常は一意の最小化器を使用します。これは、この数学的最適化の問題に対する唯一の解決策があることを意味します。
結果の違いはいくつかの側面から生じます。SVC
とLinearSVC
は同じ問題を最適化することになっていますが、実際にはすべてのliblinear
推定量が切片にペナルティを課しますが、libsvm
しない(IIRC)。これにより、異なる数学的最適化問題が発生し、結果が異なります。スケーリングやデフォルトの損失関数など、その他の微妙な違いもあります(編集:LinearSVC
に_loss='hinge'
_を設定してください)。次に、マルチクラス分類では、liblinear
はデフォルトでone-vs-restを実行しますが、libsvm
はone-vs-oneを実行します。
SGDClassifier(loss='hinge')
は、厳密な勾配降下ではなく確率的勾配降下を使用し、同じ解に収束しない可能性があるという意味で、他の2つとは異なります。ただし、得られたソリューションはより一般化できます。
SVC
とLinearSVC
の間で重要な決定基準の1つは、サンプル数が多いほどLinearSVC
が収束するのが速い傾向があるということです。これは、線形カーネルが特殊なケースであり、Liblinearでは最適化されていますが、Libsvmでは最適化されていないためです。
実際の問題は、scikitアプローチの問題にあり、SVMを呼び出すSVMではない。 LinearSVCは、ヒンジ損失だけでなく、実際に平方ヒンジ損失を最小化しています。さらに、詳細については、バイアスのサイズ(はSVMではありません)他の質問を参照してください: scikit-learnと同等のSVCとLinearSVCのパラメーターは何ですか?
どちらを使用するのですか?純粋に問題固有です。無料の昼食定理がないため、「この損失関数は期間最高です」と言うことは不可能です。場合によっては2乗損失がうまく機能し、時には通常のヒンジが機能します。