2012-11-10 16 views
8

libsvmはScikit-Learn(SVCクラシファイアのlibSVMに基づいている)でデータをスケーリングするためのツールを提供していますが、データのスケールを変更する方法はありません。scikit-learn SVMのデータのスケーリング

基本的には、4つの機能を使用したいと思います。そのうちの3つの範囲は0から1までで、最後のものは「大きな」可変数です。

(私のデータを自動的にスケールするeasy.pyスクリプトを使って)第4の機能をlibSVMに含めると、非常に良い結果(96%の精度)が得られます。 Scikit-Learnに4番目の変数を含めると、精度は〜78%に低下しますが、除外すると、その機能を除外したときにlibSVMと同じ結果が得られます。したがって、私はスケーリングが足りないことが問題であると確信しています。

SVMのスケーリングプロセスをプログラムで(つまりsvm-scaleを呼び出さずに)どのように複製するのですか?

答えて

6

あなたはsklearn.preprocessingでその機能を持っている:

>>> from sklearn import preprocessing 
>>> X = [[ 1., -1., 2.], 
...  [ 2., 0., 0.], 
...  [ 0., 1., -1.]] 
>>> X_scaled = preprocessing.scale(X) 

>>> X_scaled           
array([[ 0. ..., -1.22..., 1.33...], 
     [ 1.22..., 0. ..., -0.26...], 
     [-1.22..., 1.22..., -1.06...]]) 

データがゼロ平均と単位分散を持つことになります。

+0

おかげで、ありがとう。テストデータを列車データと一緒に標準化し、後でスライスするか、それとも単独でテストデータを実行すべきですか? – luke14free

+3

これは[documentation](http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling)に記載されています。私はあなたが別にそれを行う必要があります、そうでなければ、トレーニングデータは、テストサンプルの影響を受けるだろうと思います。 'Scaler'クラスを使うと、トレーニングデータの平均と標準偏差を計算し、同じ変換をテストデータに適用することができます。 – Maehler

+8

フリースケールの関数 'scale'ではなく' Scaler'を使うべきです。 「スケーラ」は、「パイプライン」にプラグインすることができる。 'scaling_svm = Pipeline([(スケーラ)、Scaler())、(" svm "、SVC(C = 1000))])'。 –