マルチクラス分類でのScikit SVMの出力は常に同じラベルを与える


10

私は現在、次のコードでScikit Learnを使用しています:

clf = svm.SVC(C=1.0, tol=1e-10, cache_size=600, kernel='rbf', gamma=0.0, 
              class_weight='auto')

そして、7つの異なるラベルを持つデータのセットを当てはめて予測します。奇妙な出力が出ました。検証セットで予測ラベルを使用する相互検証手法に関係なく、常にラベル7になります。

完全なデフォルトパラメータ(svm.SVC())を含む他のいくつかのパラメータを試しますが、私が使用するカーネルメソッドがのrbf代わりにあるpolyか、linearそれが機能しない限り、polyおよびに対しては非常にうまく機能しlinearます。

その上、検証データの代わりに列車データの予測をすでに試みており、完全に適合しています。

誰かがこの種の問題を以前に見て、ここで何が起こっているのか知っていますか?

私はクラスの分布を詳細に見ることはありませんが、約30%は7、14%は4であるべきだと思います。

私は手動の1-vs-rest実装を試みても、まだ役に立ちません。


各クラスに該当するデータの割合はどのくらいですか?
ガン-モニカを元に戻す

実際、私のデータにはもっと「7」が含まれていますが、それほど多くはありません。それらの約30%は7です。@ gung
佐倉

回答:


10

考えられる原因は、モデルを調整していないことです。と適切な値を見つける必要があります。あなたの場合、デフォルトは悪いことがわかり、それは常に特定のクラスを生成する簡単なモデルにつながります。これは、1つのクラスに他のクラスよりもはるかに多くのインスタンスがある場合に特に一般的です。あなたのクラス分布は何ですか?γCγ

scikit-learnのハイパーパラメータ検索機能は限られていますが、これをOptunityなどのチューニングライブラリと一緒に使用できます。Optunityを使用したscikit-learn SVCのチューニングの例は、こちらから入手できます

免責事項:私はOptunityの主要開発者です。


私は実際に、Cとガンマのすべての組み合わせを0から4まで10の累乗で試してみますが、それらすべてが完全な7を与えてくれます。
佐倉環14

8

問題は、パラメータテストであることが判明しました。とき、私は試していないgamma0.0の間である(1 / n_featureである)と私のデータ1.はgamma何かの周りに回転する必要があります1e-8


4
これは完全に理にかなっています。値が大きすぎると、単位行列に近いカーネル行列になります。すべての予測は最終的にバイアス項になります(すべてのカーネル評価がゼロに非常に近いため)。この場合、偶然にクラス7になります。γ
Marc Claesen、2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.