一文归纳 Python 特征生成方法 (全)
创造新的特征是一件十分困难的事情,需要丰富的专业知识和大量的时间。机器学习应用的本质基本上就是特征工程。 ——Andrew Ng
业内常说数据决定了模型效果上限,而机器学习算法是通过数据特征做出预测的,好的特征可以显著地提升模型效果。这意味着通过特征生成(即从数据设计加工出模型可用特征),是特征工程相当关键的一步。 本文从特征生成作用、特征生成的方法(人工设计、自动化特征生成)展开阐述并附上代码。
1 特征生成的作用
特征生成是特征提取中的重要一步,作用在于:
增加特征的表达能力,提升模型效果;(如体重除以身高就是表达健康情况的重要特征,而单纯看身高或体重对健康情况表达就有限。)
可以融入业务上的理解设计特征,增加模型的可解释性;
2 数据情况分析
本文示例的数据集是客户的资金变动情况,如下数据字典:
这里安利一个超实用 Python 库,可以一键数据分析(数据概况、缺失、相关性、异常值等等),方便结合数据分析报告做特征生成。
3 特征生成的方法
特征生成方法可以分为两类:聚合方式、转换方式。
3.1 聚合方式
聚合方式是指对存在一对多的字段,将其对应多条记录分组聚合后统计平均值、计数、最大值等数据特征。 如以上述数据集,同一 cust_no 对应多条记录,通过对 cust_no(客户编号)做分组聚合,统计 C1 字段个数、唯一数、平均值、中位数、标准差、总和、最大、最小值,最终得到按每个 cust_no 统计的 C1 平均值、最大值等特征。
此外还可以 pandas 自定义聚合函数生成特征,比如加工聚合元素的平方和:
3.2 转换方式
转换方式是指对字段间做加减乘除等运算生成数据特征的过程,对不同字段类型有不同转换方式。
3.2.1 数值类型
加减乘除 多个字段做运算生成新的特征,这通常需要结合业务层面的理解以及数据分布的情况,以生成较优的特征集。
多个列统计 直接用聚合函数统计多列的方差、均值等
排名编码特征 按特征值对全体样本进行排序,以排序序号作为特征值。这种特征对异常点不敏感,也不容易导致特征值冲突。
3.2.2 字符类型
截取 当字符类型的值过多,通常可对字符类型变量做截取,以减少模型过拟合。如具体的家庭住址,可以截取字符串到城市级的粒度。
字符长度 统计字符串长度。如转账场景中,转账留言的字数某些程度可以刻画这笔转账的类型。
频次 通过统计字符出现频次。如欺诈场景中地址出现次数越多,越有可能是团伙欺诈。
3.2.3 日期类型
常用的有计算日期间隔、周几、几点等等。
4 自动化特征生成
传统的特征工程方法通过人工构建特征,这是一个繁琐、耗时且容易出错的过程。自动化特征工程是通过 Fearturetools 等工具,从一组相关数据表中自动生成有用的特征的过程。对比人工生成特征会更为高效,可重复性更高,能够更快地构建模型。
4.1 FeatureTools 上手
Featuretools 是一个用于执行自动化特征工程的开源库,它有基本的 3 个概念: 1)Feature Primitives(特征基元):生成特征的常用方法,分为聚合(agg_primitives)、转换(trans_primitives)的方式。可通过如下代码列出 featuretools 的特征加工方法及简介。
2)Entity(实体) 可以被看作类似 Pandas DataFrame, 多个实体的集合称为 Entityset。实体间可以根据关联键添加关联关系 Relationship。
3)dfs(深度特征合成) : 是从多个数据集创建新特征的过程,可以通过设置搜索的最大深度(max_depth)来控制所特征生成的复杂性
4.2 FeatureTools 问题点
4.2.1 内存溢出问题 Fearturetools 是通过工程层面暴力生成所有特征的过程,当数据量大的时候,容易造成内存溢出。解决这个问题除了升级服务器内存,减少 njobs,还有一个常用的是通过只选择重要的特征进行暴力衍生特征。
4.2.2 特征维度爆炸 当原始特征数量多,或 max_depth、特征基元的种类设定较大,Fearturetools 生成的特征数量巨大,容易维度爆炸。这是就需要考虑到特征选择、特征降维,常用的特征选择方法可以参考上一篇文章: Python特征选择
注:本文源码链接:【Github】。
版权声明: 本文为 InfoQ 作者【泳鱼】的原创文章。
原文链接:【http://xie.infoq.cn/article/f29e1f201463ce642c88025f0】。文章转载请联系作者。











评论