SVMの実装、scikitsの実行時間の短縮、最速のSVM

私はSVMを使っていくつかの予測モデルを構築するscikit-learnを学んでいます。私は約5000の例と約700の特徴を持つデータセットを持っています。私は自分のトレーニングセットで18x17グリッド検索を使って5倍のクロスバリデーションを行い、次にテストセットに最適なパラメータを使用します。ランは私が予想したよりもはるかに長い時間を取っていると私は次のことに気づいた:

1)個々のSVMトレーニングの反復はわずか1分かかりますが、他のSVMトレーニングの反復は15分ほどかかります。これは異なるデータとパラメータ(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時間かかりました。なぜそのような違いがありますか?

4

3 答え

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

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

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

まず、フィーチャを正規化したかどうかを確認します(たとえば、データが密集している場合は平均とスケールフィーチャを分散で除外します)。スパースデータの場合は、フィーチャをスケールするだけです(たとえば、テキストデータにTF-IDFトランスフォームを使用するなど)。ドキュメントの前処理セクションをご覧ください。

次に、粗いグリッド(大規模な対数ステップを持つ)から始めて、3x3グリッドを言い、次にそのエリアに3x3グリッドを再実行して面白いエリアに注目する必要があります。一般に、CxガンマSVMパラメータグリッドは非常に滑らかです

6
追加された
@オジゼル、一般的な粗くて細かいグリッドサーチャーはどうですか?
追加された 著者 denis,
"違うかもしれない":そうしないでください。最初の5x5の粗いグリッド→ncross異なるC、ガンマ - > one3x3 subgrid - > one と言う5x5細かいグリッド...
追加された 著者 denis,
答えオグリセルに感謝します。彼らは多くの意味があります。私は32bitと64bitのどちらの問題についてもわからないが、チャンスがあれば、もう少し時間をかけて実行しようとするだろう。私のデータは前処理され(0-1に正規化されています)、私はscikits(おそらく過剰殺到)のためにcache_sizeを4000に増やしました。私は間違いなく私のコードを修正して、粗いグリッドからより小さな領域に移動するようにします。それは間違いなく私のコードのスピードアップに役立ちます。再度、感謝します。
追加された 著者 tomas,
私は、クロスバリデーション+グリッド検索を行っている場合、どのように粗いグリッド検索を使うことができますか?クロス検証をいくつか実行して平均化しようとすると、粗いものから細かいものまで、検索スペースは一致しません。私にはわからない/紛失した良い方法があると確信しています。
追加された 著者 tomas,
はい、私は理解していますが、クロスバリデーションをするとグリッド検索を5回実行します。より細かい5x5の検索スペースは、各クロスバリデーションごとに異なる可能性があります。最適なテストセットのパラメータを見つけるためにクロスバリデーションの実行よりもフィット感を平均する方法
追加された 著者 tomas,

libsvmベースのSVCは、 O(n_features * n_samples ^ 2) O(n_features * n_samples ^ 3)との間でトレーニングの複雑さがあります。 LinearSVC(liblinearに基づいています)には、複雑なテストの複雑さと O(n_features)の複雑さがあります。

4
追加された
実際には、 SGDClassifier は、scikit-learnでリニアSVMモデルをフィッティングする方がより高速です。私たちはまだ平均化を実装していません:)
追加された 著者 ogrisel,
知っておいて、ありがとう!
追加された 著者 Mikhail Korobov,

SGD is very fast, but 1) linear only, not rbf, 2) parameters alpha eta0 ... which I have no idea how to vary: over to the expert, O. Grisel.

On 32 vs. 64 bit python (what hardware, what py version ?), I have no idea, but that might be worth a general question on SO -- there must be benchmark suites. Can you see CPU usage > 90 %, count garbage collections ?

3
追加された
明示的な機能マップとSGDClassifierなどの線形分類子を使用します。
追加された 著者 ogrisel,
私は決して eta0 を調整しようとはしません(おそらく私はすべきです)。 LinearSVC C のように、 alpha の場合は GridSearchCV を使用します。
追加された 著者 ogrisel,
ああ、そうです。アルファとeta0をどのように変化させるかに関するコメント?
追加された 著者 denis,