如何使用 sklearn 的 cross_val_score() 标准化数据
How to standardize data with sklearn's cross_val_score()
假设我想使用 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 折交叉验证时对数据进行标准化?问题在于每个数据点都是针对 training/testing 的,因此您无法在 cross_val_score() 之前对所有内容进行标准化。每个交叉验证不需要不同的标准化吗?
文档没有提到函数内部发生的标准化。我是 SOL 吗?
编辑:这个 post 超级有用:
您可以使用 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)
查看各种管道示例以更好地理解它:
如有任何疑问,请随时提出。
假设我想使用 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 折交叉验证时对数据进行标准化?问题在于每个数据点都是针对 training/testing 的,因此您无法在 cross_val_score() 之前对所有内容进行标准化。每个交叉验证不需要不同的标准化吗?
文档没有提到函数内部发生的标准化。我是 SOL 吗?
编辑:这个 post 超级有用:
您可以使用 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)
查看各种管道示例以更好地理解它:
如有任何疑问,请随时提出。