Datawhale 零基础入门数据挖掘Task3特征工程
特征工程:将数据转换为能更好地表示潜在问题的特征,从而提高机器学习性能。
数据理解
目的:探索数据,了解数据,主要在EDA阶段完成。
定性数据:描述性质
- 定类
- 定序
定量数据:描述数量
- 定距:可以加减---日期(时间差)
- 定比:可以乘除---价格(几倍)
数据层---->描述层----->解读层----->绪论层
数据清洗
目的:提高数据质量,降低算法用错误数据建模的风险。
设想一下,给模型一个杂乱无章、非常脏的数据,那么模型学习起来也是非常困难的,那如果我们给的数据是比较干净的,那学习起来也会很方便。
- 特征变换:模型无法处理或者不适合处理
- 定性变量编码:Label Encoder;Onehot Encoder;Distribution Encoder;(比如说LR是不适合处理类别变量的)
- (有时候我们还需要对数据的分布进行转换)标准化,Z分数标准化(标准正态分布)和归一化,min-max归一化[0,1]区间;
- 针对幂律分布(长尾),可以采用公式:\(log(\frac{1+x}{1+median})\)
- 缺失值的处理:
- 不处理(针对类似XGBoost等树模型);
- 删除(缺失数据太多);
- 插值补全,包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全等;
- 分箱,缺失值一个箱;
- 异常处理:减少脏数据
- 简单统计:如describe()的统计描述;散点图等直观方法;
- 通过箱线图或者\(3\sigma\)法则(正态分布)分析删除异常值
- BOX-COX转换(处理有偏分布)
- 长尾截断
- 利用模型进行离群点检测:聚类、K近邻、One Class SVM、Isolation Forest.
- 其他:
- 删除无效列(这一列没有多少信息)
- 更改dtypes
- 删除列中多余的字符或者空格
- 将字符串转换为日期时间格式等。
特征构造
目的:增强数据表达,添加先验知识。设想一下,如果我们实际知道了某些规律,用这种特征构造的方式表达出来,会使模型学得更好一点。
- 统计量特征:计数,求和,比例,标准差
- 时间特征:绝对时间,相对时间,节假日,双休日;
- 地理信息:分桶(比如经纬度,是比较密集的,用分桶把它转换为离散变量)
- 非线性变换:取log/平方/根号;(主要是为了增加模型的非线性)
- 分桶:等频/等距分桶,Best-KS分桶,卡方分桶;
- 特征组合/特征交叉(FM)
特征选择
目的:
- 平衡预测能力和计算复杂度;
- 降低噪声,增强模型预测性能。
主要的方式有以下几种:
- 过滤式(Filter):先用特征选择方法对初始特征进行过滤然后再训练学习器,特征选择过程与后续学习器无关;
Relief/方差选择/相关系数/卡方检验/互信息法 - 包裹式(Wrapper):直接把最终将要使用的学习器的性能作为衡量特征子集的评价准则,其目的在于为给定学习器选择最有利于其性能的特征子集。
Las Vegas Wrapper(LVM) - 嵌入式(EMbedding):结合过滤式和包裹式方法,将特征选择与学习器训练过程融为一体,两者在同一优化过程中完成,即学习器训练过程中自动进行了特征选择。
LR+L1或决策树
类别不平衡
缺点:少类别提供信息太少,没有学会如何判别少数类。
-
扩充数据集;
-
尝试其他评价指标:AUC等(对类别不平衡不敏感的评价指标)。
-
调整值;(这个主要是针对LR的,将阈值调整一下)。
-
重采样:过采样/欠采样;
-
人工合成样本:SMOTE;
-
选择其他模型:决策树等(对类别不平衡兼容性比较好)。
-
加权少类别的样本错分代价;(如果它错分的话,让它在目标函数上有更多的代价)。
-
a)将大类分解成多个小类,这样就可以把问题转换为多分类问题;
b)将小类视为异常点,并用异常检测模型建模;