主题: 特征工程
1.缺失值
- 删除
如果某一列缺失非常严重(超过80%)可以直接删除该列,或者数据量足够大而缺失不多的情况下删除该行。
- 插补
缺失值占比在可接受的范围以内,可以插补,常见①用均值/众数/中位数插补(如果偏态最好用众数或者中位数插补);②模型插值(例如knn 利用其它变量进行相似插补,但可能会引起变量自相关问题)
- 直接离散化
即离散特征,把缺失当做一个新的category。
- random
如果缺失特别少(比如1%)可以随机生成;或者假定该列服从某种分布,可以按照分布随机生成。
2.归一化
2.1 常用归一化方法
- (真正的归一化)减去最小值,除以极差
- (标准化,有时被当做归一化)减掉均值,除以标准差
2.2 归一化的作用
- 涉及到有关距离的算法时,比如 knn/svm,使不同量纲的特征处于同一数值量级,具有可比性,以免模型过分关注方差大的特征。
- 影响迭代算法收敛,不进行归一化学习率比较难把握,而且算法可能收敛很慢,比如逻辑回归。
2.3 不需要归一化
- 树模型。因为树模型寻找的是最优分割点,而归一化前后分位点不变,不会影响树模型的结构
- 有解析解,不涉及算距离或者梯度迭代时候,比如求逆计算最小二乘估计。
3. 连续变量离散化 / 数据分箱
3.1 连续变量离散化的方法
- 无监督:按照实际意义、等宽、分位点
- 有监督:(联系回归树)给定箱子数,最小化分割后的平方误差——找到最优分割点
3.2 离散化的原因
合理性在于小范围连续数据的差别没有太大意义,可以看做一类,好处是:
- 避免异常点,模型更加 robust,也算是消除了量纲影响。
- 对于线性模型来说(比如逻辑回归),如果特征和y不是线性的关系的话,进行离散化相当于为模型引入了非线性,加大拟合
- 离散变量的计算相对于连续变量更快
- 缺失值处理时,可以把缺失当做一个新的category
3.3 问题
- 显而易见,丢失部分信息。
- 增加了特征的个数(整体上降低了bias,增大了variance)(这一点可以结合正则化解决)
4.异常值
4.1 异常值识别
- 某个特征(一元):3sigma原则、箱线图
- (多元)基于距离:马氏距离/库克距离,看看与中心的距离远近
- 线性模型,具有大残差的数据可能是异常值
- 主成分分析,定义outlier scores衡量“原数据与映射回来的数据的差别”(考虑不同主成分所需乘以的权重,第一主成分所代表的数据中正常数据更多,所以权重越小;当j取到最后一维的主成分下,我们认为权重最高,达到1)
- isolation forest
基于二叉树,单颗树每次随机选择特征+分割点,离群数据很容易被划分到最终子节点。用节点深度来衡量数据异常的可能性。再构建多棵树消除随机的影响。 - one class svm
训练出一个最小的超球面把训练集把包起来,判断一个新的数据点落在内外。
4.2 异常值处理
- 删除观察值
- 分箱/离散化
- 变换(比如右偏 Log变换)
- 估算(类似缺失值处理,用分位点或者模型比如knn)
5. 偏态
- 识别:偏态系数、画图比如直方图
- 问题:线性模型(比如逻辑回归)不符合分布假设
- 处理:boxcox变换(常见的比如对数变换、平方根)
6. 降维 & 特征选择
- 降维/投影:PCA
- 特征选择:系数显著性、随机森林变量重要性、向前向后选择、正则项
主题:算法
7. SVM原理
相关问题见教材 & 链接
主题:代码
10.python 和 r 常用的预处理的函数
python pandas:
- df.loc / iloc
- df.duplicated
- df.isnull().sum(axis=0), df.dropna
- pd.cut
- value_counts / sort
r baseR
- na.omit / unique
- table / arrange / apply&aggregate...
- tidyr pivot_longer group_by+mutate
11.sql 常用的函数
- 聚合函数 + groupby
- 窗口函数 rank xx over(partitions by <用于分组的列名> order by <用于排序的列名>)
- 字符串、日期、数值函数
主题:其他
12.给你一些数据,你的处理步骤
- 定义问题
- 理解数据:特征、清洗(预处理)、选择(相关性)
- 选择算法 + 调参
- 评估模型