特征工程是将原始数据转变为模型的训练数据的过程,目的是为了获取更好的训练数据特征。特征工程在机器学习中占有非常重要的作用,也是数据分析工作中最消耗时间与精力的一部分工作。
特征工程主要包括特征的获取、特征处理、特征监控三大部分,其中特征处理为特征工程的核心。
一、特征获取
特征获取方案应包括特征如何获取以及如何存储
二、特征处理
特征处理包括特征清洗、特征预处理两部分内容
(1)特征清洗
(a)重复值识别与处理(drop_duplicate)
(b)缺失值识别与处理
连续型变量,可以选择平均值或者中位数来填充缺失值;
离散型变量,一般选择众数填充缺失值
(c)异常值识别与处理
可以通过绘制散点图识别异常值;
可以通过聚类筛选异常值,如果某个簇样本数很少,且距离其它簇较远,则极有可能为异常值样本;
可以通过异常点检测方法(iForest或one class SVM);
筛选出的异常点最好找懂业务的人确认,防止误删,影响模型效果
(d)数据不均衡
如果训练集中的各个类别样本数量不是大约相同的比例,拟合出来的模型对于训练集中样本数少的类别泛化能力会很差,需要解决数据不平衡问题。
- 权重法:可以通过调整类别的权重来解决此问题,具体为针对训练集中的每一个类别加一个类别权重class_weight,该类别样本数量越多,也可以对每个样本加样本权重sample_weight。在sklearn中,绝大多数分类算法都有class_weight和sample_weight超参数供使用
- 采样法:两种思路,一是针对样本数量多的类别做子采样,二是对样本数量少的类别做过采样,但两个方法均存在问题,采样后改变了训练集分布,导致泛化能力差。于是衍生出第三种方法,人工合成样本(SMOTE)
(2)特征预处理
(a)单个特征
归一化与标准化:解决量纲的不同,加快迭代速度
特殊特征处理:有时候需要针对时间、地址、名称等特征进行特殊处理,从中提取部分信息作为特征值
离散特征连续化:逻辑回归、线性回归等模型需要连续型特征值,可以采用都热编码、哑变量进行处理
离散特征离散化:sklearn中只接受数值型变量,有些定类变量需要先转化为数值型变量,例如高、中、低。可以采用都热编码或者哑变量处理方式
连续特征离散化:数据压缩,分箱。可以采用决策树、GBDT等高级方法进行分箱
(b)多个特征
特征选择:从所有特征中选取部分特征作为训练集,选择前后特征的值不发生变化。
特征提取(降维):通过映射(空间变换)将高维数据映射到低维空间,特征的值也会随着空间变换发生相应变化。主要的降维方法包括PCA(无监督降维方法,有前提假设是方差越大包含的信息越多,但有时方差较小的特征可能正好能决定分类,容易被剔除掉)、LDA(有监督降维技术,其主要思想为:投影后类内方差最小,类间方差最大,降维最多降到类别数k-1维度)
(c)衍生特征
特征加减乘除得到新特征
三、特征监控
查看特征的重要性及权重,防止特征质量下降,影响模型效果