シンプルでわかりやすい答えを出そうとしています。完全な回答では、SVMの背後にある目的から、損失の詳細やサポートベクターまで、すべてをカバーする必要があるでしょう。これらの詳細をさらに詳しく知りたい場合は、機械学習の書籍にあるSVMに関する章などを調べる必要があるかもしれません。
SVMは大きなマージンの分類子です。黒と白のクラスのサンプル間の分離(聞かせてのは、直線を想定)というこの手段はただではない一つの可能なものの、可能な限り最高の分離は、二つのクラスのサンプル間の最大の可能なマージンを取得することによって定義されます。これはH3 サンプル画像では:
あなたはしばらくの間これについて考えている場合は、分離が得られるという結論になるだけ近い「他のクラス」、余白に、したがって、それらの近くに位置し、それらのサンプルから(正確には:それらの上マージン)。サンプル画像では、これらはサンプルに直交する灰色の線でマークされていますH3。この動作は問題を引き起こします。分離の導出に使用されるサンプルの量が主にサブセットであるため、これらのサンプルに影響を与えるノイズにより、分離が大部分のデータに対して最適ではなくなる可能性があります。これは、私たちすべてが過剰適合として知っていることです。使用されるトレーニングの大きなマージンの観点からの分離は最適ですが、一般化が悪く、したがって、他の/まだ目に見えないデータには最適ではありません。
これまでに説明したのは「ハードマージン分類」です。これは、マージンがこれまでに定義されている方法であるため、サンプルをマージン内に入れることを許可していません。このハードプロパティを緩和すると、「ソフトマージン分類」を実行することになります。マージンの背後にある考え方は同じままですが、特定のサンプルをマージンの内側に配置できるようになりました。主要な利点は、そうすることで、モデルのデータへの全体的な適合がハードマージン分類よりも優れている可能性があることです(バイアスを犠牲にして分散を減らします)。
そのため、一方では、単純な最適化問題(モデル=ラインをデータに最適に合わせる方法)を解決する必要があります。一方、マージンにすべて/多くのサンプルを含めるのは望ましくありません。マージンの内側に入れるサンプル数を調整して、マージンが完全にオーバーフィットしたり、マージンプロパティが完全に失われたりしないようにします。
これは Cパラメータがステージに入ります。核となるアイデアは単純です:私たちは最適化するために、最適化問題を修正し、両方のデータラインのフィット感と同時に、で、マージンの内側にサンプルの量を不利にしますCマージン内のサンプルが全体的なエラーに寄与する重みを定義します。その結果、とC大マージンの分類をどの程度ハードまたはソフトにするかを調整できます。低いC、マージン内のサンプルは、より高い場合よりもペナルティが少なくなります C。とともにC0の場合、マージン内のサンプルにペナルティが課されなくなります。これは、大きなマージンの分類を無効にする可能性のある1つの極端です。無限にC ハードマージンの他の可能な極端があります。
これは、変更によって引き起こされる効果を視覚化する小さな例です Cよく知られているアイリスデータセットR
を使用しcaret
ます(パッケージ内およびパッケージを使用しますが、libsvm
もちろん同じことも当てはまります)。これは、元のデータがどのように見えるかです(そのバイナリ分類の問題)。
library(caret)
d <- iris[51:150,c(1,2,5)]
plot(d[,c(2,1)], pch = ifelse(d[,3]=='versicolor', 1, 2))
これがどのように変化するか C モデルのパフォーマンスに影響を与える可能性があります。
m <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', trControl = trainControl(method = 'repeatedcv', 10, 20), tuneGrid = expand.grid(C=3**(-7:7)))
plot(m, scales=list(x=list(log=3)))
そして、これは2つの異なって選ばれた間の分離の違いです C 値(分割線の傾きが異なることに注意してください!):
m1 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(-7)))
plot(m1$finalModel)
m2 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(7)))
plot(m2$finalModel)
したがって、実際には、ML設定で実行する可能性が最も高いのは適切に調整することです Cたとえば、チューニンググリッドを使用します。詳細については、この出版物などを検討してください。それはLibSVMの人たちからのものであり、SVMが優れた例でどのように機能するかを説明することから、たとえばLibSVMでパラメーターグリッドを使用する方法のコードスニペットまで、多くの有用な情報を提供します。
Hsu et al。(2003)。「ベクトル分類をサポートするための実用的なガイド。」国立台湾大学コンピュータサイエンスおよび情報工学科。
ところで:SVMについて人々が言ったことの少数のリストがあります Cパラメータ、それを理解するのにも役立ちます:http : //www.svms.org/parameters/