2012-02-15 13 views
32

私はPythonでいくつかの予測モデルを構築しており、scikits learnのSVM実装を使用しています。それは本当に素晴らしく、使いやすく、比較的速いです。Pythonで使用できる最も速いSVM実装

残念ながら、私はランタイムによって制約を受けるようになり始めています。 650フィーチャで約4 - 5000のフルデータセットでrbf SVMを実行します。各ランは約1分かかります。しかし、5倍のクロスバリデーション+グリッド検索(粗い検索から細かい検索まで)では、私の仕事のために少しでも実現できません。だから一般的に、人々はPythonで使える最速のSVMの実装に関して何か勧告を持っていますか?それとも、私のモデリングをスピードアップする方法?

LIBSVMのGPU実装について聞いたことがありますが、これはうまくいくようです。私は、Pythonで使用可能な他のGPU SVM実装については知らないが、間違いなく他の人にも公開されるだろう。また、GPUを使用するとランタイムが大幅に増加しますか?

また、リビジョンSVM +フィーチャマップをscikitsで近似する方法もあると聞いてきました。このアプローチについて人々がどのように考えているかはわかりません。繰り返しになりますが、このアプローチを使用している人は、ランタイムの大幅な増加ですか?

プログラムの速度を上げるためのすべてのアイデアが大歓迎です。

答えて

26

私が知る最もスケーラブルなカーネルSVMの実装はLaSVMです。 Cythonctypesまたはcffiを知っているなら、それはCで書かれているので、Pythonでラップ可能です。あるいは、コマンドラインから使用することもできます。 sklearn.datasetsのユーティリティを使用して、NumPyまたはCSR形式のデータを、LaSVMがトレーニング/テストセットとして使用できるsvmlight形式のファイルにロードできます。

+0

ありがとうオグリエル。私はこれを見ていきます。間違いなく面白そうだ。 Sklearnはsvmライトフォーマットにエクスポートできますか?それは間違いなく便利です。あなたの以前の答えに応じて、残念ながら、私はtimeseriesを扱っているので、無作為サンプリング+電車/試験へのスピッティングはかなり複雑になります。私のモデルを訓練するためのサブサンプリングは、それほど簡単ではありません。ありがとう! – tomas

+0

申し訳ありませんが、sklearnのユーティリティー機能がSVMライト形式でエクスポートできるかどうか分かりますか? – tomas

+0

確かにドキュメントにはありませんが、そこにはあります:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/datasets/svmlight_format.py#L142 – ogrisel

2

SVMライブラリを比較することなく、相互検証(クロスバリデーション)が実際のマルチスレッド(つまり複数のCPUを並行して実行する)の恩恵を受けると考えています。 CPythonを使用している場合は、GILのため、(おそらく)マルチコアマシンを利用しません。

この制限がないPythonの他の実装を試すことができます。 .NETへ行く場合は、PyPyまたはIronPythonを参照してください。

+0

感謝。私がマルチコアコンピュータを利用すると仮定すると、私のプログラムのスピードアップに関する他の提案はありますか?私は、とにかく複数のスレッド間で検証を行う方法を見つけ出すつもりでした。しかし、私はまだスピードアップが必要だと思います。 – tomas

+0

@bavaza、私は長年にわたって複数のコアでPythonを実行してきましたが、うまく動作します。標準CPythonのマルチプロセッシングライブラリを研究してください。 –

+0

@ V3ss0n、ありがとう。素晴らしいlibのように見えます。スレッドではなくプロセスを使用するため、コンテキスト切り替え時のペナルティ(たとえば、ワーカーワーカーを使用する場合)に精通していますか? – bavaza

22

代わりにあなたの代わりに、完全なデータセットの1000個のランダムなサンプルにグリッド検索を実行できます。

>>> from sklearn.cross_validation import ShuffleSplit 
>>> cv = ShuffleSplit(3, test_fraction=0.2, train_fraction=0.2, random_state=0) 
>>> gs = GridSeachCV(clf, params_grid, cv=cv, n_jobs=-1, verbose=2) 
>>> gs.fit(X, y) 

それは5000個のサンプルのための最適なパラメータは、1000個のサンプルのための最適なパラメータに非常に近くなる可能性が非常に高いです。だからこそ、粗いグリッド検索を開始するには良い方法です。

n_jobs=-1すべてのCPUを使用して、個々のCV適合を並行して実行することができます。マルチ処理を使用しているので、Python GILは問題になりません。

8

最初に、scikit-learnのベンチマーク(here)によると、scikit-learnはすでに、最速ではないにしても最速のSVMパッケージの1つです。したがって、トレーニングをスピードアップするための他の方法を検討することもできます。

bavazaが提案したように、トレーニングプロセスをマルチスレッド化することができます。 Scikit-learnのGridSearchCVクラスを使用している場合、n_jobs引数をデフォルト値の1より大きく設定すると、より多くのメモリを使用する代わりに、訓練を並行して実行できます。 あなたは将軍機械学習ライブラリ here

将軍を見てとることができ、クラスを使用する方法の例をhere

代わりに見つけることができ、そのマニュアルhereを見つけることができ、大規模な機械学習のために設計されています多くの一般的なsvmパッケージへのラッパーが付いており、Pythonのバインディングを使ってC/C++で実装されています。上記のScikit-learnのベンチマークによると、速度はscikit-learnに匹敵します。他の仕事(彼らが実演したもの以外)では、もっと速いかもしれないので、試してみる価値があります。

最後に、次元の縮小を試みることができます。 PCAまたはランダム化PCAを使用して、特徴ベクトルの次元を縮小します。それはトレーニングプロセスをスピードアップします。それぞれのクラスのドキュメントは、PCARandomized PCAの2つのリンクにあります。 Scikit-learnの例のセクションでそれらを使用する方法の例を見つけることができます。

4

RBFカーネル(またはその他の2次カーネル)だけを使用したい場合は、LIBSVMをMATLABまたはOctaveで使用することをお勧めします。私は約6秒で7000の観測と500の特徴のモデルを訓練する。

このトリックは、LIBSVMが提供する事前計算カーネルを使用し、いくつかの行列代数を使用して、データを2回ラップするのではなく、1ステップでカーネルを計算します。 LIBSVM自身のRBFカーネルを使用するよりも、カーネルのビルドに約2秒かかります。私はあなたがNumPyを使ってPythonでそうすることができるだろうと推測していますが、試していないのでわかりません。

+4

一般的に、LibSVMは成熟した良いlibですが、私はそれが最速ではないと思っています。そして、7000 x 500はテストするには非常に小さな問題です。 – mrgloom

-1

入力する機能の数を減らすためにrandom forestを使用することを検討します。

機能のインポートを生成するために、ExtraTreesRegressorとExtraTreesClassifierのオプションがあります。この情報を使用して、SVMにフィーチャのサブセットを入力できます。

0

私はScikit-LearnのStochastic Gradient Descentの実装を見ることをお勧めします。デフォルトのヒンジ損失は線形SVMです。私はそれが驚くほど速いことが分かった。

関連する問題