接下来会几个关于推荐系统的写作系列,包括:特征工程、画像、召回、排序之机器学习、排序之深度学习,目的是涵盖推荐系统的方方面面知识,希望在所有整理完之后自己有一个质的进步,阅读的朋友也能一起进步。首先会更特征工程相关,后续均会依次上线,敬请期待!
“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。这句话可谓是做算法的同学的基本认知之一了,可见数据和特征对于算法和模型的重要性,而笔者在以往的经验中也发现了有时候仅仅是修正一个小的特征bug,线上的效果就会相对提升好几个百分点。因此在做推荐系统算法模型的时候(当然做其他算法模型也一样)要保证数据和特征的准确性,在这个前提上进行算法的调优才是有意义的。
本系列文章主要介绍的是特征工程相关的知识,中间会穿插一定的python代码或者Scala代码(Python和Scala的环境可自行搜索准备),也会涉及如何使用Spark来做特征工程相关的事情。希望大家在阅读完本章节的时候能够收获以下内容:
在开始介绍特征工程之前,先说明一下模型训练的一般流程,目的是让大家明白做一个算法模型过程中会涉及的流程和数据特征在算法模型中的重要性。
作为一名算法工程师训练模型可谓是家常便饭,不管是做推荐中的召回模型、排序模型还是其他领域的分类模型等,都应该有一个规范化的流程,这样在做模型的过程中也会更加清晰,当然也不一定完全遵循这个流程,只是说基本过程应该是一致的。
具体参考:独孤九剑:算法模型训练的一般流程
数据是什么?数据是信息的载体,其表现形式是多样的,可以是数字,符号,文字,图片,音频,视频等等。信息是什么?信息是数据的内涵和要传达的内容。两者相铺相成。
在算法模型中,数据可以理解为基础的features和label,而信息可以理解为数据的上层表示,即基于这些数据(featurs),算法模型最终可以传达出什么样的信息(label)。
数据的形式可以分为:
在日常使用中,通常我们接收到数据都是结构化的数据,比如算法模型中构造特征数据。对于结构化的数据可以划分为:
同样对于结构化的数据,也可以进行等级的划分,一般认为数据的4个等级为:
了解数据的展现形式和分类之后,在特征的构造和筛选过程中才能最大的发挥数据的价值。
前边“啰嗦”这么多,无非是在强调一点:特征是算法模型中的极其重要的一部分。
在Wiki上,特征工程被定义为:使用领域知识通过数据挖掘技术从原始数据中提取特征的过程。
当我们对数据建立模型进行分析时,首先要做的就是对数据进行分析和处理,如果没有数据则没有办法建立模型,因此拿到什么样的数据就显得格外重要。所以对原始数据进行处理和加工的方式,是建模过程中至关重要的一步。
特征工程要做的就是把一个原始数据转变成特征的过程,这些特征可以很好的描述这些数据,并且利用他们建立的模型在未知数据上的表现性能可以达到最优(或者接近最佳性能)。
算法模型我们通常分为两类:监督学习和无监督学习。通过这两类算法去进行建模时我们要构造的数据分别为<x,label>和<x>,其对应到特征工程中就是人工的去设计输入变量x。而在设计x的基本操作包括:提取、升维、降维。
简而言之,特征工程的目的,在于获得更容易表现数据性质的训练集。
上边也提到了特征工程对于建模的重要性,你可以理解为:“选择的特征越好,最终得到的性能也就越好”。这句话虽然没错,但会给我们造成误解。实际上,模型的实验结果取决于选择的模型、获取的数据以及使用的特征,甚至定义问题的形式和用来评估模型准确度的客观方法也会有所影响。此外,实验结果还受到许多相互依赖的属性的影响,而我们需要的是能够很好地描述数据内部结构的好特征。
只要特征选得好,即使是一般的模型(或算法)也能获得很好的性能,因为大多数模型(或算法)在好的数据特征下表现的性能都还不错。好特征的灵活性在于它允许你选择不复杂的模型,同时运行速度也更快,也更容易理解和维护。
有了好的特征,即便你的参数不是最优的,你的模型性能也能仍然会表现的很好,所以你就不需要花太多的时间去寻找最优参数,这大大的降低了模型的复杂度,使模型趋于简单。
显然,这一点是毫无争议的,我们进行特征工程的最终目的就是提升模型的性能。
特征工程并非是一个问题,而是关于特征的一系列问题,包括:特征设计、特征获取、特征处理、特征监控。其中的特征处理是整个特征工程中比较重要的一部分,包括:特征清洗、特征处理、特征转换、特征选择。
所谓的特征设计即思考设计适合业务特性的特征,该部分比较占用时间且需要结合领域经验进行制定,比如电商领域的部分特征和内容领域的部分设计设计是有区别的。因此在做特征工程的时候要结合自己公司的业务进行定向的设计和构建,这样才能最大程度的发挥特征工程在建模过程中的作用。
这里的特征获取其实更多的基础数据的准备,即如何获取底层的通用的特征数据。比如一个电商领域平台,用户的属性特征、商品的属性特征这些作为基础数据,很容易便可以获取,但是对于一些用户与类别的交叉特征则需要在基础的数据上进行加工获取,因此基础数据的准备和处理也是必不可少的一环。
同时在获取特征以后要注意的是如何存储特征,以便于建模使用和后期的线上业务使用。一般离线训练会依赖于hdfs、hive或者hbase,线上使用特征则依赖于redis、mongo等。
特征处理即对获取的特征进行加工的过程,包括数据清洗、特征处理、特征选择和特征转换。经过处理的特征可以更好的传达数据的信息和建模使用。
特征在对于线上模型的使用有着很大的影响,如果特征出现了一些问题,很容易造成线上业务指标的下滑。因此要增加对特征的监控,比如未正常产出、产出值有异常等。
特征工程的目的就是为了建模做准备,不论是推荐领域、搜索领域、NLP领域、图像领域、音视频领域等,没有一个好的特征工程,算法模型的效果提升往往都是有限的,因此对未经过滤、杂乱、不完整的原始数据进行加工和处理就显得格外重要了。
在我们的日常工作中,比如做某个业务的推荐算法,我们并不会经常的更新线上的排序算法,比如选定一个XGBoost算法,在使用该算法期间,我们更多的工作则是去完善我们的特征数据和重新训练模型、调整参数等,因为无论采用什么算法,只有长期持续的优化特征数据和召回数据才能发挥算法的最大作用(因为每次增加召回数据可能都要修改或者增加特征数据)。
另外在做算法竞赛的过程中,特征工程也能够发挥巨大的作用,因为大家知道的数据都差不多,算法也都差不多,区别就在于特征工程和训练模型的一些小技巧。
至此,关于特征工程的简单介绍已经完结,接下来将会具体说明如何做特征工程。