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

问题描述 投票:0回答:1

假设我想使用 LinearSVC 对数据集执行 k 折交叉验证。我如何对数据进行标准化?

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

当使用简单的 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 折交叉验证时如何标准化数据?问题来自于每个数据点都将用于训练/测试,因此您无法在 cross_val_score() 之前标准化所有内容。您是否不需要为每个交叉验证使用不同的标准化?

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

编辑:这篇文章非常有帮助:Python - sklearn.pipeline.Pipeline 到底是什么?

python scikit-learn svm cross-validation standardized
1个回答
26
投票

您可以使用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)

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

© www.soinside.com 2019 - 2024. All rights reserved.