2012-02-06 20 views
4

SVMでいくつかの予測モデルを構築するscikit-learnで作業しています。私は約5000の例と約700の特徴を持つデータセットを持っています。私は自分のトレーニングセットで18x17グリッド検索を使って5倍のクロスバリデーションを行い、次にテストセットに最適なパラメータを使用します。いくつかの個々のSVMの訓練の反復は他の人が最大15分かかることができますが、唯一の分を取るように見える)SVMの実装、scikitsの実行時間の短縮、最速のSVM

1:実行は、私が予想以上に時間をたくさん取っていると私は次のように気づきました。これは異なるデータとパラメータ(Cとガンマ、私はrbfカーネルを使用しています)で期待されていますか?

2)余分なメモリを利用するために64ビットのPythonをWindows上で使用しようとしていますが、私のすべてのPythonプロセスはタスクマネージャの1ギガでトップに見えますが、ランタイムと関係します。私は結果を下に保存していないのに

3)私はそれがかなり速いもの)(前32ビットを使用し、同じデータセットについてのランニング、と私は覚えていました。私は、32ビットのPythonでこれを試してみるのが良いかどうかわからないので、第三者ビルドのscikit-learnを64ビットウィンドウ用に使用しましたか? (ソースhttp://www.lfd.uci.edu/~gohlke/pythonlibs/

どのように私はランタイムを減らすことができます上の提案は大歓迎です。私はグリッド検索の検索スペースを減らすのが助かりますが、最適なパラメータの範囲についてもわからないので、できるだけ大きなものにしておきたいと思います。より高速なSVM実装がある場合は、私に知らせてください。私はそれらを試すかもしれません。

補足:私は戻って、32ビット版をもう一度実行しようとしました。何らかの理由ではるかに高速です。 16時間で64ビットバージョンに到達するまでには約3時間かかりました。なぜそのような違いがありますか?

答えて

6

1)これは、小さなガンマと小さな正則化がより多くのサポートベクトルを選択するため、モデルはより複雑で長くフィットすることが予想されます。

2)は、基本となるLIBSVMライブラリに渡されますcache_size引数があります。しかし、あなたのデータに応じて、libsvmは利用可能なキャッシュをすべて使用するかもしれません。

3)わかりません。両方のプラットフォームでより多くの時間をかけた実験をしていますが、あなたの発見をプロジェクトのメーリングリストに報告してください。これ以上の調査が必要な場合があります。あなたの機能を正規化

最初のチェックは、(データが密なnumpyの配列である場合、例えば分散により平均とスケール機能を削除します)。スパースデータの場合は、フィーチャをスケールするだけです(たとえば、テキストデータにTF-IDFトランスフォームを使用するなど)。このドキュメントのpreprocessing sectionをご覧ください。

次に、粗いグリッド(大規模な対数ステップを持つ)から始めて、3x3グリッドとし、その領域に3x3グリッドを再実行して面白い領域に焦点を当ててみましょう。一般に、C xガンマSVMパラメータグリッドはquite smoothです。

+0

お返事ありがとうございます。彼らは多くの意味があります。私は32bitと64bitのどちらの問題についてもわからないが、チャンスがあれば、もう少し時間をかけて実行しようとするだろう。私のデータは前処理され(0-1に正規化されています)、私はscikits(たぶん、過剰スキル)のためにcache_sizeを4000に増やしました。私は間違いなく私のコードを修正して、粗いグリッドからより小さな領域に移動するようにします。これは間違いなく私のコードのスピードアップに役立ちます。再度、感謝します。 – tomas

+0

@Origrisel、一般的な粗くて細かいグリッドサーチャーはどうですか? – denis

+0

他の質問があります。クロスバリデーション+グリッド検索を行っている場合、どのように粗いグリッド検索を使用することができますか?クロス検証をいくつか実行して平均化しようとすると、粗いものから細かいものまで、検索スペースは一致しません。私にはわからない/紛失した良い方法があると確信しています。 – tomas

3

SGD は非常に高速ですが、 1)リニアだけではなく、RBF、 2)パラメータアルファETA0 ...私は変化させる方法を見当がつかないた: を専門家、O. Griselに上。

32ビット版と64ビット版のPython(どのようなハードウェア、どのPyバージョン?)、 私はよく分かりませんが、それはベンチマークスイートが必要です。 CPU使用率> 90%、ガベージコレクション数を確認できますか?

+0

[明示的な機能を使用してスケーラブルな方法で非線形RBFカーネルを近似することは可能ですマップ](http://scikit-learn.org/dev/auto_examples/plot_kernel_approximation.html#example-plot-kernel-approximation-py)およびSGDClassifierなどの線形分類器を使用します。 – ogrisel

+0

ああ、そうです。アルファとeta0をどのように変化させるかに関するコメント? – denis

+0

私は決して 'eta0'を調整しようとしません(多分私はすべきです)。 'alpha'では' LinearSVC'の 'C'のように' GridSearchCV'を使います。 – ogrisel

4

あなたがこれを買う余裕ができた場合は、LinearSVCを使用して考えてみます(liblinearに基づく)LinearSVCがO(n_features*n_samples)トレーニングの複雑さとO(n_features)テストの複雑さを持っていながら、LIBSVMベースのSVCは、O(n_features * n_samples^2)O(n_features * n_samples^3)間のトレーニングの複雑さを持っています。

+0

実際には、 'SGDClassifier'は、scikit-learnで線形SVMモデルをフィッティングする方がさらに高速です。そしてまだ平均化を実装していません:) – ogrisel

+0

おかげで、ありがとう! –

関連する問題