sklearn-過剰適合問題


8

現在の機械学習の問題を解決する最善の方法に関する推奨事項を探しています

問題の概要と私が行ったことは次のとおりです:

  • EEGデータの900回以上の試行があり、各試行は1秒の長さです。それぞれのグラウンドトゥルースは既知であり、状態0と状態1を分類します(40〜60%の分割)
  • 各試行は、特定の周波数帯域のパワーをフィルタリングおよび抽出する前処理を通過し、これらは一連の機能を構成します(機能マトリックス:913x32)
  • 次に、sklearnを使用してモデルをトレーニングします。cross_validationは、テストサイズ0.2を使用する場合に使用されます。分類子はrbfカーネルでSVCに設定されています、C = 1、ガンマ= 1(私はいくつかの異なる値を試しました)

ここでコードの短縮版を見つけることができます:http : //pastebin.com/Xu13ciL4

私の問題:

  • 分類子を使用してテストセットのラベルを予測すると、すべての予測が0になる
  • トレイン精度は1ですが、テストセット精度は約0.56です。
  • 私の学習曲線プロットは次のようになります:

ここに画像の説明を入力してください

さて、これはここでオーバーフィットの古典的なケースのようです。ただし、ここでの過剰適合は、サンプルに対する特徴の数が極端に多い(32個の特徴、900個のサンプル)ために発生することはほとんどありません。私はこの問題を軽減するためにいくつかのことを試みました:

  • サンプル数に対して機能が多すぎるために、次元削減(PCA)を使用してみましたが、精度スコアと学習曲線プロットは上記と同じに見えます。コンポーネントの数を10未満に設定しない限り、トレインの精度は低下し始めますが、情報を失い始めていることを考えると、これは多少予想されませんか?
  • データの正規化と標準化を試みました。標準化(SD = 1)は、トレインまたは精度スコアを変更することはありません。(0-1)を正規化すると、トレーニングの精度が0.6に低下します。
  • SVCに対してさまざまなCおよびガンマ設定を試しましたが、どちらのスコアも変更されません
  • GaussianNBなどの他の推定量を使用して、adaboostなどのアンサンブル法を使用してみました。変化なし
  • linearSVCを使用して正則化メソッドを明示的に設定しようとしましたが、状況は改善されませんでした
  • theanoを使用してニューラルネットで同じ機能を実行してみましたが、列車の精度は約0.6、テストは約0.5です

私は問題について考え続けることができてうれしいですが、この時点で私は正しい方向へのナッジを探しています。私の問題はどこにあり、それを解決するために私は何ができますか?

私の機能のセットが2つのカテゴリーを区別しないだけの可能性は十分にありますが、この結論にジャンプする前に他のいくつかのオプションを試してみたいと思います。さらに、私の機能が区別されない場合、それは低いテストセットスコアを説明しますが、その場合、どのようにして完璧なトレーニングセットスコアを取得できますか?それは可能ですか?


1
PCAを適用した後、2次元または3次元でデータはどのように見えましたか?顕著なクラスターはありましたか?どのような例が誤って分類されていますか?パターンはありますか?
image_doctor 2015

トレースのパワースペクトルはどのように見えますか?各クラスの平均スペクトルをプロットする場合、それらは異なるように見えますか?そうである場合、どのようにして、分類器を最適化してその違いをキャプチャできますか?
image_doctor

1)PCAクラスタープロットを表示できますか?、2)決定木を試しましたか?元の機能がやや人間に精査可能である場合、どこが間違っているのかを理解できる場合があります。それ以外の場合(あなたの側にいくつかの愚かなバグを除いて)、あなたの機能は単に十分に差別的ではないようです。
lollercoaster 2015

EEGデータが分離可能ではない可能性は高いですが、トレーニングvテストセットがバイアスされていないことを確認しましたか(例:正の例しかない、または正規化が異なっている)。
jamesmf 2015

1
データをどこかに投稿できますか?"allData"または "features_all"(正規化およびPCAなし)。
stmax 2016年

回答:


1

SVMがすべての信号をキャプチャできるかどうかを確認するには、データのバランスをとってください。正確に50%の正のサンプルと50%の負のサンプルで構成されるトレーニングセットとテストセットを作成します(つまり、大きい方からランダムにサブサンプリングします)。また、データを標準化します(平均を差し引き、標準偏差で割ります)。

(バランスをとるために、sklearnでclass_weightパラメーターを変更してみることもできますが、手動の方法(サブサンプリング)の方がうまく機能することがわかりました。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.