2017-04-12 8 views
1

私はここで何か簡単なことをしているに違いありませんが、私はそれを理解できません。この動作のSVMリニアクラシファイア - 不思議な振る舞い

from sklearn import svm 
clf = svm.SVC(kernel='linear') 
y = [False, True, True] 
X = [[1.0], [2.0], [3.0]] 
clf.fit(X, y) 
clf.predict(1.4) 

Out[324]: array([False], dtype=bool) 

期待通りに動作します...まだ...

X = [[0.1], [0.2], [0.3]] 
clf.fit(X, y) 
clf.predict(0.14) 

Out[325]: array([True], dtype=bool) 

答えて

1

理由は、SVMのsklearn実装は正則化パラメータが含まれていることです。これがどのように結果に影響するかを見てみましょう。

まず第2の例では、clf.predict(0.14)Trueです。実際には、clf.predict(0.1)でもTrueとなります。これは、トレーニングの例ではFalseと分類されているように、直観に反して見えるかもしれません。

2つの例の違いは、2番目の例では、異なるクラスのポイントが最初のポイントよりもはるかに近い点です。したがって、分離超平面のマージンは、第2の例でははるかに小さくなるであろう。

SVM(正則化なし)は、可能な限り大きなマージンを持つ分離ハイパープレーンを見つけようとします。これは、2番目の例ではかなり小さくなります。マージンの計算式は​​3210です(ページの上部にあるhereを参照)。したがって、小さなマージンは大きい||w||を意味します。 SVMは0.5||w||^2を最小限に抑えます(特定の制約の下で、7300ページ参照)。here

ただし、正規化パラメータCを追加すると、SVMは0.5||w||^2+C*penaltyを最小化しようとします(ページの下部にあるhereを参照)。したがって、ペナルティを増やしながら、||w||が減少することがあります。これにより、分類エラー率が増加する可能性があります。

SVMのsklearnインプリメンテーションにおけるデフォルトの正規化子はC=1です。代わりにC=1000を受け取った場合、clf.predict(0.14)Falseとなります。