数据挖掘-特征工程(小记录)
定义:
将数据转换为能更好地表示潜在问题的特征,从而提高机器学习性能。主要有以下五个部分
- 数据理解(主要在EDA部分完成)
- 数据清洗
- 特征构造
- 特征选择
- 类别不平衡问题解决
数据清洗(注意,这部分只在训练集上进行)
目的:提高数据质量,降低算法用错误数据建模的风险
1. 特征变换: 模型无法处理或者不适合处理的特征对其进行变换
a) 定性变量编码: Label Encoder; Onehot Enconder ; Distribution Encoder
b) 标准化和归一化: z分数标准化(标准正太分布)、min-max变换
2. 缺失值处理: 增加不确定性质,可能会导致不可靠输出
a) 不处理: 如果缺失值少或者使用的模型对缺失值有自己的处理方法(例如lgb)
b) 删除: 对于缺失比例较大的特征或者样本,可以考虑删除(注意删除的时候只能删除训练集上的数据,之前写一个比赛的时候不确定能不能只删除训练集里面的异常值,现在确定是可以试一试了)
c) 补全: 均值/中位数/众数补全; 高维映射(One-hot 把nan作为一类);模型预测;最领近补全;矩阵补全(R-SVD)
(对于测试集上的一些异常值,可以通过一些人为找出规律然后进行一些简单的预测)
3. 异常值处理: 减少脏数据
a) 简单统计: decribe()等统计描述;散点图
b) 3sigma法则(数据要满足正态分布)/箱型图删除/ 截断
c) 利用模型进行离群点检测: 聚类、K近邻、One class SVM、Isolation Forest等
对离群点的处理要根据实际的应用选择合适的方法
特征构造
目的:增加数据的表达性,添加一些先验知识(新的特征不同的值,label的分布差异大一些比较好 个人理解)
1. 统计量特征:
计数、求和、平均值、比例、标准差
2. 时间特征:
绝对时间、相对时间、节假日、双休日
3. 地理信息
也是分桶,不要让特征的值分布的过于密集
关于邮政编码的划分(逐次划分,然后依次尝试得出一个最优解)
4. 非线性变换
取log/平方/根号
5. 数据分桶
等频/等距分桶、Best-KS分桶、卡方分桶
6. 特征组合/交叉
从 人、商品、人和商品、其他(时间,地理位置等)四个维度出发尝试构造
(匿名变量就要更多尝试性的去组合一些特征了,加权组合、加减之类的)
(在构造一些特征的时候,要注意区分出测试集和特征集)
特征选择:
目的: 平衡预测能力和计算复杂度;降低噪声,增强模型预测性能
1. 过滤式(Filter): 先用特征选择方法对初始特征进行过滤然后再训练学习器,特征选择过程与后续学习器无关
a) Relief/方差选择/相关系数/卡方检验/互信息法
2. 包裹式(Wrapper): 直接把最终要使用的学习器的性能作为衡量特征子集的评价准则,其目的在于给定学习器之后选择最有利于其性能的特征子集
a) Las Vegas Wrapper(LVM)
3. 嵌入式(Embedding): 结合过滤式和包裹式方法,将特征选择与学习器训练过程融为一体,两者在同一优化过程中完成,即学习器在训练过程中完成了特征选择。
a) LR+L1正则化 或者决策树
类别不平衡问题
缺点: 少类别提供信息太少,没有学会如何判别少数类
解决方法:
1. 扩充数据集;
2. 尝试其他评价指标: AUC等;
3. 调整theta值;(预测的阈值做一个调整)
4. 重采样: 过采样/欠采样
5. 合成样本: SMOTE
6. 选择树型模型
7. 加权少类别样本的错分代价
8. 创新
a) 将大类分解成多个小类
b) 将小类视为异常点,并用异常检测建模
一些问题:
1.树型模型推荐使用one-hot编码吗?(这个要结合决策树的原理去理解 待补 catboost可以)
决策树模型不推荐对离散特征进行one-hot编码。主要有以下两个原因:
a) 对离散型变量one-hot编码是为了让离散变量之间的距离度量变得有意义。Tree Model没有距离度量的说法,其根据不同的信息熵计算增益来划分节点,是无参数模型。
b) 增益降低,影响决策树学习。这点建议结合某个具体决策树来理解。拿cart分类树来说,其用的是gini指数。假设某个feature有三类,每类的个数分别为10,100,1000。在不进行one-hot之前,这个feature的增益还是可以的(可以套gini指数计算一下)。one-hot之后,这一个特征变成了三个特征,每个特征只有0、1两个值,比例分别为10/1110,100/1110,1000/1110。不论是哪个新增的one-hot特征,都没有原始feature的增益要高,影响了决策树的正确决策。
2. 长尾分布截断什么意思?
对于长尾分布的数据,如下所示:
我们可以把大于某个值之后的数据都赋为这个值,例如大于400的值都赋值400。另外,服从长尾分布的数据一般都建议先取log再归一化(LR)。这个部分也是需要在一个base上简单测试一下的。
3. 一些比较好的特征在模型上表现的不理想的情况怎么处理?
去看一看这些特征的分布以及和其他特征的相关性。