28

特定のアプリケーションでは、機械学習が必要でした (学部課程で学んだことは知っています)。サポート ベクター マシンを使用して問題を解決しました。その正常に動作します。

今、私はシステムを改善する必要があります。ここでの問題は

  1. 追加のトレーニング例を毎週受け取ります。現在、システムは更新された例 (古い例 + 新しい例) で新たにトレーニングを開始します。インクリメンタルラーニングにしたい。(以前の例の代わりに) 以前の知識を新しい例で使用して、新しいモデル (知識) を取得する

  2. 私のトレーニング例には3つのクラスがあります。したがって、すべてのトレーニング例は、これら 3 つのクラスのいずれかに当てはまります。「不明」クラスの機能が欲しい。これら 3 つのクラスに当てはまらないものはすべて、「不明」としてマークする必要があります。しかし、「Unknown」を新しいクラスとして扱い、これについても例を提供することはできません。

  3. 「unknown」クラスが実装されていると仮定します。クラスが「不明」の場合、アプリケーションのユーザーは、クラスが何であるかを入力します。ここで、ユーザー入力を学習に組み込む必要があります。私もこれを行う方法についてはわかりません。ユーザーが新しいクラス (つまり、トレーニング セットにまだ含まれていないクラス) を入力した場合、違いはありますか?

新しいアルゴリズムを選択する必要がありますか?それとも、サポート ベクター マシンがこれを実行できますか?

PS: SVM に libsvm 実装を使用しています。

4

4 に答える 4

9

あなたの質問と同じ組織を使用して回答を書きました(1.、2.、3)。

  1. SVM はこれを行うことができますか?つまり、インクリメンタル ラーニングですか? 多層パーセプトロンはもちろん可能です。後続のトレーニング インスタンスは基本的なネットワーク アーキテクチャに影響を与えないため、重み行列の値を調整するだけです。しかし、SVM?(理論的には) トレーニング インスタンスを 1 つ追加すると、サポート ベクターの選択が変わる可能性があるように思えます。しかし、繰り返しますが、わかりません。

  2. この問題は、LIBSVM を 1 対多、つまり1 クラスの分類子として構成することで、非常に簡単に解決できると思います。SVM1 クラスの分類器です。マルチクラスに SVM を適用するということは、複数の段階的な 1 対多の分類を実行するようにコーディングされていることを意味しますが、アルゴリズムは一度に 1 つのクラスでトレーニング (およびテスト) されます。これを行うと、テスト セットに対して段階的に実行した後に残るものは「不明」になります。つまり、複数の連続した 1 クラス分類を実行した後に分類されないデータはすべて、定義により「不明」になります。 ' クラス。

  3. ユーザーの推測を機能 (つまり、別の従属変数) にしないのはなぜですか? 他の唯一のオプションは、それをクラス ラベル自体にすることですが、それは望ましくありません。したがって、たとえば、データマトリックス「ユーザークラスの推測」に列を追加し、「不明」カテゴリに属さないデータポイントに対して影響を与えない可能性が最も高い値を入力するだけで、ユーザーがこの値は「0」または「1」の可能性がありますが、実際にはデータのスケーリングと正規化の方法によって異なります)。

于 2010-08-10T09:40:33.470 に答える
5

基本的に、適切なインクリメンタル SVM 実装が存在しないため、最初の項目が最も困難になる可能性があります。

数か月前、オンラインまたはインクリメンタルSVM アルゴリズムについても調査しました。残念ながら、実装の現在の状態は非常にまばらです。私が見つけたのは、Matlab の例OnlineSVR (回帰サポートのみを実装する論文プロジェクト)、およびSVMHeavy (バイナリ クラスのサポートのみ) だけでした。

私はそれらのどれも個人的に使用していません。それらはすべて「研究玩具」の段階にあるようです。SVMHeavy をコンパイルすることさえできませんでした。

今のところ、更新を組み込むために定期的なバッチ トレーニングを実行することでおそらく回避できます。私も LibSVM を使用していますが、これは非常に高速であるため、適切なインクリメンタル バージョンが実装されるまでは、これが適切な代替手段になるはずです。

また、SVM がデフォルトで「未知の」サンプルの概念をモデル化できるとは思いません。それらは通常、一連のブール分類子として機能するため、サンプルが以前に見られたものと大幅に異なっていたとしても、サンプルは最終的に何らかのものとして積極的に分類されます。可能な回避策は、機能の範囲をモデル化し、これらの範囲外に存在するサンプルをランダムに生成してから、これらをトレーニング セットに追加することです。

