赞
踩
对于标准化统一量纲问题,我之前一直是这么处理,我也从来没有意识到问题,这里记录一下:
错误处理
:在未进行数据集划分之前,对所有特征项(X/因子项)进行标准化例如MinMaxScaler\Normalizer等方法,然后再进行数据集划分;或者在数据集划分之后分别对训练集和测试集进行独立的标准化。
如果对整个特征项进行归一化,那么测试集的信息在一定程度上已经被用于训练集的标准化过程中,因为归一化的参数是基于整个特征项进行计算的,这在一定程度上造成了数据泄露。这会导致模型评估的结果过于乐观,不利于模型在实际应用的泛化性/鲁棒性。
而对于第二种分别独立标准化,会导致两个问题:
应该对训练集进行标准化,并利用训练集计算得到的标准化参数对测试集进行标准化。
例如,如果使用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]) # 注意标准化不能独立对测试集进行, 标准化参数应来源于训练集
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。