1.异常值处理
2.特征归一化/标准化
3.数据分桶
4. 缺失值护理
5.特征构造
6.特征筛选
7.降维(降维应包含在构造和筛选中)
1.异常值:分为两类,一类为不符合实际情况,一类为偏离其他数据太远
判断是否偏离其他数据可以用到quantile()函数,即对超出某quantile的数据删去。很多时候可直接通过观察数据分布去掉,也可不删。
常用方式有箱线图,或删掉3个σ外的数据;使用BOX-COX转换处理有偏分布,减小随机误差对预测的影响;使用长尾截断,如使用幂函数曲线来截断,在商业领域应用较多,参考文献https://arxiv.org/abs/1208.3524
2.缺失值:树类模型可以不处理;缺失数据太多直接删除该特征;插值法(mean/median/main/建model/多重插补/压缩感知补全/矩阵补全等);分箱,将缺失值分为一箱。
以上两步应在EDA中完成
3.normalization:对于正态分布可转化为标准正态;用极值做归一化处理;对power-law distribution使用log(1+x / 1+median)
4.数据分桶:目前还没学到,听说lightGBM改进XGBoost就加入了分桶,增强了模型泛化能力。直觉上优点很多,重要的是选几个bin
需用函数pd.cut()
为什么要做数据分桶呢,原因有很多,= =
# 1. 离散后稀疏向量内积乘法运算速度更快,计算结果也方便存储,容易扩展;
# 2. 离散后的特征对异常值更具鲁棒性,如 age>30 为 1 否则为 0,对于年龄为 200 的也不会对模型造成很大的干扰;
# 3. LR 属于广义线性模型,表达能力有限,经过离散化后,每个变量有单独的权重,这相当于引入了非线性,能够提升模型的表达能力,加大拟合;
# 4. 离散后特征可以进行特征交叉,提升表达能力,由 M+N 个变量编程 M*N 个变量,进一步引入非线形,提升了表达能力;
# 5. 特征离散后模型更稳定,如用户年龄区间,不会因为用户年龄长了一岁就变化
具体方法有等频分,等距分,Best-KS,卡方分
5.特征构造,数据挖掘中最难也是最关键的一步
做好特征构造,先从实际意义出发,可能需要相关领域的研究作为支撑。
特征间的组合,多项式、对数、指数等,共线性、相关性的探究,哪些可以删除,特征背后的信息,如邮政编码中的部分提供了城市信息,时间提供了季节性信息等。
特征本身的统计参数,如高于均值的如何,低于均值的如何,高于2个σ的如何等
PCA/LDA/ICA也是特征构造
6.特征筛选:有三种方式,过滤式,包裹式,筛选式。
过滤式其实就是分析特征间相关性,包裹式则是分析特征的边际贡献,传统计量经济学中应用较多。广泛使用的是嵌入式,例如lasso,decision tree等,即在regularization等中自然完成,嵌入到模型内部。
总之任何比赛的核心都是特征的选取,是否能暴露更多有效信息,是否能避免更多无关误差,是否能应用先验知识。
对于匿名特征,只能单纯通过数据变换,也可以用neural net等进行选择