繁体   English   中英

在 Sklearn 管道和交叉验证中使用缩放器

[英]Using scaler in Sklearn PIpeline and 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计算均值和标准差,然后我们将均值和标准差应用于所有 4 折。

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

我确实喜欢上面的代码,因为它可以节省大量时间。

在您给出的示例中,我将使用sklearn.model_selection.train_test_split添加一个额外的步骤:

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)

我认为最佳做法是在调整 model 的超参数时仅使用训练数据集(即X_train, y_train ),并且应使用测试数据集(即X_test, y_test )作为最终检查,以确保您的 model 不偏向验证折叠。 那时,您会将适合您的训练数据集的相同scaler应用于您的测试数据集。

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


一些参考资料。

用户指南第 6.1.1 节

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

用户指南第 3.1.1 节末尾的注释:

保留数据的数据转换
正如在训练中保留的数据上测试预测器很重要一样,预处理(例如标准化、特征选择等)和类似的数据转换也应该从训练集中学习并应用于保留的数据以进行预测:
...代码示例...
Pipeline 可以更轻松地组合估算器,在交叉验证下提供此行为:
...

最后,您可以查看cross_val_score的来源。 它调用cross_validate ,它在每个训练拆分上克隆并拟合估计器(在本例中为整个管道)。 GitHub 链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM