简记:机器学习中关于训练集和测试集的标准化问题

01 错误处理

对于标准化统一量纲问题,我之前一直是这么处理,我也从来没有意识到问题,这里记录一下:

错误处理:在未进行数据集划分之前,对所有特征项(X/因子项)进行标准化例如MinMaxScaler\Normalizer等方法,然后再进行数据集划分;或者在数据集划分之后分别对训练集和测试集进行独立的标准化。

02 为什么

如果对整个特征项进行归一化,那么测试集的信息在一定程度上已经被用于训练集的标准化过程中,因为归一化的参数是基于整个特征项进行计算的,这在一定程度上造成了数据泄露。这会导致模型评估的结果过于乐观,不利于模型在实际应用的泛化性/鲁棒性。

而对于第二种分别独立标准化,会导致两个问题:

  1. 不一致的标度:由于分别进行标准化意味着是依据各自的均值和标准差进行缩放,导致标度不一致。例如相同的原始值,在训练集和测试集的缩放值不一致。
  2. 泛化能力:测试集独立标准化使得它不再是训练模型时的真实环境模拟,模型在训练时学习到的特征权重可能无法正确适用于测试数据。

03 正确处理

应该对训练集进行标准化,并利用训练集计算得到的标准化参数对测试集进行标准化。

例如,如果使用MinMaxScaler,那么参数一般有训练集的最大值Max、最小值Min,因此对于训练集正常标准化,而对于测试集则应该使用训练集的参数进行标准化。

具体地,在代码中:

from sklearn.preprocessing import MinMaxScaler

# 训练测试集划分
train_ds = df[df[time_col_name] <= split_time]
test_ds = df[df[time_col_name] > split_time]
# 标准化
scaler = MinMaxScaler()  # 标准化器
train_ds.loc[:, x_col_names] = scaler.fit_transform(train_ds.loc[:, x_col_names])  # fit即拟合获取标准化参数, transform即基于参数进行标准化
test_ds.loc[:, x_col_names] = scaler.transform(test_ds.loc[:, x_col_names])  # 注意标准化不能独立对测试集进行, 标准化参数应来源于训练集
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒茄子

不装逼我浑身难受aaa

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值