歪んだマルチクラスデータ


10

50クラスの約100,000サンプルを含むデータセットがあります。新しいデータをトレーニングして予測するために、RBFカーネルでSVMを使用しています。ただし、データセットが異なるクラスに偏っていることが問題です。

たとえば、クラス1-30(それぞれ〜3%)、クラス31-45(それぞれ〜0.6%)、クラス46-50(それぞれ〜0.2%)

テストセットがトレーニングセットと同じクラス分布を持っている場合でも、モデルがトレーニングセットであまり頻繁に発生しないクラスを予測することはほとんどありません。

過半数のクラスをマイナークラスに縮小する「アンダーサンプリング」などの手法があることを知っています。しかし、これは非常に多くの異なるクラスがある場合にここで適用できますか?このケースを処理するのに役立つ他の方法はありますか?

回答:


5

libsvmを使用することをお勧めします。libsvmには、調整可能なクラスの重みが実装されています。トレーニングサンプルを複製するのではなく、SVM最適化でさまざまなクラスのCパラメーターを変更します。たとえば、データに2つのクラスがあり、最初のクラスがデータの10%しかない場合、クラスの重みをクラス1と2に対してそれぞれ10と1に選択します。したがって、第1クラスのマージン違反は、第2クラスのマージン違反の10倍のコストがかかり、クラスごとの精度のバランスがよりよくなります。


アドバイスをありがとう、libsvmがこれを自動的に行うかどうか、またはクラスの重みを手動で渡す必要があるかどうかを知っていますか?
mike1886 2014

クラスの重みを手動で渡す必要があります。その方法は、使用しているインターフェイス(python、java、matlab、c)によって異なります。csie.ntu.edu.tw/~cjlin/libsvmからツールをダウンロードした場合、read meファイルに詳しく記載されています。また、データサイズが大きいようで、libsvmのデフォルトのマルチクラス実装は1対1の分類を使用するため、実行に時間がかかりすぎる可能性があります。重みを適切に指定して、50の1対すべてのバイナリ分類器のトレーニングを試すことができます。
magicharp

2

私は、SVMのを使用しての輸出はないですが、あなたはPythonのような機械学習ライブラリを使用している場合、通常は(scikit-learnまたはRのをlibsvm、そこにあるclass_weightパラメータは、あるいはclass.weightsそれぞれ。

それとも、ベイズ分類器を使用したい場合、あなたは「前(クラス)の確率」Pを経由して、この「スキュー」を考慮に入れるでしょう(ω J


1

アプローチに関しては、RBFカーネルを備えたSVMが適切に機能しますが、たとえば、各フォールドにランダムに割り当てられたデータの1/10のデータを使用するCVを使用している場合を除き、SVMは大きなオブジェクトサイズによって遅くなる可能性があります。しかし、そもそもなぜSVMを採用しているのかと自問しましたか?

多変量線形回帰を試しましたか?番目のオブジェクトがある場合、各レコードはとコード化されますクラス、およびそれ以外の場合?線形回帰を使用した分類精度がかなり高い場合、データは線形分離可能であり、SVMやANNなどのより複雑な方法は必要ありません。ステップ2は、k最近傍、ナイーブベイズ、線形(フィッシャー)判別分析、多項ロジスティック回帰などが故障して失敗することを示すことです。Y=XβYyij=+1ijyij=1

用語については、「特定のクラスのオブジェクトの比率が低い」、または「クラスサイズがゼロに近い」という文脈で、クラスの重みが増えるという問題を取り上げます。歪度は、歪度、太い尾などの特徴の値の分布を記述するために使用される傾向があります。

機能はいくつありますか?SVMで教師付き分類(クラス予測)を試す前に、100,000個のオブジェクトで教師なしクラスタリング(クラス検出)を試しましたか?おそらく、100,000個のオブジェクトを50個未満のクラスにグループ化できます。そのため、分類分析中に新しいクラスメンバーシップをターゲットクラスとして使用できます。これにより、クラスサイズがほぼゼロになるという問題が緩和される場合があります。


1

RbfカーネルでSVMを使用しているときに、この問題に何度も直面しました。Rbfカーネルの代わりに線形カーネルを使用すると問題が解決しましたが、扱うクラスの数は少なくなりました。線形カーネルを使用すると、結果はゆがみが少なく、より正確でした。これで問題が解決することを願っています。

編集:私が元の回答を書いている間、クラスの1つが正しく回答されたので、クラスに重みを付けることを考慮しないほど素朴でした。また、rbfカーネルを使用する際は、sklearnのsvmモジュールによるペナルティパラメータまたは「C」値が一般的すぎることを確認することが重要です。ほとんどの場合、C = 1のデフォルト値は一般的すぎるため、通常はC = 10000の値になります。これが、データ内のクラスの分布が良好であるにもかかわらず、svm(rbf)で歪んだ結果を得る他の人を助けることを願っています。


返信いただきありがとうございます!私は実際に他の多くのアルゴリズム/カーネルを試しましたが、それでも同じタイプの問題があります。ですから、私はアンダーサンプリングのようなアプローチや、クラスを均等にするための何らかの方法を探しています。
mike1886 2014

まあ、まばらなデータの機能が本当に優れている場合にのみ有用ですが、まばらなデータを含むクラスの行を複製することもできます。
user776193 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.