scikit学習を使用するSVMは無限に実行され、実行を完了しません


76

595605行と5列(機能)のあるトレーニングデータセットと、397070行のテストデータセットでscikit learn(python)を使用してSVRを実行しようとしています。データは前処理され、正規化されています。

テスト例を正常に実行することはできますが、データセットを使用して実行し、1時間以上実行しても、プログラムの出力または終了を確認できませんでした。別のIDEを使用して、さらにはターミナルからも実行しようとしましたが、それは問題ではないようです。また、「C」パラメーター値を1から1e3に変更してみました。

scikitを使用するすべてのsvm実装で同様の問題に直面しています。

私はそれが完了するのを十分に待っていませんか?この実行にはどれくらい時間がかかりますか?

私の経験から、それは数分以上は必要ありません。

システム構成は次のとおりです。Ubuntu14.04、8GB RAM、大量の空きメモリ、第4世代i7プロセッサ


コードを提供してもらえますか?また、トレーニングやテストに時間がかかりますか?小規模なトレーニング/テストデータセットはどうですか?
ffriend

私はcsvファイルからpandasデータフレームにデータを読み込んで、それをscikitの学習機能に渡しているだけです。それで全部です!コードを提供することは、本当にここに助けないだろう
tejaskhot

6
sklearnのSVM実装には、少なくとも3つのステップが含まれます。1)SVRオブジェクトの作成、2)モデルのフィッティング、3)値の予測。最初のステップでは、使用中のカーネルについて説明します。これにより、内部プロセスをよりよく理解できます。2番目と3番目の手順はかなり異なります。少なくとも、どれに時間がかかるかを知る必要があります。それが訓練である場合、学習は時々遅いので、それは大丈夫かもしれません。テスト中の場合、SVMでのテストは非常に高速であるため、おそらくバグがあります。また、SVMではなく、その時間がかかるCSV読み取りである場合があります。したがって、これらすべての詳細が重要になる場合があります。
ffriend 14

私もsvmを介して同じ問題に直面していますが、正規化後にどれくらい時間がかかるか誰にも教えてもらえますか?
kashyap kitchlu

回答:


70

カーネル化SVMでは、データセット内の各ポイント間の距離関数の計算が必要です。これは、の支配コストです。距離の保存はメモリの負荷であるため、その場で再計算されます。ありがたいことに、ほとんどの場合、決定境界に最も近いポイントのみが必要です。頻繁に計算された距離はキャッシュに保存されます。キャッシュがスラッシングされている場合、実行時間は。O(nfeatures×nobservations2)O(nfeatures×nobservations3)

このキャッシュを増やすには、SVRを次のように呼び出します。

model = SVR(cache_size=7000)

一般に、これは機能しません。しかし、すべてが失われるわけではありません。データをサブサンプリングし、残りを検証セットとして使用するか、別のモデルを選択できます。200,000の観測範囲を超える場合、線形学習器を選択するのが賢明です。

カーネル行列を近似し、それを線形SVMに供給することにより、カーネルSVMを近似できます。これにより、線形時間で精度とパフォーマンスをトレードオフできます。

これを達成する一般的な方法は、kmeans / kmeans ++で見つかった100個程度のクラスターセンターをカーネル関数の基盤として使用することです。次に、新しい派生フィーチャが線形モデルに送られます。これは実際には非常にうまく機能します。sophia-mlvowpal wabbitなどのツールは、Google、Yahoo、Microsoftがこれを行う方法です。入力/出力は、単純な線形学習器にとって支配的なコストになります。

豊富なデータでは、ノンパラメトリックモデルはほとんどの問題に対してほぼ同じ性能を発揮します。例外は、テキスト、画像、時系列、音声などの構造化された入力です。

参考文献


16

SVMは2次の最適化問題を解決します。

ここに記載されていない追加項目はありません。SVCに関するsklearnページに、何が起こっているのかを明確にするリンクを投稿したいだけです。

実装はlibsvmに基づいています。適合時間の複雑さは、サンプル数の2次以上であり、10000サンプル以上のデータセットへのスケーリングが困難です。

カーネルを使用せず、線形SVMで十分な場合、線形回帰の最適化アプローチを使用するため、はるかに高速なLinearSVRがあります。ただし、インターセプト係数に正規化を適用するため、まだそうしていない場合は、データを正規化する必要があります。これは、データの平均がゼロから遠く離れている場合、満足に解決できないことを意味します。

また、最適化問題を解決するために確率的勾配降下法を使用できます。SklearnはSGDRegressorを備えていますloss='epsilon_insensitive'線形SVMと同様の結果を得るために使用する必要があります。ドキュメントを参照してください。ただし、勾配降下は最後の手段としてのみ使用します。これは、ローカルミニマムでスタックするのを避けるために、ハイパーパラメーターを大幅に調整することを意味するためです。LinearSVR可能であれば使用してください。


多くの行を含むデータセットがありました。SVCは、私にとって約150K行のデータの処理に時間がかかりすぎました。LinearSVRであなたの提案を使用しましたが、数百万行で数分しかかかりません。PSはLogisticRegression分類器がLinearSVR(私の場合)と同様の結果を生成し、さらに高速であることも発見しました。
jeffery_the_wind

8

前処理ステップにスケーリングを含めましたか?SVMの実行中にこの問題が発生しました。私のデータセットは、20個の特徴(col)を含む〜780,000サンプル(行)です。私のトレーニングセットは〜235kサンプルです。データをスケーリングするのを忘れていたことがわかりました!この場合、このビットをコードに追加してみてください。

