预处理训练集和测试集分割前后的区别

机器算法验证 数据转换 scikit-学习 数据预处理
2022-02-14 10:16:49

sklearn在将数据拆分为之前和之后对数据集进行预处理有区别train_test_split吗?

换句话说,这两种方法是否等效?

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

#standardizing after splitting
X_train, X_test, y_train, y_test = train_test_split(data, target)
sc = StandardScaler().fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

#standardizing before splitting
data_std = StandardScaler().fit_transform(data)
X_train, X_test, y_train, y_test = train_test_split(data_std, target)
4个回答

要添加到 phanny 的答案 - 您应该单独对您的训练集进行预处理,否则来自测试集的信息将“泄漏”到您的训练数据中。

对于预处理测试集,我不明白为什么不应该将它与训练数据一起预处理。

不,两种方法都不等效。

StandardScaler()通过去除均值和缩放到单位方差来标准化特征

如果您在拆分后拟合缩放器:假设,如果测试集中(拆分后)有任何异常值,则缩放器不会考虑计算均值和方差的那些。

如果您在整个数据集上拟合缩放器然后拆分,缩放器将在计算均值和方差时考虑所有值。

由于在这两种情况下均值和方差不同,因此拟合和变换函数的执行方式会有所不同。

理想情况下,测试集不应使用训练数据进行预处理。这将确保没有“窥视”。训练数据应该单独预处理,一旦创建模型,我们可以将用于训练集的相同预处理参数应用于测试集,就好像测试集以前不存在一样。

您也可以使用以下方法单独预处理您的数据,但用于训练数据集的参数相似。

norm = preprocessing.Normalizer().fit(xtrain)

然后

x_train_norm = norm.transform(xtrain) 
x_test_norm = norm.transform(Xtest)