假设我想使用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()之前标准化所有内容。您不需要为每个交叉验证使用不同的标准化吗?
文档没有提到函数内部发生的标准化。我是SOL吗?
编辑:这篇文章非常有帮助:Python - What is exactly sklearn.pipeline.Pipeline?
答案 0 :(得分:7)
您可以使用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)
查看管道的各种示例,以便更好地理解它:
随意询问是否有任何疑问。