2012-11-10 76 views
8

雖然LIBSVM提供的工具將數據按比例,有Scikit-瞭解(這應基於LIBSVM的SVC分類)我找不到任何的方式來擴展我的數據。縮放數據scikit學習SVM

基本上我想使用4個特徵,其中3範圍從0到1和最後一個是一個「大」高度可變的數。

如果我在libSVM中使用第四個功能(使用可以自動縮放數據的easy.py腳本),我會得到一些非常好的結果(精度爲96%)。 如果我包括第四可變Scikit,學習精度下降到〜78% - 但如果我排除它,我得到排除功能,當我在LIBSVM得到相同的結果。所以我很確定這是一個缺少縮放的問題。

我如何複製程序(即無需調用SVM-規模)SVM的縮放處理?

回答

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

你應該使用'Scaler'這一點​​,而不是獨立的功能'scale'。 「Scaler」可以插入「Pipeline」中,例如'scaling_svm = Pipeline([(「scaler」,Scaler()),(「svm」,SVC(C = 1000))])'。 –