Python 在Sklearn管道和交叉验证中使用scaler

Python 在Sklearn管道和交叉验证中使用scaler,python,scikit-learn,pipeline,cross-validation,Python,Scikit Learn,Pipeline,Cross Validation,我以前看到过一个类似这样的代码: 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) 我的理解是:当我们使用scaler时,我们应该使用4倍中的3倍来计算平均值和标准偏差

我以前看到过一个类似这样的代码:

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)
我的理解是:当我们使用scaler时,我们应该使用4倍中的3倍来计算平均值和标准偏差,然后我们将平均值和标准偏差应用于所有4倍

在上面的代码中,我如何知道Sklearn遵循相同的策略?另一方面,如果sklearn没有遵循相同的策略,这意味着sklearn将从所有4倍计算平均值/std。这是否意味着我不应该使用上述代码


我喜欢上面的代码,因为它节省了大量的时间

在您给出的示例中,我将使用sklearn.model\u selection.train\u test\u split添加一个附加步骤:


我认为最佳实践是在调整模型的超参数时只使用训练数据集,即X_-train,y_-train,而测试数据集,即X_-test,y_-test,应用作最终检查,以确保模型不偏向验证。在这一点上,您可以将训练数据集上适合的同一个定标器应用于测试数据集。

在您给出的示例中,我将使用sklearn.model\u selection.train\u test\u split添加一个附加步骤:


我认为最佳实践是在调整模型的超参数时只使用训练数据集,即X_-train,y_-train,而测试数据集,即X_-test,y_-test,应用作最终检查,以确保模型不偏向验证。在这一点上,您可以将训练数据集上适合的相同定标器应用于测试数据集。

是的,这是正确的;这是使用管道的原因之一:所有的预处理只适合于训练折叠

一些参考资料

《用户指南》的第1部分:

安全 管道通过确保使用相同的样本来训练变压器和预测器,有助于避免将测试数据中的统计信息泄漏到交叉验证中经过训练的模型中

本节末尾的注释:

用保留数据进行数据转换 正如在训练中保留的数据上测试预测器很重要一样,预处理(如标准化、特征选择等)以及类似的数据转换也应从训练集中学习,并应用于保留的数据进行预测: …代码示例。。。 管道使组合估计器更容易,在交叉验证下提供了这种行为:


最后,您可以查看cross_val_分数的来源。它调用cross_validate,它克隆并拟合估计器在本例中,每个训练分割的整个管道

是的,这是正确的;这是使用管道的原因之一:所有的预处理只适合于训练折叠

一些参考资料

《用户指南》的第1部分:

安全 管道通过确保使用相同的样本来训练变压器和预测器,有助于避免将测试数据中的统计信息泄漏到交叉验证中经过训练的模型中

本节末尾的注释:

用保留数据进行数据转换 正如在训练中保留的数据上测试预测器很重要一样,预处理(如标准化、特征选择等)以及类似的数据转换也应从训练集中学习,并应用于保留的数据进行预测: …代码示例。。。 管道使组合估计器更容易,在交叉验证下提供了这种行为:


最后,您可以查看cross_val_分数的来源。它调用cross_validate,它克隆并拟合估计器在本例中,每个训练分割的整个管道

谢谢你的回答。那么我在哪里可以看到这个实现的逻辑呢?我已经添加了一些参考资料。非常感谢您的帮助。对不起,我还不能投票。一旦我有了更多的名声,我会的。谢谢你的回答。那么我在哪里可以看到这个实现的逻辑呢?我已经添加了一些参考资料。非常感谢您的帮助。对不起,我还不能投票。一旦我有了更多的名声,我会的。谢谢你的帮助。对不起,由于我的名誉,我还不能投票。一旦我有足够的钱,我会的。谢谢你的帮助。对不起,由于我的名誉,我还不能投票。一旦我有足够的钱,我就会去。
folds = 4

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=(1/folds), random_state=0, stratify=y)

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

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

cv = KFold(n_splits=(folds - 1))
scores = cross_val_score(pipeline, X_train, y_train, cv = cv)