34

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

残念ながら、私はランタイムに制約され始めています。650 の機能を持つ約 4 ~ 5000 の完全なデータセットで rbf SVM を実行します。各実行には約 1 分かかります。しかし、5 分割クロス検証 + グリッド検索 (粗い検索から詳細な検索を使用) を使用すると、当面のタスクには少し実行できなくなります。一般的に、Python で使用できる最速の SVM 実装に関して、何か推奨事項はありますか? それ、または私のモデリングをスピードアップする方法はありますか?

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

また、scikit で線形 SVM + 機能マップを使用して rbf SVM を近似する方法があると聞いたことがあります。人々がこのアプローチについてどう思うかはわかりません。繰り返しますが、このアプローチを使用している人は、実行時間が大幅に増加しますか?

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

4

10 に答える 10

29

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

于 2012-02-15T20:33:39.303 に答える
23

または、完全なデータセットの代わりに、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フィットを並行して実行することができます。マルチプロセッシングを使用しているため、PythonGILは問題になりません。

于 2012-02-15T20:29:17.417 に答える
8

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

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

または、こちらの Shogun Machine Learning Library を ご覧ください。

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

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

于 2012-09-27T03:30:39.517 に答える
3

RBF カーネル (またはその他の 2 次カーネル) のみを使用することに関心がある場合は、MATLABまたはOctaveで LIBSVM を使用することをお勧めします。約 6 秒で 7000 の観測と 500 の特徴のモデルをトレーニングします。

その秘訣は、LIBSVM が提供する事前計算されたカーネルを使用し、データを 2 回繰り返し処理する代わりに、行列代数を使用して 1 ステップでカーネルを計算することです。カーネルのビルドには約 2 秒かかりますが、LIBSVM 独自の RBF カーネルを使用するとさらに多くの時間がかかります。NumPyを使用して Python で実行できると思いますが、試したことがないのでわかりません。

于 2012-10-25T16:03:15.540 に答える
2

SVM ライブラリを比較することはあまりしませんが、あなたが説明しているタスク (クロス検証) は、実際のマルチスレッド (つまり、複数の CPU を並行して実行する) の恩恵を受けることができると思います。CPythonを使用している場合、 GILが原因で、(おそらく) マルチコア マシンを利用できません。

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

于 2012-02-15T18:58:22.123 に答える
1

svm_light を試してみてください!

これは、 Cornell の悪名高い Thorsten Joachimsによる非常に高速な C 実装であり、優れた Python バインディングを備えており、pip install pysvmlight.

于 2013-04-29T18:58:13.677 に答える
1

If your problem is in two classes, this wrapping of CUDA-based SVM with scikit-learn is useful:

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

于 2015-04-28T12:20:09.427 に答える
1

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

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

于 2013-05-31T04:52:42.200 に答える