数据标准化公式计算均值与标准差应使用全数据集还是仅训练集?
数据集标准化的统计量选择问题解答
核心结论
标准化时必须仅使用训练集的均值和标准差,不可使用训练集+测试集拼接的全数据集计算统计量。
逻辑解释
- 测试集的核心作用是模拟模型上线后遇到的完全未知的新数据,用来客观评估模型的泛化能力。实际生产环境中,你不可能提前拿到所有未来待预测数据的统计信息,如果用测试集的统计量参与标准化,相当于将测试集的分布信息提前泄露给了预处理环节,最终得到的测试集评估结果会虚高,无法反映模型的真实泛化水平。
- 你现有的实现将训练集和测试集拼接计算均值、标准差,属于典型的数据泄露问题,会导致后续模型效果评估完全失去参考意义。
- 额外提示:标准化时应该按特征维度单独计算均值和标准差(即对每个特征列分别统计),你原有代码对整个拼接矩阵计算全局均值、标准差的做法也不符合标准化的要求,会混合不同特征的分布信息。
正确实现代码
import numpy as np # 仅使用训练集按特征维度计算均值和标准差 X_mean = np.mean(X_tr, axis=0) X_std = np.std(X_tr, axis=0) # 处理标准差为0的极端情况,避免除零错误 X_std[X_std < 1e-8] = 1e-8 # 用训练集的统计量分别标准化训练集和测试集 X_tr_norm = (X_tr - X_mean) / X_std X_te_norm = (X_te - X_mean) / X_std
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

