如何使用StandardScaler正确地缩放训练、验证和测试集?

7
一些文章指出,如果只有训练集和测试集,我们需要首先使用fit_transform()对训练集进行缩放,然后只对测试集使用transform(),以防止数据泄漏。
在我的情况下,我还有验证集。
我认为以下代码中的任何一种都可以使用,但我不能完全依赖它们。感谢任何形式的帮助! 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size = 2/7)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
X_test = scaler.transform(X_test)

2)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)

X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size = 2/7)
X_test = scaler.transform(X_test)

1
通常认为第一份代码是最佳实践。仅在训练数据上拟合缩放器可以防止模型训练和模型验证之间的数据泄漏。 - G. Anderson
1
第一点是正确的。在缩放方面,您应该以相同的方式处理“测试”和“验证”数据。 - kosnik
谢谢你的帮助!我明白了,没有任何疑问。 - bbasaran
1个回答

10

一般来说,您应该使用选项1的代码。使用适合(fit)和转换(transform)训练数据的原因是:

a)适合操作将计算训练集的均值、方差等参数,并尝试将模型拟合到数据上。

b)之后,转换操作将根据已拟合的模型转换数据。

如果您再次使用测试集进行适合操作,这将会给您的模型添加偏差。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接