1. 特征预处理
参考: https://www.codenong.com/cs109471668/ https://www.zhihu.com/question/20455227
样本维度:
- 删除重复数据
- 删除占比过多的用户样本(采样)
- 删除异常样本(业务判断)
- 样本顺序要打乱:因为使用 mini-batch 学习方法,防止一个批次的样本有顺序关系,消除收敛波动
特征维度:
- 缺失值处理:填充 -1,或者平均值填充等
- 离散、异常特征处理:去除异常特征对应的样本,按照分位截断填充某一固定值
相关特征处理:
- 输入特征最好不相关。如果某些维输入的相关性太强,那么网络中与这些输入神经元相连的权重实际上起到的作用就是相似的,训练网络时花在调整这些权重之间关系上的力气就白费了
特征归一化:
- 归一化的作用是消除量纲(理解为计量单位如年龄 & 财富)差异。如果不归一化,梯度下降类似于一个很扁的椭圆形,寻找谷底的过程,会发现长轴方向梯度反而小,短轴方向梯度反而大。这样,长轴方向就收敛过慢,短轴方向就容易爆掉
- 归一化然后训练出模型后,如果想利用模型进行未知样本的求算,需要把归一化训练数据时使用的参数(均值、方差等)记录下来,同样用到测试数据上(线上推断)
- 基于最大最小值的[0,1]归一化要稍微好一些,归一化比不归一化要稍好一些,但是,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定,实际使用中可以用经验常量值来替代max和min。而且当有新数据加入时,可能导致max和min的变化,需要重新定义
- 如果归一化之后很多数据都集中在一个小区间,会导致这些数据的特征不能被学习。比如 数据分布在(10000,20000),归一化到(0,1)之间,对于10001和10008这两个数据,会变成0.0001和0.0008,这样两个数据在训练的时候估计只会增大网络收敛的难度。
- 如果归一化依据异常点进行的话,最后的结果就会产生很大的偏差。所以在归一化很适合精确且规模相对小一些的数据集,一般在归一化之前可以先检查数据,排除异常点的影响。
- bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象
|