缺失值处理
连续值
一般采用取平均值或者中位数来进行填充。
离散值
最频繁出现的类别(或者众数)来填充。
异常值清洗
异常数据可能给模型带来很大的偏差。
聚类清洗
例如,通过KMeans将训练样本分成若干簇,如果某一个簇里的样本数很少,而且簇质心和其他所有的簇都很远,那么这个簇里面的样本极有可能是异常特征样本。可将其从训练集过滤掉。同样道理还可以使用BIRCH和DBSCAN密度聚类算法。
异常点检测算法
使用iForest或者one-class-SVM来进行过滤所有的异常点。
特殊的特征处理
日期
对于20180519这样的值没办法直接使用。
一般有几种比较有代表性的方法:
- 时间差值法:使用UTC计算到某一天的时间差,从而将其转化为连续值。
- 根据时间的年月日,星期,小时数,将一个时间特征转化为若干个离散特征。
- 权重法:根据时间的新旧设置一个权重值。
地理位置
“成都市锦江区XX街道XX号”,可以转化为离散值和连续值。若是离散值的话,可以转化为多个离散特征,如城市名,区县,街道等。但是如果需要判别用户分布区域,则一般处理成连续值比较好,这时可以转化为经度和维度的连续特征。
特征的标准化和归一化
为什么需要标准化/归一化?
因为特征的数值范围不同的话,会影响梯度下降的速率。如果将目标函数的等值图画出来,数值范围大的特征,那个方向会需要更多次的迭代才能找到最优解。如果将每个特征的范围转化成一致的,那么等值图的图形会是一个圆形,梯度下降在各个方向的速率是一样的,可以更快地找到最优解。
不管是标准化还是归一化,它们的本质都是线性变换,是一个的形式,都是压缩后再进行平移。这样的性质决定了对数据进行改变后不会造成“失效”。从公式也可以看出,只是数据的均值和方差发生了变化,数据具体服从某种分布并没有得到改变。
min-max归一化
缩放仅仅和最大值,最小值的差别有关。在没有归一化之前,每个特征有自己的量纲,假设有两个特征,面积和房间数。因变量为房价。
在没有归一化之前,面积可以为0~1000,房间数为0~10,损失函数的等高线与参数的收敛关系可能是这样的
可以看到未归一化时图像的等高线类似于椭圆形状。归一化后
图像的等高线类似于圆形形状。明显可以看到最优解的寻优过程会变得平缓,更容易正确收敛到最优解。
z-score标准化
缩放和每个点都有关系,具体方法是求出均值和标准差,用(x-mean)/std来代替原特征。这样就变换到了均值为0,方差为1的分布(这里很容易误以为标准化后就符合正态分布,而是原始随机变量服从什么分布,标准化后就服从什么分布,只是均值和方差变了)。sklearn中使用StandardScaler来做z-score标准化。
可以看出,标准化后能够加速损失函数收敛速度。能够更快得出最优参数ω和b。z-score最适用的数据分布是近似高斯分布,其他分布的效果可能效果会变差,比如长尾分布,分布的改变可能会影响数据原有的表现情况。
标准化(z-s