13

名目上は良い問題ですが、何かおかしいことが起こっているからだと確信しています...

コンテキストとして、私は顔の表情/認識空間の問題に取り組んでいるので、100% の精度を得ることは信じられないほど信じられないようです (ほとんどのアプリケーションでもっともらしいというわけではありません...)。データセットには一貫したバイアスがあり、SVM が答えを引き出すのを非常に簡単にしている、= または = のいずれかだと思います。おそらく、SVM 側で何か間違ったことをしたのでしょう。

何が起こっているのかを理解するのに役立つ提案を探しています-それは私ですか(=私のLibSVMの使用法)? それともデータですか?

詳細:

  • 約 2500 個のラベル付きデータ ベクトル/インスタンス (変換された個人のビデオ フレーム -- 合計 20 人未満)、バイナリ分類問題。~900 機能/インスタンス。約 1:4 の比率で設定された不均衡なデータ。
  • subset.py を実行して、データをテスト (500 インスタンス) とトレーニング (残り) に分けました。
  • 「svm-train -t 0」を実行しました。(注:明らかに「-w1 1 -w-1 4」は必要ありません...)
  • テスト ファイルに対して svm-predict を実行しました。精度=100%!

試したこと:

  • 不注意なコマンドライン引数エラーにより、同じデータファイルでトレーニングとテストを行っていないことを約10回確認しました
  • Subset.py を (-s 1 を使用しても) 何度も再実行し、複数の異なるデータ セットのみをトレーニング/テストしました (最も魔法のようなトレーニング/テスト PA をランダムに実行した場合)
  • テストファイルがトレーニングデータのサブセットではないことを確認するために、単純な差分のようなチェックを実行しました
  • データの svm-scale は精度に影響しません (accuracy=100%)。(ただし、サポート ベクターの数は nSV=127、bSV=64 から nBSV=72、bSV=0 に減少します。)
  • ((奇妙)) デフォルトの RBF カーネル (逆線形 -- つまり、'-t 0' を削除) を使用すると、精度がガベージ (?!) になります
  • (サニティ チェック) スケーリングされたデータ セットでトレーニングされたモデルをスケーリングされていないデータ セットに対して使用して svm-predict を実行すると、精度 = 80% になります (つまり、常に支配的なクラスを推測します)。これは厳密には、私のマシンで svm-predict が名目上正しく動作していることを確認するための健全性チェックです。

暫定的な結論?:

データの何かがおかしくなっています。どういうわけか、データ セット内に、SVM が検出している微妙な実験者主導の効果があります。

(しかし、これは最初のパスで、RBF カーネルがガベージ結果を返す理由を説明しません。)

a) LibSVM の使用法を修正する方法 (それが実際に問題である場合) または b) LibSVM が拾っているデータの微妙な実験バイアスを判断する方法についての提案をいただければ幸いです。

4

2 に答える 2

11

その他の 2 つのアイデア:

同じデータでトレーニングとテストを行っていないことを確認してください。これはばかげているように聞こえますが、コンピューター ビジョン アプリケーションでは次の点に注意する必要があります。データを繰り返していないことを確認してください (たとえば、同じビデオの 2 つのフレームが異なるフォールドにあるとします)。同じ個人に対してトレーニングとテストを行っていないことを確認してください。 、など。それは聞こえるよりも微妙です。

RBF カーネルのガンマおよび C パラメータを検索してください。線形分類器が単なる縮退 RBF 分類器であることを正当化する優れた理論的 (漸近的) 結果があります。したがって、適切な (C、ガンマ) ペアを探す必要があります。

于 2011-08-23T02:31:34.023 に答える
10

悪魔は細部に宿るということにもかかわらず、試してみることができる 3 つの簡単なテストを以下に示します。

  1. 急ごしらえ (~2 分): デシジョン ツリー アルゴリズムを使用してデータを実行します。これは を介し​​て Matlab で利用できます。classregtreeまたは、R に読み込んで を使​​用することもできますrpart。これにより、1 つまたはいくつかの機能がたまたま完全に分離されているかどうかがわかります。
  2. それほど迅速ではない (インフラストラクチャによっては、10 ~ 60 分程度): 機能を繰り返し分割し (つまり、900 から 450 の 2 セット)、トレーニング、およびテストを行います。サブセットの 1 つが完全な分類を提供する場合は、それを再度分割します。問題の変数がどこにあるかを見つけるのにかかる分割は 10 回未満です。多くの変数が残っている状態で (または最初の分割でも) 「壊れる」場合は、特徴の別のランダムなサブセットを選択するか、一度に削減する変数の数を減らすなどします。データを分割するために 900 個すべてが必要になることはありません。 .
  3. より深い分析 (数分から数時間): ラベルの順列を試します。それらすべてを並べ替えても完全な分離が得られる場合は、トレーニング/テストのセットアップに問題があります。ますます大きなサブセットを選択して置換する場合 (または、逆方向に移動する場合は静的のままにする場合)、どこから分離可能性が失われ始めるかを確認できます。または、トレーニング セットのサイズを小さくすることを検討してください。非常に小さなトレーニング セットでも分離可能になる場合は、何かがおかしいです。

方法 1 は高速であり、洞察に富む必要があります。他にもお勧めできる方法がいくつかありますが、1 と 2 は簡単で、洞察が得られないのは奇妙です。

于 2011-08-23T02:17:24.193 に答える