15

libSVM を使用しています。私の機能値が次の形式であるとします。

                         instance1 : f11, f12, f13, f14
                         instance2 : f21, f22, f23, f24
                         instance3 : f31, f32, f33, f34
                         instance4 : f41, f42, f43, f44
                         ..............................
                         instanceN : fN1, fN2, fN3, fN4

適用できるスケーリングは 2 つあります。

  1. 各ベクトルがゼロ平均と単位分散を持つように、各インスタンス ベクトルをスケーリングします。

        ( (f11, f12, f13, f14) - mean((f11, f12, f13, f14) ). /std((f11, f12, f13, f14) )
    
  2. 上記の行列の各列を範囲にスケーリングします。例 [-1, 1]

RBF カーネル (libSVM) を使用した実験によると、2 番目のスケーリング (2) によって結果が約 10% 向上することがわかりました。(2) で結果が改善される理由がわかりませんでした。

スケーリングを適用する理由と、2 番目のオプションで結果が改善される理由を説明してもらえますか?

4

2 に答える 2

20

標準的なことは、各ディメンション(または属性、または列(例では))の平均と単位分散をゼロにすることです。

これにより、SVM の各次元が同じ大きさになります。http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdfから:

スケーリングの主な利点は、大きな数値範囲の属性が小さな数値範囲の属性を支配することを避けることです。もう 1 つの利点は、計算中の数値的な困難を回避できることです。カーネル値は通常、線形カーネルや多項式カーネルなどの特徴ベクトルの内積に依存するため、属性値が大きいと数値的な問題が発生する可能性があります。各属性を [-1,+1] または [0,1] の範囲に線形にスケーリングすることをお勧めします。

于 2013-03-15T20:36:20.333 に答える
4

元のデータに大きく依存していると思います。

元のデータにいくつかの列の極端な値がある場合、私の意見では、[-1,1] の範囲などで線形にスケーリングすると、定義が失われます。

値の 90% が 100 から 500 の間にあり、残りの 10% の値が -2000 ほど低く、+2500 ほど高い列があるとします。

このデータを線形にスケーリングすると、次のようになります。

-2000 -> -1 ## <- The min in your scaled data
+2500 -> +1 ## <- The max in your scaled data

 100 -> -0.06666666666666665 
 234 -> -0.007111111111111068
 500 ->  0.11111111111111116

元の 100 と 500 の間の識別可能性は、元のデータの識別可能性と比較して、スケーリングされたデータの方が小さいと主張できます。

最後に、それはデータの詳細に大きく依存していると思います.10% のパフォーマンスの向上は非常に偶然であると思います.両方のスケーリング方法を試したすべてのデータセットでこの大きさの違いが見られることはありません.

同時に、他の回答に記載されているリンクの論文では、著者がデータを線形にスケーリングすることを推奨していることを明確に確認できます。

誰かがこれが役立つことを願っています!

于 2016-09-07T18:33:36.950 に答える