scikit-learn预处理管道中具有多个类的SVM

das*_*esy 5 python svm scikit-learn

关于机器学习的文献强烈建议SVM数据的标准化(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)
Run Code Online (Sandbox Code Playgroud)

joe*_*eln 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)
Run Code Online (Sandbox Code Playgroud)

第一个缩放步骤实际上忽略了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)
Run Code Online (Sandbox Code Playgroud)

回来y_pred.在第一行中,它使用存储mean_并将std_转换应用于X_test使用从训练数据中学习的参数.

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

  • 为算法提供名称,以便您可以将其从库中提取出来
  • 避免你自己滚动,确保它正常工作,而不要求你理解它在里面做了什么
  • 记住a fitfit_transform以后transform操作的参数(如上所述)
  • 提供与其他数据转换相同的接口(因此可以在管道中使用)
  • 在密集或稀疏矩阵上运行
  • 能够用它的inverse_transform方法扭转变换