たとえば、最小値が 4 で最大値が 123 の「色」という属性がある場合、これらをトレーニング セットに追加できます。

[({'color':3},'unknown'),({'color':125},'unknown')]

あなたのSVMに「未知の」色が何を意味するかを理解させるために。

于 2010-08-10T20:02:13.357 に答える
4
  1. SVM を段階的にトレーニングするアルゴリズムはありますが、libSVM がこれを実装しているとは思いません。この機能が本当に必要かどうかを検討する必要があると思います。トレーニング プロセスが遅すぎる場合を除き、現在のアプローチに問題はないと思います。そうであれば、バッチで (つまり、100 個の新しい例ごとに) 再トレーニングできますか?
  2. libSVM を取得して、クラス メンバーシップの確率を生成できます。これはマルチクラス分類で実行できると思いますが、それについては完全にはわかりません。分類が十分に確実ではないしきい値を決定し、「不明」を出力する必要があります。最も可能性の高いクラスと 2 番目に可能性の高いクラスの差にしきい値を設定するようなことで、これが達成されると思います。
  3. libSVM は、いくつもの新しいクラスに対応できると思います。ただし、新しいクラスを追加すると、モデルの精度が低下する可能性があります。
于 2010-08-10T08:02:46.817 に答える
3

この質問はおそらく時代遅れですが、私はいくつかの追加の考えを与える義務があると感じています。

  1. あなたの最初の質問は他の人によって答えられたので(それが可能であるとしても、インクリメンタル学習を実装する本番対応のSVMはありません)、私はそれをスキップします。;)

  2. クラスとして「不明」を追加することはお勧めできません。用途によって理由は異なります。

    • 「このインスタンスは分類されていませんが、既知のクラスの1つに属している」のタグとして「不明」クラスを使用している場合、SVMは深刻な問題を抱えています。その理由は、libsvmがいくつかのバイナリ分類子を構築し、それらを組み合わせるためです。したがって、3つのクラス(たとえば、A、B、C)がある場合、SVMは、トレーニング例を「Aとして分類」と「その他のクラス」に分割することにより、最初のバイナリ分類器を構築します。後者には、明らかに「不明」クラスのすべての例が含まれます。超平面を構築しようとすると、「不明」(実際にはクラス「A」に属する)の例により、SVMが非常に小さなマージンで超平面を構築し、Aの将来のインスタンス、つまり一般化パフォーマンスを十分に認識しない可能性があります。減少します。それか'

    • 'Unknown'クラスを使用してすべての例を格納している場合、別の問題が発生します。そのクラスはまだSVMに認識されていません。たとえば、SVMはクラスA、B、Cを認識していますが、最近2つの新しいクラスDとEのサンプルデータを取得しました。これらの例は分類されておらず、新しいクラスはSVMに認識されていないため、一時的に保存することをお勧めします。それらは「不明」にあります。その場合、「Unknown」クラスは、その機能の値に大きなばらつきがある例が含まれている可能性があるため、問題を引き起こす可能性があります。そのため、適切な分離超平面を作成することが非常に困難になるため、結果として得られる分類器は、DまたはEの新しいインスタンスを「不明」としてほとんど認識しません。おそらく、A、B、またはCに属する新しいインスタンスの分類も妨げられます。

    要約すると、既知のクラスの例またはいくつかの新しいクラスの例を含む「不明な」クラスを導入すると、分類子が不十分になります。分類器をトレーニングするときは、分類されていないインスタンスをすべて無視するのが最善だと思います。

  3. 分類アルゴリズムの外でこの問題を解決することをお勧めします。私は自分でこの機能を求められ、問題のオブジェクトの画像と既知の各クラスのボタンを表示する単一のWebページを実装しました。問題のオブジェクトがまだ不明なクラスに属している場合、ユーザーは別のフォームに入力して新しいクラスを追加できます。彼が分類ページに戻ると、そのクラスの別のボタンが魔法のように表示されます。インスタンスが分類された後、それらは分類器のトレーニングに使用できます。(データベースを使用して既知のクラスを格納し、どの例がどのクラスに属するかを参照しました。データをSVM対応にするためにエクスポート機能を実装しました。)

于 2013-02-06T15:29:25.073 に答える