web-dev-qa-db-ja.com

Pythonで使用可能な最速のSVM実装

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

残念ながら、ランタイムに制約され始めています。 650の機能を備えた約4〜5000の完全なデータセットでrbf SVMを実行します。各実行には約1分かかります。しかし、5倍のクロス検証+グリッド検索(粗い検索から細かい検索を使用)では、手元のタスクには少し実行不可能になります。それでは一般的に、Pythonで使用できる最速のSVM実装に関して推奨事項はありますか?それ、またはモデリングを高速化する方法はありますか?

LIBSVMのGPU実装について聞いたことがありますが、動作するようです。 Pythonで使用できる他のGPU SVM実装は知りませんが、他の人には間違いなく開かれています。また、GPUを使用するとランタイムが大幅に増加しますか?

Scikitsで線形SVM +機能マップを使用して、rbf SVMを近似する方法があることも聞きました。人々がこのアプローチについてどう思うかわからない。繰り返しますが、このアプローチを使用している人は、ランタイムが大幅に増加していますか?

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

34
tomas

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

29
ogrisel

または、完全なデータセットではなく、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近似を並行して実行することを可能にします。 mulitprocessingを使用しているため、python GILは問題になりません。

23
ogrisel

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

Bavazaが示唆するように、トレーニングプロセスをマルチスレッド化することができます。 Scikit-learnのGridSearchCVクラスを使用している場合、n_jobs引数を簡単にデフォルト値の1より大きく設定して、より多くのメモリを使用してトレーニングを並行して実行できます。あなたはそのドキュメントを見つけることができます here クラスを使用する方法の例は見つけることができます here

または、Shogun Machine Learning Library here をご覧ください

Shogunは、多くの一般的なsvmパッケージのラッパーを使用した大規模な機械学習向けに設計されており、Pythonのバインディングを使用してC/C++で実装されています。上記のScikit-learnのベンチマークによると、速度はscikit-learnに匹敵します。他のタスク(彼らが示したもの以外)では、より高速になる可能性があるため、試してみる価値があります。

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

8
lightalchemist

RBFカーネル(または他の任意の2次カーネル)のみを使用することに興味がある場合は、LIBSVMを [〜#〜] matlab [〜#〜] または オクターブ 。約6秒で7000個の観測と500個のフィーチャのモデルをトレーニングします。

秘Theは、LIBSVMが提供する事前計算済みのカーネルを使用し、データを2回ロッピングするのではなく、いくつかの行列代数を使用して1ステップでカーネルを計算することです。 LIBSVM独自のRBFカーネルを使用した場合と比べて、カーネルのビルドには約2秒かかります。 Python NumPy を使用してそうすることができると思いますが、試したことがないのでわかりません。

4
charlieBrown

SVMライブラリを比較することをあまりせずに、あなたが説明しているタスク(クロスバリデーション)は、実際のマルチスレッド化(つまり、複数のCPUを並行して実行すること)の恩恵を受けることができると思います。 CPython を使用している場合、 [〜#〜] gil [〜#〜] により、(おそらく)-マルチコアマシンを利用しません。

Pythonのこの制限がない他の実装を試すことができます。 PyPy または IronPython を参照してください。ネット。

2
bavaza

問題が2つのクラスにある場合、CUDAベースのSVMとscikit-learnのラッピングは便利です。

https://github.com/niitsuma/gpusvm/tree/master/python

1
niitsuma

svm_light

これは Cornellの悪名高いThorsten Joachims からの非常に高速なC実装であり、良好なPythonバインディングがあり、pip install pysvmlight

Scikit-Learnの 確率的勾配降下法 実装をご覧になることをお勧めします。デフォルトのヒンジ損失は線形SVMです。驚くほど速いことがわかりました。

0
szxk

ランダムフォレスト を使用して、入力する機能の数を減らすことを検討します。

機能の重要度を生成するためのExtraTreesRegressorおよびExtraTreesClassifierのオプションがあります。その後、この情報を使用して、機能のサブセットをSVMに入力できます。

0
denson