训练测试拆分之前或之后的数据归一化?

数据挖掘 正常化
2021-09-27 23:01:24

哪一种是进行数据标准化的正确方法 - 在训练测试拆分之前或之后?

拆分前的标准化

normalized_X_features = pd.DataFrame(
    StandardScaler().fit_transform(X_features),
    columns = X_features.columns
)
x_train, x_test, y_train, y_test = train_test_split(
    normalized_X_features,
    Y_feature,
    test_size=0.20,
    random_state=4
)
LR = LogisticRegression(
    C=0.01,
    solver='liblinear'
).fit(x_train, y_train)

y_test_pred = LR.predict(x_test)

拆分后的归一化

x_train, x_test, y_train, y_test = train_test_split(
    X_features,
    Y_feature,
    test_size=0.20,
    random_state=4
)
normalized_x_train = pd.DataFrame(
    StandardScaler().fit_transform(x_train),
    columns = x_train.columns
)
LR = LogisticRegression(
    C=0.01,
    solver='liblinear'
).fit(normalized_x_train, y_train)

normalized_x_test = pd.DataFrame(
    StandardScaler().fit_transform(x_test),
    columns = x_test.columns
)
y_test_pred = LR.predict(normalized_x_test)

到目前为止,我已经看到了这两种方法。

4个回答

在训练集和测试集之间拆分数据后,应仅使用训练集中的数据进行跨实例标准化。

这是因为测试集扮演着新的看不见的数据的角色,所以它不应该在训练阶段被访问。在训练之前或训练期间使用来自测试集的任何信息都是评估性能的潜在偏差。

[精确感谢 Neil 的评论] 在对测试集进行归一化时,应按原样应用先前从训练集获得的归一化参数。不要在测试集上重新计算它们,因为它们会与模型不一致,这会产生错误的预测。

正如@Erwan 所说,您应该对训练集进行归一化,然后在测试集上使用相同的归一化步骤。所以你的代码应该是这样的:

x_train, x_test, y_train, y_test = train_test_split(
    X_features, 
    Y_feature, 
    test_size=0.20,
    random_state=4)

scaler = StandardScaler()

normalized_x_train = pd.DataFrame(
    scaler.fit_transform(x_train),
    columns = x_train.columns
)

LR = LogisticRegression(
    C=0.01,
    solver='liblinear'
).fit(normalized_x_train, y_train)

normalized_x_test = pd.DataFrame(
    scaler.transform(x_test),
    columns = x_test.columns
)
y_test_pred = LR.predict(normalized_x_test)

回答您的问题:拆分为训练和测试/验证后进行标准化。原因是为了避免任何数据泄露

数据泄露:

数据泄漏是指使用来自训练数据集外部的信息来创建模型。这些额外的信息可以让模型学习或知道一些它原本不会知道的东西,进而使正在构建的模式的估计性能无效。

你可以在这里阅读: https ://machinelearningmastery.com/data-leakage-machine-learning/

我认为无论您是在之前还是之后都这样做并不重要,因为只有在分类结果或您的输出信息也以某种方式在输入模型中流动时才可能发生数据泄漏。

但是由于您对输入参数而不是输出应用归一化,因此不可能发生泄漏。