4.1.6 特征工程
如果说数据分析是发现数据中的浅层模式,那么特征工程就是发现数据的深层模式,并将这种深层模式以简化的形式表现出来,方便机器学习算法学习,毕竟很大程度上我们会说机器学习算法的成功取决于数据呈现的形式。从这点出发,特征工程是将知识注入机器学习模型的行为,是一项工程实践活动。
不同的变量类别有不同的处理方法。例如,数值型数据可聚合操作,分类型数据可分解和结合数值变量的聚合操作,日期型数据可拆解操作。对于复杂的学习场景,例如图像、视频、语音,深度学习中的特征学习表现良好。
本节我们重点介绍特征构造与衍生、特征选择这两方面的内容,并称即将进入模型的变量为特征。在进行特征工程前,我们先问自己如下的问题:
·要改进模型效果吗?
·标准的建模流程必须这样做吗?
·效果太差,模型无法验证通过和部署吗?
如果没有这样的问题,则可以省略这部分的工作,加速建模。基于奥卡姆剃刀原则,我会给出如下的建议:优先使用直接观测或收集到的特征,而不是变换或学习出来的特征,因为变换或学习出来的特征新增了工程量、不便解释、稳定性和有效性存在风险、不便监控等问题。类似的,基于这样的原因,当我们选择使用少数复杂特征或使用大量简单特征时,更倾向于选择简单的特征。例如,笔者一般会使用较原始的数据建立第一版基础模型供后续比对和参考,这一步几乎不用做特征工程。
当我们面临上述3个问题时,就需要在特征工程上面下功夫了,即通过特征工程解构数据。
例如某特征和y之间具有非线性关系,通过特征变换,将非线性关系转换为线性关系,此时学习的难度得到了降低,即降低了该问题对算法学习能力的要求。让我们直观查看如下实例。
如果给定3个特征和1个目标值,使用机器学习算法拟合上述的关系。3个特征分别是目标值“体积”对应的“长、宽、高”。使用原始特征时将拟合1个3阶的模型。当我们把“长乘以宽”得到的“面积”作为一个新的衍生变量,该衍生变量和“高”将拟合一个2阶的模型,很明显特征的变换简化了学习过程。这与大家观察到的现象基本一致:越是简单的算法,特征处理要求往往越高;越是复杂的算法,对特征的处理反而不是那么重要了,可以将其交给算法,从而释放人力。这种通过增加特征处理的工作来降低模型复杂性的平衡,类似于软件工程算法中“时间与空间的权衡”。
特征构造与衍生有很多的方法实现,例如,交叉组合(Feature Cross)、数学变换、离散化、连续化,以实现特征的高阶、低阶和线性、非线性的变换。通过交叉组合构造的新特征称为合成特征(Synthetic Feature),但新特征是否具有业务或实际意义和可解释性同样重要,建模过程不是单纯为了机器学习而学习,尤其是交叉组合,例如在电商场景中,性别和年龄的组合具有明显的意义,而性别和节假日的组合意义则没有那么明显。
在特征工程处理策略上,为了在做特征工程时更有体系且组织有序,实践中一般将特征进行分层、分类,例如将特征分为基本属性类、信用类、社交类、电商类等,然后在同一层级和不同层级之间进行交叉衍生,随着交叉深度的增加,特征的数量也将呈指数级增长。
当然,特征并不是越多越好,重复、冗余或没有区分力的特征需要尽量排除,以保持在后续流程上的简化,以及实验、调优的高效。此时,特征选择登场。特征选择的内容丰富,既有业务层的数据可用性分析、可解释性分析、统计学上的稳定性分析、相关性分析,也有算法层的特征重要性、区分力分析等。
注意:特征处理方法,要求一致性地运用到测试和线上预测环境中;特征处理信息,要求一致性地保留到测试和线上预测中,例如训练集中的空值填充均值为x,那么测试和线上预测中也填写x。实践中需要兼顾它们的迁移难度,切忌一味追求特征变换的“魔法”。
我们将在第6章和第8章介绍特征工程相关的实践方法。