トレーニングデータのグループサイズが等しくないSVM


12

1つのグループが他のグループよりも多く表示されるトレーニングデータからSVMを構築しようとしています。ただし、グループは最終的なテストデータで等しく表されます。そのため、Rパッケージインターフェイスのclass.weightsパラメーターを使用して、トレーニングデータの2つのグループの影響のバランスを取りたいと思います。e1071libsvm

これらの重みの指定方法が正確にわからないため、少しテストを設定しました。

  1. いくつかのヌルデータを生成します(ランダムな特徴、グループラベル間の2:1の比率)
  2. class.weightsパラメータを設定してsvmを適合させます。
  3. 多数の新しいヌルデータセットを予測し、クラスの割合を調べます。
  4. 異なるヌルトレーニングセットに対してプロセス全体を何度も複製します。

私が使用しているRコードは次のとおりです。

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

この全体から、出力は0.5を期待していましたが、それは私が得たものではありません:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

class.weightsPARAMTERは、働いているソートの下I重量として、aそれはこのシミュレーションで表現されて(と私は省略した場合は下げる、class.weightsそれは1に近い返します)...しかし、単純に1の重みを使用して、なぜ私は理解していない:2( 2:1のトレーニングデータの場合、50%に下がることはありません。

SVMを誤解している場合、誰かがこの点を説明できますか?(またはいくつかの参照を送信しますか?)

私が間違っている場合、誰かがclass.weightsパラメーターを使用する正しい方法を教えてもらえますか?

おそらくバグでしょうか?(私はこのソフトウェアと基礎となるlibsvmがかなり成熟していると理解しているので、そうは思わない)


私はlibsvmの経験はありませんが、LiblineaRの場合、クラスの重みが重要です。正しく設定しないと、クラスのバランスが非常に悪い場合に、最適な結果が得られません。バランスの悪いクラスで実際のデータセットを取得し、class.weightsの異なる値を試してください(LiblineaR wi)。LiblineaRは、直系カーネルに対して桁違いに高速であり、方法にもペナルティを科しています。私の経験では、あなたが最初のまともなクラスの重みを検索し、最適化するC.
marbel

回答:


7

Cの値とあなたが持っているパターンの数に依存すると思う。SVMは最大マージン判別を見つけようとするため、スパースデータがある場合、SVMはラグランジュ乗数が上限に達せずにハードマージンソリューションを見つける可能性があります(この場合、それぞれのペナルティの比率はスラック値が小さいかゼロであるため、クラスは本質的に無関係です。トレーニングパターンの数を増やして、効果があるかどうかを確認します(ボックス制約内でハードマージンソリューションが見つかる可能性が低くなります)。 。

さらに重要なことは、Cの最適な値はデータに依存するため、事前に決められた値に設定するだけでなく、leave-one-outエラーまたは一般化の限界を最小化することで最適化することです。不均衡なクラスがある場合、各クラスの値の比率を修正し、すべてのパターンで平均ペナルティを最適化できます。


意味あり。このシミュレーションでフィーチャの数を減らし、観測の数を増やすと、出力値は0.5に近づきます。ただし、900行と1列しかなくても、そこまで到達することはありません。
ジョンコルビー

もちろん、実際のデータでは、モデルパラメーターの調整に常にcaretパッケージまたは組み込みtune()関数を使用するため、少数派クラスに有利になるようにリサンプリングスキームを調整することで実際にこれに対処する方法についての2番目のアイデアが特に気に入っています。大変感謝いたします。
ジョンコルビー

あなたの提案が有用だったことをうれしく思います。theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdfにも役立つかもしれない最適な比率の設定に関する論文があります実際には、特定の比率を強制せずに2つの個別のCパラメーターを調整することにより取得しますが、leave-one-outモデル選択基準を評価する際にクラスに従ってパターンに重み付けします。
ディクランMarsupial

2
また、最近では、損失関数の導関数の不連続性に起因するこの種の直感に反する問題がないため、SVMではなくカーネルリッジ回帰を使用する傾向があります。L2 SVMを適切に調整すると、非常に多くの場合、Cの値が非常に小さくなり、すべてのデータがSVになります。この時点で、とにかくKRRモデルがあります。それらを使用すればするほど、実際にSVMを見つけた有用性は低くなりますが、それらがもたらす理論的な洞察は不可欠です。
ディクランMarsupial

0

svmのトレーニングでは、識別境界を作成するためのサポートベクトルを見つけます。そうするためのすべてのクラスデータに十分なサポートベクトルがあれば、問題はありません。テストセットの結果の精度では、実世界のすべてのクラスのデータの平等な量に注意する必要があり、実際の結果を得るには、データを操作し、実際の状況に適切に考慮される必要があります。


この答えは現時点ではかなり不明瞭です-コピー編集を行うことを検討しましたが、あなたが何を意図していたのかわからない場所がいくつかあります。句読点と文法は意味を伝えるために重要です。
シルバーフィッシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.