2012-10-03 25 views
3

scikit-learn的SVM基於LIBSVM。 LIBSVM/SVM要求應縮放數據,建議特徵值應在兩個範圍[0,1]或[-1,1]之一中。也就是說,在典型的矩陣中,每列都是一個特徵,縮放是按每列完成的。scikit支持在[0,1]或[-1,1]之間縮放功能

LIBSVM FAQ表明一個簡單的縮放得到[0,1]之間的特徵:

x'=(x-min)/(Max-min) 

是否scikit學習支持這種「簡單的縮放」?是否還有其他建議來擴展要與SVM和RBF內核一起使用的功能。任何參考?我發現了一篇名爲「支持向量分類的實用指南」的參考文章,該文章基於LIBSVM,並建議縮放爲[0,1]或[-1,1]。

回答

5

是的,包括此功能。您所描述的確切公式將在下一個版本中作爲sklearn.preprocessing.MinMaxScaler。現在,sklearn.preprocessing.Scaler(將在下一版本中改名爲StandardScaler,但舊名稱將保持周圍向後compat的)中心和縮放功能,具有均值爲0,方差爲1,這應該是足夠好將數據傳遞到SVM學習。

另外,sklearn.preprocessing.Normalizer(以及用於文本分類TfidfVectorizer)規格化每個樣品值到範圍[0,1]。這相當於文本分類和信息檢索中常見的長度標準化。

可以使用Pipeline對象構造一箇中心,縮放SVM分類:

clf = Pipeline([('scale', Scaler()), 
       ('svm', SVC())]) 
+0

謝謝拉斯曼!很明顯,預處理.Scaler()是標準化列(平均值爲零,var = 1)。但是,我沒有得到範圍[-1,+ 1]中的值。我有一個矩陣a。我使用下面的代碼:scal = preprocessing.Scaler(),scal.fit(a),scal.transform(a)。結果不在[-1,+ 1]的範圍內。 – user963386

+1

@ user963386確保您的矩陣包含浮點值。否則,縮放器將無法正常工作。 –

1

我認爲你正在尋找的StandardScaler,至少爲[-1,1]的情況。

+0

只有在帶血的版本;這個班級在最新版本中仍然稱爲「Scaler」。詳情請參閱我的回答。 –