6

有关机器学习的文献强烈建议对 SVM 的数据进行规范化(Preprocessing data in scikit-learn)。如前所述,相同的 StandardScalar应该应用于训练和测试数据。

  1. 与手动减去平均值并除以标准差相比,使用StandardScalar有什么优势(除了在管道中使用它的能力)?
  2. scikit-learn 中的 LinearSVC 依赖于多类的一对一(正如 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)
4

1 回答 1

7

执行的特征缩放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 模型,并执行 one-vs-rest 所需的操作。

现在从管道的角度进行分类。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使用从训练数据中学习的参数。

是的,缩放算法不是很复杂。它只是减去平均值并除以标准。但是StandardScalar

  • 为算法提供一个名称,以便您可以将其从库中拉出
  • 避免你自己滚动,确保它正常工作,并且不需要你了解它在内部做什么
  • 记住 afitfit_transform以后transform操作的参数(如上)
  • 提供与其他数据转换相同的接口(因此可以在管道中使用)
  • 在密集或稀疏矩阵上运行
  • 能够用它的inverse_transform方法逆转转换
于 2013-04-22T01:51:46.757 回答