机器学习过程中,数据预处理的步骤是非常重要的,对于建模人员而言,用于数据分析,预处理,特征工程的时间甚至会多于模型搭建与调优的时间。
常见的数据预处理方法有归一化、标准化、中心化、零均值化,以及独特编码。
我通常是使用sklearn进行数据预处理,以归一化为例,最常用的包是:from sklearn.preprocessing import MinMaxScaler,当我们准备好数据,分割出了训练集与测试集,要对两个部分进行训练的时候,通常应当只对训练集进行fit,得到训练好的归一化标准,对训练集与测试集进行transform得到归一化结果。
这么做的原因显而易见,避免测试集中的数据特征影响了训练集的归一化过程,造成测试集的特征泄露,导致模型结果过拟合,影响模型效果。
有一点需要注意的是,倘若测试集中的数据集不在训练集的最大最小值范围内,则把测试集大于训练集最大值的数据调整为归一化的最大值,把测试集小于训练集最大值的数据调整为归一化的最小值。
不只是归一化,在标准化、中心化、零均值化这些数据预处理方法中,也需要注意这一点。
但在one-hot编码过程中,却恰好相反。
原因是,one-hot编码需要对数据集特定字段的每一个类别进行one-hot编码,如假如我们只对训练集进行one-hot编码额训练,如果测试集中出现了训练集中没有的数据类别,那么将无法对测试集完成one-hot编码动作。
因此,为了保证one-hot编码顺利进行,我们应当将测试集,训练集指定字段合并后的所有类别进行one-hot编码训练。
发表回复