机器学习项目中能否先标准化全部特征数据再做交叉验证?
关于机器学习特征标准化的正确姿势
嘿,这个问题踩了很多新手容易犯的坑——绝对不能先对所有特征数据(训练+测试集一起)做标准化,这会导致严重的数据泄露,直接毁掉模型的泛化能力,我给你讲明白其中的逻辑:
为什么不能先整体标准化?
标准化需要计算数据的均值、标准差等统计量,如果用包含测试集的全部数据来计算这些值,相当于让模型提前“获知”了测试集的分布信息。而测试集的作用是模拟真实场景中完全未知的数据,这样操作后,模型的评估结果会严重失真,根本反映不了它在真实数据上的表现。
正确的操作流程
必须严格遵循「先划分数据集,再基于训练集做标准化」的顺序:
- 第一步:先把原始特征X和标签Y划分为训练集和测试集
- 第二步:仅用训练集数据拟合标准化器(
fit_transform()),这一步会计算训练集的均值和标准差,同时完成训练集的标准化 - 第三步:用同一个已经拟合好的标准化器对测试集执行
transform(),也就是复用训练集的统计量来标准化测试集,保证测试集的分布和模型训练时的分布一致
完整代码示例
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 加载数据集 dataset = pd.read_csv('../../dataset/dataset_experiment_1.csv') X = dataset.iloc[:,:-1].values y = dataset.iloc[:,86].values # 核心第一步:先划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 用训练集拟合标准化器并转换训练集 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) # 复用训练集的统计量转换测试集(仅调用transform,禁止fit!) X_test_scaled = scaler.transform(X_test)
如果你的项目中用到验证集,逻辑也是一样的:验证集的标准化必须使用训练集的统计量,不能用验证集自身或全量数据的统计量。
内容的提问来源于stack exchange,提问作者Bose Sanamchai
相关产品推荐
相关产品推荐