データを[-1,1]にスケーリングします。SVM速度を上げる:

from sklearn.preprocessing import MinMaxScaler
scaling = MinMaxScaler(feature_range =(-1,1))。fit(X_train)
X_train = scaling.transform(X_train)
X_test = scaling.transform(X_test)


2
なぜこれがSVM適合を高速化するのか、誰でも説明できますか?
lppier

1
他の代わりにMinMaxScalerを選んだ理由はありますか?例えば、StandardScaler?
-raspi

@Ippier:基本的に、各オプションの可能な境界スペースを減らして、マシンの作業レベルを大幅に削減します。

7

このような巨大なデータセットを使用すると、ニューラルネットワーク、深層学習、ランダムフォレスト(これらは驚くほど優れています)などを使用した方が良いと思います。

前の回答で述べたように、かかる時間はトレーニングサンプルの数の3乗に比例します。予測時間でさえ、テストベクトルの数に関して多項式です。

本当にSVMを使用する必要がある場合は、GPUの高速化を使用するか、トレーニングデータセットのサイズを小さくすることをお勧めします。最初にデータのサンプル(10,000行程度)を試して、データ形式または分布に問題がないかどうかを確認します。

他の応答で述べたように、線形カーネルは高速です。


3

以前にアンサンブルモデルの種類をトレーニングするために使用されたデータセット内のフィーチャをスケーリングするのを忘れたため、最近、同様の問題が発生しました。シェルビーマトロックが指摘したように、データのスケーリングに失敗した可能性があります。あなたのようなsklearnで使用できるさまざまなスケーラー、試すことRobustScalerを

from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X = scaler.fit_transfrom(X)

Xが変換/スケーリングされ、目的のモデルに送る準備ができました。


2

意味あり。IIUC、サポートベクター操作の実行速度は、次元ではなくサンプル数によって制限されます。つまり、RAMではなくCPU時間によって制限されます。これにどれくらい時間がかかるかは正確にはわかりませんが、ベンチマークを実行して調べています。


1

24時間、一晩以上実行するようにしてください。CPU使用率はどのくらいですか?どのコアも100%で実行されていない場合、問題があります。おそらくメモリ付き。データセットが8GBに収まるかどうかを確認しましたか?SGDClassifierを試しましたか?最速の1つです。最初に試してみる価値は、1時間程度で完了することを期待しています。


SGDClassifierカーネルをサポートしていません。OPが線形SVMを必要とする場合、最初に試すことをお勧めしLinearSVRます。SVR線形回帰ライブラリを使用して問題を解決するためよりもはるかに高速であり、(勾配降下法とは異なり)大域的最小値が保証されます。
リカルドクルーズ

コメントに感謝します。カーネルのサポートが問題である理由について詳しく説明してください。
ディエゴ

ドキュメントから、The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.同じことをSGDRegressorSGDRegressorはを使用するのと同等SVR(kernel='linear')です。それがOPが望むものであれば、それは素晴らしいことです。私は彼がカーネルでSVMを使いたいと思っていた。そうでない場合は、彼が最初に試すことをお勧めしLinearSVRます。
リカルドクルーズ

1

データを[-1,1]に正規化してみてください。私は同様の問題に直面し、正規化するとすべてがうまくいきました。以下を使用して、データを簡単に正規化できます。

from sklearn import preprocessing X_train = preprocessing.scale(X_train) X_test = preprocessing.scale(X_test)


@Archieこれは質問に対する答えであり、質問ではありません。
timleathart

1

私はこの問題に遭遇しcache_sizeましたが、他の人が示唆しているように、まったく助けにはなりません。この投稿を見ることができ、これは主な貢献者として、コードを手動で変更することを提案しました。

あなたが知っている、ようSVCSVR最適化問題であり、誤差がさらに最適化が無駄ですので、少しのとき、彼らは停止します。そのため、これらには別のパラメーターがmax_iterあります。ここで、実行する反復回数を設定できます。

私が使用しているsklearnPythonでかつe1071Rであり、Rは、はるかに高速に設定しなくても結果になっているmax_iterし、sklearn2-4倍の時間がかかります。Pythonの計算時間を短縮できる唯一の方法は、を使用することmax_iterでした。それはあなたのモデル、機能、カーネルとハイパーの数の複雑さに相対的であるが、小さなデータセットのために、私は周りの4000のデータポイントを使用してmax_iterいた10000結果が全く異なることはなかったし、それが許容できるものでした。


0

115の要素と1つのフィーチャのみを含むデータセット(国際航空会社のデータ)で同様の問題が発生しました。解決策は、データをスケーリングすることでした。これまでの回答で見落としていたのは、パイプラインの使用でした。

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler, MinMaxScaler

model = Pipeline([('scaler', StandardScaler()),
                  ('svr', SVR(kernel='linear'))])

model通常の分類/回帰モデルのようにトレーニングし、同じ方法で評価できます。変更はなく、モデルの定義のみが変更されます。


なにPipeline?インポートしていません。
ブラムヴァンロイ

0

データをスケーリングする必要があります。スケーリングは、データポイントを-1から1の範囲に正規化します。これにより、収束が速くなります。

次のコードを使用してみてください。

# X is your numpy data array.

from sklearn import preprocessing

X = preprocessing.scale(X)

Data Science SEへようこそ!あなたの提案がOPにどのように役立つか説明していただけますか?あなたが提案しているのは、配列のスケーリングです。それがscikit学習のSVRアルゴリズムにどのように影響するか、または影響しないかは明らかではありません。
ステレオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.