如何使用 sklearn cross_val_score() 标准化数据

Posted

技术标签:

【中文标题】如何使用 sklearn cross_val_score() 标准化数据【英文标题】:How to standardize data with sklearn's cross_val_score() 【发布时间】:2017-11-10 19:19:23 【问题描述】:

假设我想使用 LinearSVC 对数据集执行 k-fold-cross-validation。我将如何对数据进行标准化?

我读过的最佳实践是在训练数据上构建标准化模型,然后将此模型应用于测试数据。

当使用一个简单的 train_test_split() 时,这很容易,因为我们可以这样做:

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

clf = svm.LinearSVC()

scalar = StandardScaler()
X_train = scalar.fit_transform(X_train)
X_test = scalar.transform(X_test)

clf.fit(X_train, y_train)
predicted = clf.predict(X_test)

在进行 k-fold-cross-validation 时如何标准化数据?问题来自这样一个事实,即每个数据点都将用于训练/测试,因此您无法在 cross_val_score() 之前标准化所有内容。对于每个交叉验证,您不需要不同的标准化吗?

文档没有提到函数内部发生的标准化。我是索尔吗?

编辑:这篇文章非常有帮助:Python - What is exactly sklearn.pipeline.Pipeline?

【问题讨论】:

【参考方案1】:

您可以使用Pipeline 组合这两个进程,然后将其发送到 cross_val_score()。

当在管道上调用fit() 时,它将一个接一个地拟合所有变换并变换数据,然后使用最终估计器拟合变换后的数据。在predict() 期间(仅当管道中的最后一个对象是估计器时可用,否则transform())它将对数据应用转换,并使用最终估计器进行预测。

像这样:

scalar = StandardScaler()
clf = svm.LinearSVC()

pipeline = Pipeline([('transformer', scalar), ('estimator', clf)])

cv = KFold(n_splits=4)
scores = cross_val_score(pipeline, X, y, cv = cv)

查看各种管道示例以更好地理解它:

http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html#examples-using-sklearn-pipeline-pipeline

如有任何疑问,请随时询问。

【讨论】:

以上是关于如何使用 sklearn cross_val_score() 标准化数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sklearn 训练算法对数据点进行加权

如何使用networkx图作为sklearn的输入

使用 SKlearn 进行多标签分类 - 如何使用验证集?

如何使用 python 和 3rd 方包(如 sklearn)为 hive 创建一个 udf?

使用 sklearn 训练模型时如何更改特征权重?

如何使用 Sklearn 管道进行参数调整/交叉验证?