听说算法工程师80%的时间都在做特征工程?
前言
想象一下,当今社会备受瞩目的人工智能和数据挖掘算法工程师每天大部分时间都在做什么呢?是花大量时间手推公式,还是思考各种trick对算法调参,还是一遍遍清洗数据和加工特征?实际上,大部分的数据挖掘/算法工程师在日常的工作流程中,80%以上的时间用于研究特征工程,而他们在算法设计和模型优化上分配的时间不到20%。特征工程为何如此重要,以至于数据挖掘/算法工程师甘愿把如此之多时间都花在这上面呢?
机器学习界普遍认为:“数据和特征决定了机器学习算法的上限,而模型和算法只是不断逼近这个上限而已。” 在这场以模型效果提升为目标的数据算法博弈中,基于大数据的简单模型往往胜于基于小数据的复杂模型,优质的数据对预测结果大有裨益,而简单模型有效的关键在于好的特征工程。
在这种背景下,精细化特征工程成为成功搭建模型的必要条件。特征工程尽管重要但少有人提及,它既是科学,需要严谨细致的理论指导,它又是艺术,需要不断创新的实验精神,下面我们来一起了解下这门艺术!
一、特征工程是连接数据和算法的桥梁
要想了解特征工程必须首先了解什么是机器学习,机器学习致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。一个典型的机器学习框架可以用问题抽象,特征挖掘,模型选择和模型融合四个步骤进行概括,这其中特征工程是连接数据和算法的桥梁。从数学的角度讲,特征工程就是将原始数据空间变换到新的特征空间,处理后的数据会以一种机器更容易理解的方式表达数据背后的逻辑,模型能够更好学习数据表面和隐藏的规律。
特征工程主要包含如下几个环节:数据观察—>数据清洗—>特征加工—>特征选择—>特征规约。好的特征工程不仅需要我们对模型算法有深入的理解,还要有较强的专业领域知识。我们将特征工程主要涵盖的环节以及各环节需要解决的问题总结在下方的导图中,以供大家参考。
图1 特征工程主要环节导图
二、好的特征工程建立在好的数据质量
在数据挖掘工作过程中存在普遍共识:垃圾进垃圾出,好的特征工程一定建立在好的数据质量之上。那么如何能保证好的数据质量呢?
1.细节决定成败-缺失值处理
如XGBoost的一些机器学习算法可以在模型构建过程中对特征缺失值进行处置,但是俯视整个建模流程,我们并不能“放心的”把数据缺失问题直接交给算法。我们首先来回顾一下XGBoost是如何处理特征中的缺失值的:XGBoost论文中曾提及,缺失值会被分别分入左右子树,比较两者损失函数值下降的程度,然后选择最优的划分方式。这里缺失值其实是被看做一个不同于变量中任何值的值(例如:-9999)。那为什么说我们仍需在模型训练阶段之前处理缺失值?原因在于:我们需要考察值的缺失类型。
举个例子:假如我们在Hive中加工一个指标“用户过往一年退货率”,统计的口径是用户过往一年退货率 = 过往一年退货单量/过往一年订单量。需要关注以下两种情况:① A顾客过往一年无退货、有订单,则该指标值为0;② B顾客过往一年无退货、无订单,则该指标值为Null。这两种情况都是没有退货记录,从业务意义上其实应该属于同一类,但是第一种情况会被后阶段模型按照不同值处理,这自然产生了信息干扰。
2.谨慎加工防止数据穿越
工作中我们最常遇到的数据是时间序列数据,时间序列数据不同于截面数据,前者是按不同的时间节点收集数据,往往,当我们在不同时间观察同一个观察指标时,数据会表现出一定波动甚至周期性的差异。而数据穿越问题就像电影蝴蝶效应中的情节,如果失去时间因果论证的相关信息,只能是金玉其外,败絮其中的伪相关。
举个例子,当我们要预测一个人购买手机的概率,原有的因果关联是这个人买到新手机后会大概率搜索浏览手机壳商品,假如做特征时发生数据穿越,我们会得到“用户搜索浏览手机壳商品后”大概率“用户会购买手机”的错误结论。结果导致模型效果在训练阶段被高估很多,实际上线后效果一落千丈。
3.稳定大于一切
在实际模型上线之前,模型都需要通过严格的评审。除了亮眼的模型效果外,模型专家往往更关注的是模型稳定性。模型由特征组成,所以考察特征的稳定性对于模型稳定性至关重要。如果我们选用了分布随时间有较大变化的特征作为模型的重要支持特征,模型效果就会变得非常不稳定。例如,当我们要预测一个人未来一个月的商城购买金额时,如果我们用“冬春两季”的表现数据建模去预测“夏季”的消费,就要注意“羽绒服”、“取暖器”这类强季节性品类特征的甄选,因为它们不会在一年四季均有稳定可用的统计量。
三、特征构造方法需要量体裁衣
在日常生活中,我们接触到的数据类型方方面面,近年来步入AI时代,人们对数据的探索视野已跳出二维数据框架,踏上对图像、声音或时空数据的探索征途。以下,我们将结合风控场景介绍三种特殊的数据类型构造方法:
1.时间序列特征
前文提及,时间序列数据相比截面数据多了一个时间维度,多出来的时间维度信息其实可以提取出两层含义:“趋势”和“周期”。趋势类特征的加工在时序数据中具有特色意义,此方法不会对业务背景做假设,通常可采用线性拟合来进行简单构造。例如,我们想要加工某商品的历史销量趋势,先逐月统计商品月均销量,套用最小二乘推得的公式计算并提取斜率,在后期实际建模会得到的很好效果。
图2 趋势类特征加工示意图
周期类特征的提取在时序类数据中基础而重要,我们需要根据收集到的数据时长提取相应时间标签:不到一年的数据可以加工“星期”标签,假如我们有两年训练数据,就可以考虑“月份”、“季度”标签。在树模型中,此类特征不一定具有很强的排序能力,但却拥有很好的分群能力。
除常规加工方法外,还可借助当前流行的深度学习方法。例如我们可以用LSTM对历史序列数据做拆分处理,直接对目标变量进行预测输出,也可以通过双向GRU和Attention神经网络等方法用全连接层之前的向量作为特征,喂给模型进行处理。
2.位置特征
位置数据作为用户线下轨迹的重要数据来源,可以在一定程度上反映用户的信用或欺诈风险,这类数据是构造画像模型时非常重要的一类数据。IP、WiFi、GPS报点和地址数据是最常挖掘的数据,但是当构造用户位置特征时,我们需要充分利用不同数据源特性进行加工。比如IP和WiFi这类数据在定位用户位置时,仅能在省市粒度上保证精度,想要构造更细粒度的特征需要基于更细粒度的数据源。
在风控场景下,欺诈团队往往将设备集中放置在某一固定位置,并且常会共享WiFi,共用设备。这时,我们可以针对GPS数据进行聚类发现该类高风险设备。常用的方法是用DBSCAN算法发现聚类中心,在构造特征的时候基于和聚类中心位置的距离分段进行特征加工。除此之外,用户的常活跃范围在一定时间内往往变化不大。当用户进行重要的金融活动时,如果我们能判断用户是否在常驻范围内进行该活动,势必能更好地保障该行为的可信性。在构造此类特征时,一种方法是将用户常活跃区域进行聚类(如下图所示),将聚类中心使用Geohash将经纬度转化为字符串,之后在比较时将距离计算转化成字符串比较问题;另一种方法,基于用户的访问时间及访问频次,构造序列通过word2vec等方法构造embedding向量直接喂给模型。
图3 用户活跃位置聚类
3.文本特征
UGC时代,文本数据是最常见的数据类型,对文本数据的挖掘一直以来都是研究的重点,相关的研究已经非常成熟。在风控场景下,大量的商品描述、评论等文本数据,为我们挖掘提供了重要数据来源。某种程度上用户的评论信息可以反映一定的信用风险,同时购买、搜索等文本信息反映了用户的行为意图,对营销响应类模型开发具有一定的价值,这方面的研究还在如火如荼的进行。下面我们简单介绍一下两种比较有效的处理方法。
(1)通过分词并统计词频计算TF-IDF,然后与响应变量交叉分析,选择Lift较高的关键词,进行统计汇总或直接用TF-IDF值作为向量,加入模型进行训练;
(2)将分词后的文本序列,通过word2vec或doc2vec等方法将词或句子表示成向量,和连续性变量一同通过wide&deep框架进行学习,如下图所示;
图4 Wide&Deep深度学习框架示例
4.特征筛选
Dropout是深度学习领域的黑色艺术,在机器学习中也是前有随机森林的列采样,后有XGBoost的DART。在模型建模过程中,如果将所有特征不加筛选作为训练特征,不但会导致维度灾难、内存耗尽,在模型训练阶段和后续模型上线阶段消耗大量资源,而且大量冗余无效特征容易导致模型过拟合,降低模型稳定性。在模型训练之前和训练中均可实施特征筛选,两阶段执行的功能稍有不同。
图5 建模流程中的特征筛选
(1)建模前筛选 - 过滤式
建模前筛选的原则是:逐个考察特征属性,与后阶段采用的模型无关。进行筛选的角度则如上图所罗列的3个方面:① 信息量。特征的根本价值应作为首要考察角度,对于分类型变量,我们期望值类型不应该太多,这样做OneHot Encoder时数据不至于过度稀疏。② 稳定性。在上文“时间序列特征”,已经点明有些特征带有很强季节性,在实际建模过程中,我们会考察每个特征逐月PSI稳定性。③ 目标相关性。业界常用方式包括逐个考察特征和目标变量的KS值、IV值、相关性等。
在入模前初筛阶段,其实只应该选择剔除对后阶段建模明显无用的特征。例如某个特征只有一个值、PSI > 0.1、自然数序列等。有些特征缺失率很高,但是在模型中表现很好,并且逐月稳定性及格,这时就不应该强行剔除此类“残缺”特征,而应该对此特征按业务理解填补后放入下一阶段筛选。
(2)建模中筛选 - 模型嵌入式
将特征送入模型工厂,基本意味着特征分析阶段告一段落,用最终模型筛选特征,才是体现特征实际价值之时。在统计建模时代,逐步回归和Lasso回归就是对特征筛选的大杀器,大部分机器学习模型都有筛选特征的功能或指明特征重要性的指标,而本次着重点明的是交叉验证在特征筛选方面的重要性。交叉验证在模型训练阶段有不可替代的价值,除了做模型选择、模型调参外,其实配合特征重要性指标用在特征筛选阶段也可以同时考察特征稳定性。如果在对时间序列训练数据做交叉验证时不做随机化,那每个子集可以体现样本时间序列的差异,假如我们的训练数据中没有时间变量“加持”,那其实要求我们最终入模的特征在大多数子集中都应该有较好表现;例如我做10折交叉验证,可以考虑特征入模次数是否达到5次,以此作为特征稳定性+重要性的综合筛选依据。
四、特征工程自动化修远兮却可期
通过前文我们了解了大量构造特征的方法,但找到适合场景的有效特征不太容易,需要广泛的数据探索和领域知识,这些知识的获得需要业务经验和平时积累,看似差别在毫厘之间实则差距在千里之外,这也是为什么特征工程又是艺术的原因。
有人会说特征工程如此重要,耗费时间又那么多,有没有可能自动化?还别说确实有的,自动化特征工程是自动化机器学习的核心,其最朴素的想法就是解决特征工程耗费精力,需要专家知识的问题,希望通过程序自动组合进行学习。无疑,当前自动化特征工程取得了不少的进展,其方向是值得肯定的,在工业场景,尤其是在风控场景下目前还不能大规模应用,原因有以下几点:
(1)当前自动化特征工程仍处于基础阶段,在实际的应用中,对数据质量要求很高,数据的理解和分析仍然是最耗时部分,目前这部分仍然需要大量人工参与;
(2)自动化特征工程衍生特征本质上是人工经验的提炼,能否提高模型效果,提高部分是否可信,仍然需要大量时间论证;
(3)风控场景对于特征的可解释性,稳定性要求是重点,可解释性和稳定性仍然需要结合业务和专家经验进行判断;
无疑自动化特征工程是可能的趋势,当前自动化特征工程、自动化机器学习对问题和业务的建模可以起到快速的探索作用,但真正能够用于线上仍然需要大量的人工操作。
总结
读到此,想必您对特征工程已经有了大致的了解,体会了特征工程对于模型开发的重要性——好的模型效果建立在好的数据质量上,而且需要针对不同的数据采用不同的构造方法。在实际的工作中,我们只有结合数据处理和业务理解把特征工程做好,才能引爆特征工程隐藏的黑色艺术!最后,留几个小问题给您,欢迎评论区留言。
(1) 噪声数据一定是坏的吗?
(2)相对线性模型如(LR),XGBOOST等树模型算法在特征工程上有什么不同?
(3)如何有效衍生特征?
参考文献:
1. He, Xinran, et al. “Practical Lessons from Predicting Clicks on Ads at Facebook.” international workshop on data mining for online advertising (2014): 1-9.
2. 周志华,机器学习,清华大学出版社,2016: 247-256
3. Chen, Tianqi, and Carlos Guestrin. “XGBoost: A Scalable Tree Boosting System.” knowledge discovery and data mining (2016): 785-794.
4. Mikolov et al., 2013b. Mikolov, T., Yih, W.-t., and Zweig, G. (2013b). Linguistic regularities in continuous space word representations. In hlt-Naacl, volume 13, pages 746–751.
5. Halevy, Alon, Peter Norvig, and Fernando Pereira. “The Unreasonable Effectiveness of Data.” IEEE Intelligent Systems 24.2 (2009): 8-12.
本文作者:京东数科 agg & evan
文章来源:“京东数科技术说”微信公众号
原文链接: https://mp.weixin.qq.com/s/Ivh7mU3_p1VO0L0LlU25Rw.
更多技术干货欢迎关注“京东数科技术说”微信公众号,我们只凭技术说话!