SVM分類器を使用して約10万サンプルのデータをトレーニングしようとしましたが、非常に遅く、2時間たっても応答がありませんでした。データセットに約1k個のサンプルがある場合、すぐに結果を取得できます。 SGDClassifierとナイーブベイも試してみましたが、これは非常に高速で、数分で結果が得られました。この現象を説明できますか?
SklearnのSVCのデフォルトである非線形カーネルを使用したSVMトレーニングは、複雑さに関しておよそ:O(n_samples^2 * n_features)
sklearnのdevs 。これは、 libsvm 内で使用される SMO-algorithm に適用されます。このタイプの問題に対するsklearnのコアソルバー。
これは、カーネルが使用されておらず、 sklearn.svm.LinearSVC ( liblinear )または 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がバーの後ろで私たちのために行っているすべてのニースのもののために、はるかに複雑になる可能性があります。上記は、従来の2クラスSVMに有効です。万が一マルチクラスのデータを学習しようとしている場合; scikit-learnは自動的にOneVsRestまたはOneVsAllアプローチを使用してこれを行います(コアSVMアルゴリズムはこれをサポートしていないため)。 scikit-learnsのドキュメントを読んで、この部分を理解してください。
同じ警告が確率の生成に適用されます。SVMは最終予測の確率を自然に生成しません。したがって、これらを使用するには(パラメーターによってアクティブ化)、scikit-learnは Platt scaling と呼ばれる重い相互検証手順を使用しますが、これも非常に時間がかかります!
Sklearnには最高のドキュメントの1つがあるので、これらのドキュメントには、そのような何かを説明するのに役立つ部分がよくあります( link ):