2013-04-22 46 views
3

有關機器學習的文獻強烈建議SVM數據的規範化(Preprocessing data in scikit-learn)。如answered before,同樣的StandardScalar應該適用於訓練和測試數據。scikit-learn預處理支持流水線中多個類的SVM

  1. 使用StandardScalar比手動減去平均值和除以標準偏差(除了在管道中使用它的能力除外)有什麼優勢?
  2. scikit-learn中的LinearSVC取決於one-vs-the-rest的多個類別(如larsmans提到的,SVC依賴於多類的一對一)。那麼如果我有多個使用標準化流水線作爲第一個估計器進行訓練的類,會發生什麼?它是否也會計算每個類別的平均值和標準差異,並在分類過程中使用它?
  3. 更具體地說,下面的分類器在流水線的svm階段之前對每個類應用不同的均值和標準差?
estimators = [('normalize', StandardScaler()), ('svm', SVC(class_weight = 'auto'))] 
clf = Pipeline(estimators) 
# Training 
clf.fit(X_train, y) 
# Classification 
clf.predict(X_test) 
+1

'SVC'不*不*做OVR爲多類情況下的訓練;那就是你所指的'LinearSVC'。 'SVC'的行爲由'multiclass'參數控制,默認爲OvO(一對一)。 – 2013-04-27 10:46:21

+0

@ larsmans-感謝您的糾正,我會更新文本以避免被索引。 – dashesy 2013-04-27 15:04:27

回答

5

通過StandardScaler執行的特徵縮放不參考的目標類進行。它只考慮X功能矩陣。它計算所有樣本中每個特徵的平均值和標準差,而不考慮每個樣本的目標類別。

流水線的每個組件都獨立運行:只有數據在它們之間傳遞。我們來擴展管道的clf.fit(X_train, y)。它大致具有以下功能:

X_train_scaled = clf.named_steps['normalize'].fit_transform(X_train, y) 
clf.named_steps['svm'].fit(X_train_scaled, y) 

第一縮放步驟實際上忽略它傳遞的y,但計算X_train平均值和各功能的標準偏差,將它們存儲在其mean_std_屬性(在fit組件)。它還以X_train爲中心並返回它(transform組件)。下一步學習一個SVM模型,並做一對一休息的必要條件。

現在流水線的分類視角。 clf.predict(X_test)擴展爲:

X_test_scaled = clf.named_steps['normalize'].transform(X_test) 
y_pred = clf.named_steps['svm'].predict(X_test_scaled) 

返回y_pred。在第一行中,它使用存儲的mean_std_將轉換應用到X_test,使用從訓練數據中學習的參數。

是的,縮放算法不是很複雜。它只是減去std的均值和除數。但StandardScalar

  • 提供一個名稱的算法,所以你可以把它帶出圖書館
  • 避免你滾你自己的,確保其正常運行,並且不要求你明白它在做什麼在裏面
  • 記住從fitfit_transform供以後transform操作的參數(如上所述)
  • 提供相同的接口的其它數據轉換(並且因此能夠在管道中使用)
  • OPER在密集或稀疏矩陣茨
  • 能夠以其inverse_transform方法扭轉變換