web-dev-qa-db-ja.com

scikit-learn SVM.SVC()が非常に遅い

SVM分類器を使用して約10万サンプルのデータをトレーニングしようとしましたが、非常に遅く、2時間たっても応答がありませんでした。データセットに約1k個のサンプルがある場合、すぐに結果を取得できます。 SGDClassifierとナイーブベイも試してみましたが、これは非常に高速で、数分で結果が得られました。この現象を説明できますか?

20
C. Gary

SVM学習に関する一般的な意見

SklearnのSVCのデフォルトである非線形カーネルを使用したSVMトレーニングは、複雑さに関しておよそ:O(n_samples^2 * n_features)sklearnのdevs 。これは、 libsvm 内で使用される SMO-algorithm に適用されます。このタイプの問題に対するsklearnのコアソルバー。

これは、カーネルが使用されておらず、 sklearn.svm.LinearSVCliblinear )または sklearn.linear_model.SGDClassifier

したがって、1kと100kのサンプル間の時間差を近似するために、いくつかの数学を行うことができます。

1k = 1000^2 = 1.000.000 steps = Time X
100k = 100.000^2 = 10.000.000.000 steps = Time X * 10000 !!!

これは概算に過ぎず、さらに悪い場合も悪い場合もあります(例:キャッシュサイズの設定、速度向上のためのメモリのトレードオフ)!

Scikit-learn固有の発言

状況は、scikit-learnがバーの後ろで私たちのために行っているすべてのニースのもののために、はるかに複雑になる可能性があります。上記は、従来の2クラスSVMに有効です。万が一マルチクラスのデータを学習しようとしている場合; scikit-learnは自動的にOneVsRestまたはOneVsAllアプローチを使用してこれを行います(コアSVMアルゴリズムはこれをサポートしていないため)。 scikit-learnsのドキュメントを読んで、この部分を理解してください。

同じ警告が確率の生成に適用されます。SVMは最終予測の確率を自然に生成しません。したがって、これらを使用するには(パラメーターによってアクティブ化)、scikit-learnは Platt scaling と呼ばれる重い相互検証手順を使用しますが、これも非常に時間がかかります!

Scikit-learnドキュメント

Sklearnには最高のドキュメントの1つがあるので、これらのドキュメントには、そのような何かを説明するのに役立つ部分がよくあります( link ):

enter image description here

34
sascha