web-dev-qa-db-ja.com

sklearnのSVMはインクリメンタル(オンライン)学習をサポートしていますか?

私は現在、テキスト記事の推奨システムを設計しています(「興味深い」または「面白くない」というバイナリケース)。私の仕様の1つは、変化するトレンドに合わせて継続的に更新することです。

私が言えることから、これを行う最良の方法は、インクリメンタル/ オンライン学習 をサポートする機械学習アルゴリズムを利用することです。

パーセプトロンやWinnowなどのアルゴリズムはオンライン学習をサポートしていますが、サポートベクターマシンについては完全には確信がありません。 scikit-learn pythonライブラリはオンライン学習をサポートしていますか?サポートしている場合、サポートベクターマシンはそれを利用できるアルゴリズムの1つですか?

サポートベクターマシンの使用に完全に縛られているわけではないことは明らかですが、それらは通常、すべてのラウンドパフォーマンスのためにバイナリ分類のgo toアルゴリズムです。最終的には最適なものに変更したいと思います。

39

SVMのオンラインアルゴリズムは存在しますが、線形SVMの特殊なケース向けに多くの効率的なアルゴリズムが開発されているため、カーネルまたは線形SVMのどちらを使用するかを指定することが重要になりました。

線形の場合、ヒンジ損失とL2正則化で scikit-learnのSGD分類子 を使用すると、オンライン/インクリメンタルで更新できるSVMが得られます。これを カーネルに近似する機能変換 と組み合わせて、オンラインカーネルSVMに似たものにすることができます。

私の仕様の1つは、変化するトレンドに合わせて継続的に更新することです。

これは、コンセプトドリフト()と呼ばれ、単純なオンラインSVMではうまく処理されません。 PassiveAggresive分類器を使用すると、学習率が時間とともに低下しないため、より良い結果が得られる可能性があります。

トレーニング/実行中にフィードバックが得られると仮定すると、時間の経過とともに精度の低下を検出し、精度が低下し始めたら新しいモデルのトレーニングを開始できます(より正確になったと思われる場合は新しいモデルに切り替えます)。 [〜#〜] jsat [〜#〜] には2つのドリフト検出メソッドがあり( jsat.driftdetectors を参照)、精度を追跡し、変化したときにアラートを出すことができます。

また、より多くのオンライン線形およびカーネルメソッドがあります。

(バイアスノート:私はJSATの著者です)。

30
Raff.Edward

たぶん私は素朴なのかもしれませんが、データを段階的に提示するときに sci-kit SGD classifier を実際に更新する方法に言及する価値があると思います。

clf = linear_model.SGDClassifier()
x1 = some_new_data
y1 = the_labels
clf.partial_fit(x1,y1)
x2 = some_newer_data
y2 = the_labels
clf.partial_fit(x2,y2)
19
user277194

技術的側面

短い答えはnoです。 Sklearnの実装(および既存の他のほとんどの実装)は、オンラインSVMトレーニングをサポートしていません。 SVMを段階的にトレーニングすることは可能ですが、それほど簡単な作業ではありません。

Sklearnが確率的勾配降下(SGD)を提供するため、答えはyesであるため、線形ケースに制限したい場合は、SVM基準を最小化するオプションがあります。

代わりに、オンラインSVMトレーニングをサポートするpegasosライブラリを試すこともできます。

理論的側面

トレンド適応の問題は現在、MLコミュニティで非常に人気があります。 @Raffが述べたように、それはコンセプトドリフトと呼ばれ、多くのアプローチがあります。基になるMLモデルを変更します(たとえば、データのサブセットを強制的に再トレーニングさせます)。したがって、ここには2つの独立した問題があります。

  • オンライントレーニングの問題。これは純粋に技術的なものであり、SGDまたはsklearn以外のライブラリで対処できます。
  • コンセプトドリフトは、現在ホットなトピックであり、ちょうど機能します回答はありませんコンセプトには多くの可能性、仮説、証明がありますが、実際、この現象に対処する一般的に認められた方法はありません。 MLの多くの博士論文は、現在この問題に基づいています。
9
lejlot

コンセプトドリフトを使用したオンライン学習に興味がある場合は、以前の作業をいくつか紹介

  1. コンセプトドリフトの学習:概要 https://arxiv.org/pdf/1010.4784.pdf

  2. コンセプトドリフトの問題:定義と関連作業 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.58.9085&rep=rep1&type=pdf

  3. コンセプトドリフト適応に関する調査 http://www.win.tue.nl/~mpechen/publications/pubs/Gama_ACMCS_AdaptationCD_accepted.pdf

  4. MOA Concept Drift Active Learning Strategies for Streaming Data http://videolectures.net/wapa2011_bifet_moa/

  5. コンセプトドリフトのアルゴリズムのストリーム http://people.cs.georgetown.edu/~maloof/pubs/maloof.heilbronn12.handout.pdf

  6. コンセプトドリフトを使用したデータストリームのマイニング http://www.cs.put.poznan.pl/dbrzezinski/publications/ConceptDrift.pdf

  7. ストリーム処理と機械学習による時系列データの分析 http://www.ibmbigdatahub.com/blog/analyzing-time-series-data-stream-processing-and-machine-learning

3
SemanticBeeng

バッチ学習タスクのSGDは通常、学習率が低下し、トレーニングセットを複数回繰り返します。したがって、純粋にオンライン学習の場合、sklearn.linear_model.SGDClassifier()でlearning_rateが「constant」に設定され、eta0 = 0.1または任意の値が設定されていることを確認してください。したがって、プロセスは次のとおりです。

clf= sklearn.linear_model.SGDClassifier(learning_rate = 'constant', eta0 = 0.1, shuffle = False, n_iter = 1)
# get x1, y1 as a new instance
clf.partial_fit(x1, y1)
# get x2, y2
# update accuracy if needed
clf.partial_fit(x2, y2)
3
Alaleh Rz

SVMをスケーリングする方法は、大規模なデータセットをSVMアルゴリズムで安全に使用できるバッチに分割し、各バッチのサポートベクトルを個別に検索し、次に、すべてのバッチ。

トレンドへの更新は、トレーニングパイプラインを実行するたびに時間枠を維持することで実現できます。たとえば、1日に1回トレーニングを行い、1か月の履歴データに十分な情報がある場合、最近30日間に取得した履歴データからトレーニングデータセットを作成します。

1
Sergey Zakharov