在机器学习应用中,特征工程扮演着重要的角色,可以说特征工程是机器学习应用的基础。在机器学习界流传着这样一句话:“数据和特征决定决定了机器学习算法的上限,而模型和算法只是不断逼近这个上限而已”。在机器学习应用中,特征工程介于“数据”和“模型”之间,特征工程是使用数据的专业领域知识创建能够使机器学习算法工作的特征的过程。美国计算机科学家Peter Norvig有两句经典名言:“基于大量数据的简单模型胜于基于少量数据的负责模型。”以及“更多的数据胜于聪明的算法,而好的数据胜于多的数据。”因此,特征工程的前提便是收集足够多的数据,其次则是从大量数据中提取关键信息并表示为模型所需要的形式。合适的特征可以让模型预测更加容易,机器学习应用更有可能成功。
特征提取
从数学的角度讲,特征工程就是将原始数据空间变换到新的特征空间 ,或者说是换一种数据的表达方式,在新的特征空间中,模型能够更好地学习数据中的规律。因此,特征抽取就是对原始数据进行变换的过程。大多数模型和算法要求输入是维度相同的实向量,因此特征工程首先需要经原始数据转化为实向量。将原始数据空间变换为模型输入向量空间的过程便是特征工程所要做的事情。
特征工程的提取依赖于业务领域知识,特征工程可以说是业务逻辑的一种数学层面的表示。所以特征工程的第一步是理解业务数据和业务逻辑。特征提取液可以看作用特征描述业务逻辑的过程,特征提取的目标是对业务进行精确、全面的描述。
如何寻找特征?
我们通常根据业务场景寻找相关特征,例如在美团酒店搜索排序中,描述酒店的特征有酒店的位置、上线时间、星级等,描述用户的特征有用户的注册时间、VIP等级、地理位置等,这些特征是静态的,可以从数据库中抽取。除此之外,用户在App上的浏览、交易等行为记录中包含了大量的信息,特征抽取则主要是从这些信息抽取出相关因素,用数值变量进行表示。常用的统计类特征有计数特征,如浏览次数、下单次数等;比率特征,如点击率、转化率等;统计量特征,如价格均值、标准差、分位数、偏度、峰度等。
探索性数据分析
探索性数据分析(Exploratory Data Analysis,EDA)是采用各种技术(大部分为可视化技术)在尽量少的先验假设条件下,探索数据内部结构和规律的一种数据分析方法或理念,也是常用特征工程中发现好的特征方法。
EDA技术通常可分为两类:一类是可视化技术,如箱形图、直方图、多变量图、链图、帕累托图、散点图、茎叶图、平行坐标、让步比、多维尺度分析、目标投影追踪、主成分分析、多线性主成分分析、降维、非线性降维等;另一类是定量技术,如样本均值、方差、分位数、峰度、偏度等。
数值特征
常见的数值特征的处理方法:
- 截断:对于连续型数值特征,有时候太多的精度可能只是噪声,所以可以在保留重要信息的前提下对特征进行阶段,截断后的特征也可以看作是类别特征。另外,至于长尾的数据,可以先进行对数转换,然后进行截断。
- 二值化:对于一些计数特征,例如用户对一首歌的访问次数、用户对某个商品的浏览次数,处理这些计数特征,首先要考虑的是,保留为原始计数还是转换为二值变量来标识是否存在或进行分桶操作。
- 分桶:常见的分桶方法有固定宽度的分桶、分位数分桶,还可以通过聚类的方式将特征分为多个类别。分桶可以看作是对数值变量的离散化。
- 缩放:常见的缩放有:标准化缩放、最大最小值缩放、Box-Cox变换、对数变换等数学变换操作。
- 缺失值处理:常用的缺失值处理方法有:默认值填充、均值、中位数、众数填充等,具体看实际模型应用效果做选择。
- 特征交叉:数值特征交叉或组合可以表示数值特征之间的相互作用,比如加、减、乘、除等等操作,有的模型可以自动处理特征组合,如FM和FFM模型等。特征交叉是为了弥补线性模型无法表达非线性性质的不足的补充,有助于提升线性模型的表达能力,但是需要很多人工特征工程。
- 非线性编码:主要是利用将原始特征输入随机森林等模型,再将模型的训练结果输出作为新的特征应用到线性模型中。
- 行统计量:除了对原始数值变量进行处理之外,直接对行向量进行统计也可以作为一类特征,如统计行向量中空值的个数、0的个数、正值或负值的个数,以及均值、方差、最小值、最大值、偏度、峰度等。
类别特征
常见的类别类别变量的处理方法:
- 自然数编码:即将文本或数值表示的类别变量分配一个编号再作为特征喂给模型。
- 独热编码:最常见的类别编码处理方式即One-Hot。
- 分层编码:例如对于邮政编码或者身份证号等类别特征,可以取不同位数进行分层,然后按层次进行自然数编码,这类编码一般需要专业领域知识。
- 散列编码:对于有些取值特别多的类别特征,使用独热编码得到的特征矩阵非常稀疏,因此在进行独热编码之前可以先对类别进行散列编码,这样可以避免特征矩阵过于稀疏。实际应用中我们可以重复多次选取不同的散列函数,利用融合的方式来提升模型效果。
- 计数编码:计数编码是将类别特征用其对应的计数来代替,这对线性和非线性模型都有效。
- 计数排名编码:它利用计数的排名对类别特征进行编码,这种编码方式对异常点不敏感,类别特征取值不会冲突。
- 目标编码:它基于目标变量对类别特征进行编码。例如,在广告点击率预测问题中,我们计算广告主ID在过去固定一段时间内的点击率,对广告主ID进行目标编码。
- 类别特征之间交叉组合:例如针对城市ID和商品ID两个类别特征,我们可以计算某个城市有多少不同的商品ID以及当前ID出现次数的分布,从而得到新的数值特征,或者计算某个城市出现次数最多的商品ID,从而得到一个新的类别特征。
-
类别特征和数值特征之间交叉组合:这类特征通常是在类别特征某个类别中计算数值特征的一些统计量。例如针对用户ID,统计过去一段时间内在网站上的浏览次数 、购买次数、以及购买价格的统计量,如均值、中位数、标准差、最大值和最小值等;针对产品,统计用户对产品的评分、评论次数、购买次数、浏览次数等。
时间特征
在实际应用中,时间往往是一个非常重要的因素,例如用户在购物网站上的浏览、购买、收藏的时间,产品在购物网站上的上线时间,顾客在银行的存款和借款时间、还款时间等。
空间特征
如经纬度,可以将经纬度作为数值变量使用,也可以做散列变换为类别特征使用。
文本特征
对于文本特征,类别特征的处理方法同样适用,基于深度学习的自动特征工程效果变的越来越好。但是好的特征仍然具有竞争力。文本特征往往产生特别稀疏的特征矩阵。常见的文本特征预处理方法有:将字符转为小写、分词、去除无用字符、提取词根、拼写纠错、词干提取、标点符号编码、文档特征、实体插入和提取、Word2Vec、文本相似性、去除停止词、TF-IDF、LDA、LSA等。