作者丨gongyouliu
编辑丨lily
这是作者的第25篇文章,约2.2w字,阅读需120分钟
推荐系统是机器学习的一个子领域,并且是一个偏工程化、在工业界有极大商业价值的方向。大量应用于提供toC类产品的互联网企业服务中,通过推荐系统为用户提供精准的个性化服务。推荐系统通过推荐算法来为用户生成个性化推荐结果,而推荐算法依赖数据输入来构建算法模型。
本篇文章我们来讲解推荐系统所依赖的数据,怎么处理这些数据,让数据转换成推荐算法可以直接使用的形式,最终我们就可以构建高效、精准的推荐模型,这些处理好的适合机器学习算法使用的数据即是特征,而从原始数据获得特征的过程就是特征工程。
具体来说,我们会从推荐算法建模的一般流程、推荐系统依赖的数据源介绍、数据处理与特征工程简介、常用推荐算法之数据与特征工程、推荐系统数据与特征工程未来趋势等5个部分来介绍相关知识点,期望本文的讲解能够让读者更加深入地理解推荐系统依赖的数据源的特点、数据预处理方法以及基于这些数据之上的特征工程方法与技巧。
一、推荐算法建模的一般流程
在引入推荐系统数据源与特征工程之前,我们先介绍一下推荐算法建模的一般流程,这样我们就可以更好地理解数据与特征工程在整个推荐系统业务流程中的地位和作用。
推荐系统是机器学习的一个子领域,因此推荐系统处理问题的方式遵循机器学习的一般思路。我们可以将机器学习过程看成一个打造生产某种产品的机器的过程,我们根据过往的生产经验来制造一款生产该产品的机器,过往的生产经验就是我们的训练集,构建好的机器就是我们的机器学习模型。我们将原材料加工好,按照某种方式灌入这个机器,这个机器的最终输出就是我们需要的预测结果,构建的机器是否完善、能否生产出误差在可接受范围内的商品,代表了我们模型的精准度。
根据上面的简单类比,推荐算法为用户进行个性化推荐的一般流程如下面图1。我们通过收集不同来源的数据汇聚成推荐算法需要的原始数据,通过特征工程对原始数据处理生成最终特征,再通过选择合适的推荐算法对特征进行训练获得最终的推荐模型,在预测/推断阶段,我们根据某个用户的特征,将特征灌入模型获得该用户的推荐结果。
图1:推荐算法建模的一般流程
从上图可以看出,数据和特征工程在整个推荐系统业务流的起点,因此是非常重要的。数据是原材料,原材料(推荐数据源)是否齐备、质量是否优良直接决定是否可以生产出好的产品,而对原材料的处理加工(特征工程)决定了我们是否可以高效、快速、高质量地生产出好的产品。
下面我们会对推荐系统的数据及特征工程这两个部分详细讲解,模型构建及预测不在我们本文的讨论范围。
二、推荐系统依赖的数据源介绍
推荐系统根据用户在产品(APP、网站等)上的操作行为,猜测用户的兴趣偏好,最终给用户做个性化推荐。在整个推荐过程中,涉及到可能产生数据的地方有用户自身、标的物、用户的操作行为、用户所在的场景(上下文)等4个部分。因此推荐算法根据这4个触点,依赖4类数据。根据承载数据的载体,又可以分为数值类数据、文本类数据、图片类数据、音视频数据等4类。根据推荐系统依赖的数据的组织形式(数据格式),又可以分为结构化数据、半结构化数据、非结构化数据3大类。下面我们分别按照这三种分类方式来详细描述推荐系统所依赖的数据及这些数据的特点。
1
根据数据来源来划分
根据数据来源的触点来分,推荐系统依赖的数据分为用户行为数据、用户属性数据、标的物(物品)属性数据、上下文数据4大类,见下面图2,下面我们分别介绍各类数据及其特点。
图2:推荐系统依赖的4类数据源
1.1
(用户)行为数据
就是用户在产品上的各种操作,比如浏览、点击、播放、购买、搜索、收藏、点赞、转发、加购物车、甚至滑动、在某个位置的停留时长、快进等等一切操作行为。用户在产品上的操作行为为我们了解用户提供了“蛛丝马迹”,用户的操作行为也是用户最真实意图的反馈,这些行为反应了用户的兴趣状态,通过分析用户行为,我们可以获得对用户的兴趣偏好的深刻洞察。
根据用户的行为是否直接表明用户对标的物的兴趣偏好,用户行为一般分为显式行为和隐式行为。显式行为是直接表明用户兴趣的行为,比如点赞、评分等。隐式行为虽不是直接表示用户的兴趣,但是该行为可以间接反馈用户的兴趣变化,只要不是用户直接评分、点赞的操作行为都算隐式反馈,包括浏览、点击、播放、收藏、评论、转发等等。
用户行为数据是最重要、最容易收集、数据量最多的一类数据,在构建推荐系统算法中起着举住轻重的作用。这类数据往往种类繁多,需要我们进行收集、预处理才能最终被推荐算法使用。
1.2
用户属性数据
用户属性数据也叫做用户人口统计学数据,就是用户自身所带的属性,比如年龄、性别、地域、学历、家庭组成、职业等等。这些数据一般是稳定不变(如性别)或者缓慢变化(如年龄)的。
人类是一个社会化物种,用户的不同属性决定了用户处在不同的阶层或者生活圈,不同的阶层或生活圈又有不同的行为特征、生活方式、偏好特点,在同一圈层具备一定的相似性,这种相似性为我们做个性化推荐提供了一定的保证。
1.3
标的物属性数据
推荐系统中最重要的一个“参与方”是待推荐的标的物(物品),物品自身是包含很多特征和属性的。对于视频来说,出品方、导演、演职员、主演、国别、年代、语言、是否获奖、剧情、海报图等等都是视频的元数据。对于电商商品来说,品类、用途、价格、产地、品牌等等也是非常重要的属性。
通过用户对物品的操作行为,我们可以将物品所具备的特征按照某种权重赋予用户,这些特征就构建了用户的兴趣偏好,相当于给用户打上了相关的标签(比如喜欢看“恐怖片”的人)。从这些兴趣偏好出发,我们又可以给用户进行个性化推荐。
1.4
上下文数据
上下文数据是用户在对物品进行操作时所处的环境特征及状态的总称,比如用户所在地理位置、当时的时间、当时的天气、用户当时的心情、用户所在产品的路径等等。这些上下文数据对用户的决策是非常重要的、甚至是起决定作用的。比如,美团饿了么这类基于地理位置服务的产品,给用户推荐餐厅是一定要是在用户所在位置或者用户指定位置附近的。
合适地使用上下文数据,将该类数据整合到推荐算法中,可以更加精准、场景化地为用户进行个性化推荐。
2
根据数据载体来划分
随着互联网的发展,网络上传输、交换、展示的数据种类越来越多样化,从最初的数字、文本到图片再到现在主流的音视频,基于这些数据载体的不同,推荐系统建模依赖的数据也可以分为4类,见下面图3。
图3:推荐系统依赖的4种数据载体
2.1
数值类数据
所有推荐系统用到的、可以用数值来表示的数据都属于这一类,比如用户年龄、用户评分、物品价格、播放次数等等。数值数据也是计算机最容易处理的一类数据,其他类型的数据要想很好地被计算机处理,一般也会利用各种方法转化为数值数据。
2.2
文本数据
文本数据是互联网中数量最多的、最普遍的一类数据,标的物的类别、标的物的描述信息、甚至整个标的物可能都是文本(如新闻等)、用户地域、用户性别等等都是用文本来描述的。如果某个特征可以取的所有值是有限的(比如性别只有男女两种),也可以非常容易地转化为数值类数据。处理文本类数据需要借助自然语言处理相关技术。
2.3
图片数据
随着智能手机摄像头技术的成熟以及相关图像应用的爆发增长,媒体及投资人的推波助澜,图片数据是互联网上的主流数据类型,商品的海报图、电影的缩略图等等都以图片的形式存在。
对于图片类数据的处理,目前的深度学习技术相对成熟,包括图片的分类、图片的特征提取等等,精度已经到达了产品可用的成熟度,在某些方面(如图片分类)甚至超越了人类专家的水平。
2.4
音视频数据
在互联网视频出现以来就有了音视频数据,直到现在音视频数据才应用到更多的领域和产品中,音视频数据火爆背景跟图片类似,目前的抖音、快手等短视频应用非常受欢迎,游戏直播、电商导购直播等应用也是视频类数据的产出方。音乐的数字化,各类音频学习软件(如樊登读书、蜻蜓FM等)也促进了音频数据的增长。
音视频数据的价值密度小,占用空间多,处理相对复杂,在深度学习时代,这些复杂数据的处理也变得可行了。音频数据可以通过语音识别转换为文字,最终归结为文本数据的处理,视频数据可以通过抽帧转换为图片数据来处理。
图片、音视频数据属于富媒体数据,随着传感器种类的丰富、精度的增强(比如拍照能力越来越强)、相关网络应用的繁荣(如抖音、快手等都是基于富媒体数据的应用),网络上出现了越来越多的富媒体数据,并且占据了互联网数据整体的绝大多数,因此是非常重要的一类数据。
3
根据数据组织形式来划分
按照数据组织形式不同,不同类型的数据处理起来难易程度是不一样的,人类是比较善于理解和处理二维表格类数据的,这就是为什么关系型数据库(主要是处理表格类数据)在计算机发展史上具有举足轻重地位的原因。随着互联网的发展,数据形式越发丰富,不是所有数据都是结构化的,有些数据是半结构化甚至是无结构化的(具体见下面图4),下面分别对这三类数据加以说明。
图4:推荐系统依赖的三种数据组织形式
3.1
结构化数据
所谓结构化数据就是可以用关系型数据库中的一张表来存储的数据,每一列代表一个属性/特征,每一行就是一个数据样本。一般用户属性数据和物品属性数据都可以用一张表来存储,用户和物品的每一个属性都是表的一个字段,因此是结构化数据。下表就是视频的结构化表示。
视频名 |
出品年代 |
导演 |
主演 |
影片地区 |
语言 |
片长 |
我和我的祖国 |
2019 |
陈凯歌、张一白、管虎、徐峥、宁浩等 |
黄渤,张译,吴京等 |
大陆 |
普通话 |
158分钟 |
海洋之歌 |
2014 |
汤姆·摩尔 |
布莱丹·格里森,菲奥纽拉·弗拉纳根,帕特·绍特,戴维·罗尔,莉萨·汉尼根,乔恩·肯尼 |
爱尔兰 |
英语、爱尔兰语 |
93分钟 |
摔跤吧!爸爸 |
2016 |
尼特什·提瓦瑞 |
阿米尔·汗,萨卡诗·泰瓦,桑亚·玛荷塔,法缇玛·萨那·纱卡 |
印度 |
北印度语 |
161分钟 |
表1:视频属性数据的结构化表示
结构化数据是一类具备Schema的数据,也就是每一列数据的类型、值的长度或者范围是确定的,一般可以用关系型数据,如MySQL、ProgreSQL等来存储,这类数据可以用非常成熟的SQL语言来进行查询处理。
3.2
半结构化数据
半结构化数据虽不符合关系型数据库这么严格的结构,但数据组织是有一定规律或者规范的,利用特殊的标记或者规则来分隔语义元素以及对记录和字段进行分层。因此,也被称为自描述的结构。常见的XML或者Json类数据就属于这一种。
对于用户在产品上的操作行为,我们一般按照一定的规则来对相关字段进行记录(比如可以用Json格式来记录日志,或者按照规定的分割字符来分割不同字段,再拼接起来记录日志),这类数据也属于半结构化数据,一些半结构化数据通过一定的预处理是可以转化为结构化数据的。
3.3
非结构化数据
非结构化数据,是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表示的数据,也没有半结构化数据这种有一定的规律或者规范。包括文本、图片、HTML、各类数据报表、图像和音视频信息等等。非结构化数据由于没有固定的数据范式,也是最难处理的一类数据。
文本类标的物(如新闻资讯)、短视频、音频、商品等都包含大量的非结构化数据。即使是非结构化的标的物,我们可以从几个已知的属性来构建对标的物的描述,从而形成对标的物结构化的描述,如上面表1中就是针对视频从多个维度来构建结构化数据。
随着移动互联网、物联网的发展,各类传感器日益丰富,功能多样,人际交往也更加密切,人们更愿意表达自我,人类的社交和生产活动产生了非常多的非结构化数据,非结构化数据量成几何级数增长。怎么很好地处理非结构化数据,将非结构化数据中包含的丰富信息挖掘出来,并应于算法模型中,是可以大大提升推荐算法的精准度、转化率等用户体验、商业化指标的。随着NLP、深度学习等AI技术的发展与成熟,我们现在有更多的工具和方法来处理非结构化数据了,推荐系统也享受了这一波技术红利,在这些新技术的加持下,效果越来越好。
上面从3个不同的分类角度来介绍了推荐系统的数据源,那么我们怎么利用这些数据源,将这些数据处理为推荐算法可以使用的原材料呢?这就需要数据处理与特征工程相关知识,我们在下一节进行详细介绍。
三、数据处理与特征工程简介
在本节我们来详细介绍推荐系统依赖的数据是怎么产生的、我们怎么转运、怎么存储这些数据,最终通过ETL和特征工程加工成推荐算法可以直接使用的数据,我们分数据生成、数据预处理、特征工程三个部分来介绍。
1
数据生成
下面我们根据行为数据、用户属性数据、标的物属性数据、上下文数据4类数据来分别说明数据生成过程。
1.1
行为数据
对于用户行为数据,我们事先定义收集的日志格式,当用户在产品上进行各种操作时,客户端(APP或者网页)按照日志规范记录用户行为(俗称日志埋点),并将用户行为上报到云端数据中心,这即获得了用户行为数据。
用户在什么时间点、进行什么操作需要进行日志埋点取决于具体的业务场景、交互形式以及具体的数据分析需求。一般来说,用户触点多的路径、对用户体验有比较大影响的功能点、涉及到商业价值的功能点是需要进行日志埋点的,因为这些数据对产品的迭代与发展非常关键,是非常有价值的数据。上传更多的数据需要定义更多的日志规范并进行埋点,还需要进行收集、处理、存储,因此会占用更多的人力、算力、存储资源,但是可以让我们从更多的维度进行分析,所以是有一定价值的,《大数据时代》的作者维克托•迈尔-舍恩伯格博士认为数据收集越多越好,我们在实际工作中也是按照这个思路进行收集的,尽量收集用户的所有行为,但是发现很多日志事后是没有时间、精力去分析的,甚至没有业务方有这方面的分析需求,因此,个人建议尽量收集前面提到的核心数据,其他数据在真的确定需要的时候再去埋点分析。
行为数据的上传、收集需要考虑很多现实中的特殊问题,需要保证数据上传的有效性、正确性、不重复性,对于在网络不稳定或者出现软件故障时,需要进行数据重试与补传。同时数据上传需要有很多策略,比如按照固定条数上传、固定一段时间上传、每产生一条数据就立即上传等,也需要对数据进行加密,避免网络恶意攻击或者脏数据的引入。
1.2
用户属性数据
一般用户地域是可以借助用户的IP地址轻易获取得到的,而其他用户属性是很难收集到的,特别是现在数据安全性越来越受到法律的保护,个人风险意识也逐渐增强,收集用户信息是更加困难的事情。安全有效地收集用户属性数据一般可以有如下方法:
a 产品在用户刚注册时,提供用户输入相关信息的界面,让用户主动输入相关信息,但是一般用户是比较懒的,所以输入的信息一定是比例非常少的,过多增加这种让用户操作的步骤,在增加用户使用成本的同时,也增加了用户放弃你的产品的概率;
b 通过各种运营活动,让用户填写相关信息参与活动,从而获得相关信息;
c 通过用户在产品上的行为或者聊天记录,根据机器学习算法来推断用户的熟悉,比如根据用户购买行为推断用户的性别、年龄等;
d 有些具备金融牌照、游戏牌照的产品,可以要求用户填写身份证等敏感信息,从而获得用户更多的信息;
e 某些公司有多个产品(比如阿里的支付宝、淘宝、饿了么等),可以通过产品之间的打通,获得用户更多的属性信息;
f 通过合规的第三方数据交换来获得自己产品缺失而第三方具备的属性信息;
用户属性信息对构建优秀的推荐系统是非常重要的一类信息,这类信息企业需要保管好,避免泄露出去造成重大事故。
1.3
标的物属性数据
物品属性数据的获取相比用户属性数据容易一些,物品的生产方/提供方一般是具备一定的物品属性数据的,比如视频在制作时包含基本属性数据,视频版权被视频网站购入时,自然就附带了这些属性,淘宝上的卖主在上架商品时也会按照淘宝制定的类目等属性要求填充相关数据。还有一些标的物,如新闻资讯,是从第三方利用爬虫技术爬过来的,在爬的过程中也可以将属性数据爬过来,一并注入到自己的媒资库中。
对于标的物数量不大、单位时间产出不多的标的物(如电影),还可以利用编辑团队或者外包人工填充相关数据。对于数量较大、单位时间产量多的标的物(如新闻),可以借助NLP等机器学习技术生成相关属性数据。
1.4
上下文数据
上下文数据一般是动态变化的,是用户在某个场景下的特定时间点、特定位置所产生的数据,所以一般是实时获得的,也一般应用于实时推荐系统中。
上面对数据产生及收集相关的知识点做了简单介绍,关于数据收集更深入的介绍,可以参考《大数据分析工程师入门15-数据收集》这篇文章进行深入学习和了解(点击红色字体查看文章,后面类似,不再说明)。
2
数据预处理
数据预处理一般称为ETL(Extract-Transform-Load),用来描述数据从生产源到最终存储之间的一系列处理过程,一般经过抽提、转换、加载3个阶段。 目的是将企业中的分散、零乱、标准不统一的数据整合到一起,将非结构化或者半结构化的数据处理为后续业务可以方便处理使用的结构化数据,为企业的数据驱动、数据决策提供数据基础。数据基础设施完善的企业一般会构建层次化的数据仓库系统,数据预处理的最终目的也是将杂乱的数据结构化、层次化、有序化,最终进入数据仓库。对于推荐系统来说,通数ETL将数据处理成具备特殊结构(可能是结构化的)的数据,方便进行特征工程,最终供推荐算法学习和训练之用。下面分别对ETL三个阶段的作用进行简单介绍。
2.1
抽提(Extract)
这一阶段的主要目的是将企业中分散的数据聚合起来,方便后续进行统一处理,对于推荐系统来说,依赖的数据源多种多样,因此是非常有必要将所有这些算法依赖的数据聚合起来的。推荐系统的数据源比较多样,不同的数据抽取的方式不一样,下面分别简单介绍。
用户行为数据一般通过在客户端埋点,通过http协议上传到日志收集web服务(如Nginx服务器),中间可能会通过域名分流或者LB负载均衡服务来增加日志收集的容错性、可拓展性。日志一般通过离线和实时两条流进行处理,离线通过ETL进入数仓,实时流通过Kafka等消息队列被实时处理程序(如Spark Streaming)处理或者进入HBase、ElasticSearch等实时存储供后面的业务查询。整个用户行为日志的收集过程见下面图5。
图5:用户行为日志收集流程(右上角进入DW的属于离线数据,右下角经过Kafka的属于实时流)
对于用户属性数据、物品属性数据一般是存放在关系型数据库中的,实时性要求不高的推荐业务可以采用数据表快照进行抽取,对实时性有要求的信息流推荐可以采用binlog实时同步或者消息队列的方式抽取。
上下文相关数据一般是描述用户当前状态的数据,一般是通过各种传感器收集的,这类数据也生成于客户端。通过上面图5右下角的实时日志收集系统进入消息队列,供后端的实时统计(如时间序列数据库、ES进行存储进而查询展示)或者算法(通过Spark Streaming或者Flink)进行处理。
2.2
转换(Transform)
这个阶段是ETL的核心环节,也是最复杂的一环。它的主要目标是将抽取到的各种数据,进行数据的清洗、格式的转换、缺失值填补、剔除重复等操作,最终得到一份格式统一、高度结构化、数据质量高、兼容性好的数据,供推荐算法的特征工程处理。
清洗过程包括剔除掉脏数据、对数据合法性进行校验、剔除无效字段、字段格式检查等过程。格式转换是根据推荐算法对数据的定义和要求将不同来源的同一类数据转为相同的格式,使之统一规范化的过程。由于日志打点存在的问题或者数据收集过程中存在的各种问题(比如用户一般不会填写完整的数据),真实业务场景中,字段值缺失是一定存在的,缺失值填补可以根据平均数或者众数进行填补或者利用算法来学习填充。由于网络原因日志一般会有重传策略,导致重复数据,剔除重复就是将重复的数据从中剔除,从而提升数据质量,以免影响最终推荐算法的效果(如果一个人有更多的数据,那么在推荐算法训练过程中,相当于他就有更多的投票权,模型学习会向他的兴趣倾斜,导致泛化能力下降)。
数据转换的过程算是广义的特征工程中的一部分,这里介绍的处理过程可能部分会跟下面特征工程部分的介绍有一定重复,我们在特征工程章节会更加细致介绍。
2.3
加载(Load)
这部分的主要目标是把数据加载至最终的存储,比如数据仓库、关系型数据库、key-value型NoSQL中等。对于离线的推荐系统,训练数据放到数仓中,属性数据存放到关系型数据库中。
用户行为数据通过数据预处理一般可以转化为结构化数据或者半结构化数据,行为数据是最容易获得的一类数据,也是数据量最大的一类数据,这类数据一般存放在分布式文件系统中,原始数据一般放到HDFS中,通过处理后的数据一般会根据业务需要构建层次化的数据模型。
所有行为数据都会统一存放到企业的数据仓库中,离线数据基于Hive等构建数仓,而实时数据基于HBase等构建数仓,最终形成统一的数据服务,供上层的业务方使用。
某些数据,比如通过特征工程转化为具体特征的数据,这类数据可能需要实时获取、实时更新,一般可以存放在HBase或者Redis等NoSQL中。
用户属性数据一般属于关系型数据,这类数据比较适合存放在关系型数据库(如MySQL)中。物品属性数据一般属于关系型数据,也存放在关系型数据库中。对于图片、音视频这类比较复杂的数据,一般适合存放在对象存储中。
关于数据预处理相关知识点可以参考《大数据分析工程师入门14-数据分析架构 》和《大数据分析工程师入门16-ETL工程》这两篇篇文章,进行更深入的学习和了解,本文不做过多讲解。
3
特征工程
特征(Feature)是建立在原始数据之上的特定表示,它是一个单独的可度量属性,通常用结构化数据集中的一列表示。对于一个通用的二维数据集,每个观测值由一行表示,每个特征由一列表示,对于每一个观测具有一个特定的值。下面图6就是用户基本属性表,其中每一列就是一个特征,其中年龄、身高、体重是数值的,是数值特征,数值特征也叫做连续特征,而性别是用文本描述的,并且只有男女两种取值,是离散特征。
图6:用户属性特征
通过上面的简单介绍,我们知道了什么是特征,知道有连续特征和离散特征,那么特征具体怎么分类呢?一般从特征的取值类型可以分为5类:
(1) 离散特征
离散特征一般分为类别特征和有序特征,类别之间是无序关系的, 比如性别,有序特征之间是有序关系的,比如收入的低、中、高三个等级,之间是有序的。
(2) 连续(数值)特征
能够用实数或者整数等数值度量的特征就是连续特征,比如身高、通过算法获得的嵌入特征等都属于连续特征。
(3) 时空特征
在某些模型中时间是非常重要的特征,时间一般是相对的,具有周期性。对基于地理位置的服务,位置是非常重要的特征,位置也可能跟用户的行为有关(如东北地区的喜欢看二人转),地理位置可以用行政区划的层级关系表示,也可以用相对距离来表示。
(4) 文本特征
文本是非常重要的一类数据,我们可以从文本中抽提特征,比如利用TF-IDF等获得的特征,文本特征一般可以通过转化为向量来表示。
(5) 富媒体特征
包括从图片、视频、音频、HTML、甚至程序语言等富媒体中抽提的特征,这些特征也一般用数值向量来表示。
从特征的可解释性来分类,可以分为显式特征和隐式特征:
(1) 显示特征
显示特征是具有实际意义的特征,人们可以理解,可以用语言来说明和解释。类别、数值、时空、TF-IDF、LDA等特征都属于这一类。
(2) 隐式特征
隐式特征是不具备实际意义,难于在现实中找到对应的特征,一般通过算法生成的嵌入特征都属于这一类,如word2vec、矩阵分解等模型生成的嵌入特征。
讲完了什么是特征,特征的两种分类方法及对应不同特征的介绍,那么大家肯定会关心特征是怎么生成的,有什么方法和技巧,这就是特征工程要解决的问题。
特征工程(Feature Engineering)是将原始数据转化为特征的过程,这些特征可以很好地测量或者描述输入输出之间的内在关系,通过这些特征来构建数学模型,从而提高模型对未知数据预测的准确性。特征工程在整个算法模型生命周期中所处的阶段见下面图7。
图7:特征工程在算法建模中所处的阶段
特征工程在整个机器学习流程中是非常重要的一环,有很多枯燥、繁杂的工作需要处理,看起来不那么高大上,并且很多特征工程的技巧是需要经验积累的,也是领域相关的(不同领域有自己的一套做特征工程的独特的方法和思路)。特征工程的质量往往直接决定了机器学习的最终效果,在机器学习圈有一句很出名的话很好地说出了特征工程的价值,这句话大致意思是“特征工程的好坏决定了机器学习能力的上限,而算法和模型只是无限逼近这个上限”。
特征工程是一个比较花费人力的工作,虽然跟问题和领域相关,但是有一般的方法思路可供参考,下面简单介绍一下特征工程的一般流程和步骤,以及相关的方法与技巧。
3.1
特征预处理
在真实业务场景中,数据一般会存在各种各样的问题,不是直接可以用于构建特征,在构建特征之前需要对数据进行适当的处理,下面讲解一些常见的数据问题及预处理方法:
a 缺失值处理
实际上我们收集到的很多数据是存在缺失值的,比如某个视频缺少总时长,对于用户属性数据来说,很多用户可能也不会填写完备的信息。一般缺失值可以用均值、中位数、众数等填充,或者直接将缺失值当做一个特定的值来对待。还可以利用一些复杂的插值方法,如样条插值等来填充缺失值。
b 归一化
不同特征之间由于量纲不一样,数值可能相差很大,直接将这些差别极大的特征灌入模型,会导致数值小的特征根本不起作用,一般我们要对数值特征进行归一化处理,常用的归一化方法有min-max归一化、分位数归一化、正态分布归一化、行归一化等。下面分别简单介绍。
min-max归一化是通过求得该特征样本的最大值和最小值,采用如下公式来进行归一化,归一化后所有值分布在0-1之间。
分位数归一化,是将该特征所有的值从小到大排序,假设一共有N个样本,某个值x排在第k位,那么我们用下式来表示x的新值。
正态分布归一化,是通过求出该特征所有样本值的均值 和标准差 ,再采用下式来进行归一化。
行归一化,就是采用某种范数(比如L2范数),让整行的范数为1,假设该列特征所在的列向量为 ,那么基于L2范数的行归一化的公式如下:
c 异常值与数值截断
对于数值型特征,可能会存在异常值,包括异常大和异常小的值。在统计数据处理中有所谓3σ准则,即对于服从正态分布的随机变量,该变量的数值分布在(μ-3σ,μ+3σ)中的概率为0.9974,这时可以将超出该范围的值看成异常值,采用向上截断(用μ-3σ)和向下截断(用μ+3σ)的方法来为异常值赋予新的值。对于真实业务场景,可能还要根据特征变量的实际意义来进行处理,在我们做视频推荐过程中,经常会发现日志中视频的总时长是一个非常非常大的值(可能是在日志埋点时将时间戳混杂到时长中了),我们一般会用户180分钟来截断电影的总时长,用45分钟来截断电视剧单集的总时长。
如果异常值所占样本比例非常小,也可以直接将包含异常值的样本剔除掉,但是有很多真实业务场景利用非常多的特征,虽然每个特征异常值很少,但是如果特征总数很多的话,包含异常值的样本(只要包含某一个异常值的都算异常样本)总数可能是非常大的,所以直接丢弃的方法有时是不合适的。
d 非线性变换
有时某个属性不同值之间差别较大(比如年收入),有时为了让模型具备更多的非线性能力(特别是对于线性模型),这两种情况下都需要对特征进行非线性变换,比如值取对数(值都是正的情况下)作为最终的特征,也可以采用多项式、高斯变换、logistic变换等转化为非线性特征。上面提到的分位数归一化、正态分布归一化其实都是非线性变换。
3.2
特征构建
所谓特征构建是从原始数据中提取特征,将原始数据空间映射到新的特征向量空间,使得在新的特征空间中,模型能够更好地学习数据中的规律。下面我们分别对前面提到的离散(类别)特征、连续(数值)特征、时空特征、文本特征、富媒体特征等5类非常重要的特征来介绍怎么从原始数据构建相关的特征。随着Word2Vec及深度学习技术在推荐系统中的大规模应用,嵌入方法越来越受到欢迎,我们也会单独讲一下嵌入特征,文本、富媒体一般可以转化为嵌入特征。
a 离散特征
离散特征是非常常见的一类特征,用户属性数据、标的物属性数据中就包含大量的类别特征,如性别、学历、视频的类型、标签、导演、国别等等。对于离散特征,一般可以采用如下几种方式对特征进行编码。
1) one-hot编码
one-hot编码通常用于类别特征,如果某个类别特征有k类,我们将这k类固定一个序关系(随便什么序关系都无所谓,只是方便确认某个类在哪个位置),我们可以将每个值映射为一个k维向量,其中这个值所在的分量为1,其他分量为0。该方法当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用 PCA 等方法进行降维。
对于标签这种类别特征,可能每个视频有多个标签,这时one-hot编码可以拓展为n-hot编码,就是该视频在它包含的所有标签对应的分量为1,其他为0。
2) 散列编码
对于有些取值特别多的类别特征(比如视频标签,可以有几万个),使用one-hot编码得到的特征矩阵非常稀疏,如果再进行特征交叉,会使得特征维度爆炸式增长。特征散列的目标就是是把原始的高维特征向量压缩成较低维特征向量,且尽量不损失原始特征的表达能力,其优势在于实现简单,所需额外计算量小。降低特征维度,也能加速算法训练与预测,降低内存消耗,但代价是通过哈希转换后学习到的模型变得很难检验(因为一般哈希函数是不可逆的),我们很难对训练出的模型参数做出合理解释。特征散列的另一个问题是可能把多个原始特征哈希到相同的位置上,出现哈希冲突现象,但经验表明这种冲突对算法的精度影响很小,通过选择合适的hash函数也可以减少冲突概率。
3) 计数编码
就是将所有样本中该类别出现的次数或者频次作为该值的编码,这类方法对异常值比较敏感(拿电影的标签来说,很多电影包含“剧情”这个标签,计数编码会让剧情的编码值非常大),也容易产生冲突(两个不同类别的编码一样,特别是对于出现很稀少的标签,编码值一样的概率非常大)。
4) 离散特征之间交叉
就是类别特征之间通过笛卡尔积(或者笛卡尔积的一个子集)生成新的特征,通过特征交叉有时可以捕捉细致的信息,对模型预测起到很重要的作用。这里举个例子,比如用用户地域与视频语言做交叉,大家肯定知道广东人一般更喜欢看粤语剧,那么这个交叉特征对预测粤语视频的点击是非常有帮助的。类别交叉一般需要对业务有较好的理解,需要足够多的领域知识,才可以构建好的交叉特征。
上面讲的是2个类别特征的交叉,当然还可以做3个、4个、甚至更多类别特征的交叉,两个类别交叉最多可以产生这两个类别基数的乘积这么多的新特征,所以交叉让模型的维数爆炸性增长,增加了模型训练的难度。同时,更多的特征需要更多的样本来支撑,否则极容易过拟合。对于样本量不够多的场景,不建议采用超出2个类别的交叉,也不建议用2个基数特别大的类别进行特征交叉。
5) 离散特征与连续特征交叉
跟上面4)中讲的类似,我们也可以进行类别特征与数值特征之间的交叉,只不过这种交叉一般是统计某个类别具体值对应的数值特征的统计量(次数、和、均值、最值、方差等等)。拿电影的语言和用户的年龄两个特征交叉来说,我们可以分别统计看过语言是中文、英语等的电影中用户的平均年龄,根据大家的经验,我们知道年轻人受教育程度高,英语会更好,所以看过英语电影的人的平均年龄比看中文的平均年龄低。这类特征的交叉也需要基于具体业务场景及领域知识来做,否则获得的交叉特征可能无效,甚至给模型引入噪音。
对于有序离散特征,我们可以用0、1、2、... 等自然数来为他们编码,自然数的大小关系保证了它们之间的序关系。
b 连续(数值)特征
连续型数据是机器学习算法直接可以使用的数据,对于连续型数据,我们一般可以通过如下几种方式来构建特征:
1) 直接使用
机器学习算法是可以直接处理数值特征的,数值特征可能经过上面一节讲的特征预处理中的部分步骤再灌给模型使用。
2) 离散化
有时连续特征需要进行离散化处理,比如视频在一段时间内的播放量对于视频点击CTR预估可能是一个重要的特征,因为播放次数跟视频的热度有很强的相关性,但是如果不同视频的播放次数的数量级相差巨大(实际情况确实是这样,热门视频比冷门视频播放量大若干个数量级),该特征就很难起作用(比如 LR 模型,模型往往只对比较大的特征值敏感)。对于这种情况,通常的解决方法是进行分桶。分桶操作可以看作是对数值变量的离散化,之后再进行 one-hot 编码。
分桶的数量和宽度可以根据业务知识和经验来确定,一般有三种分桶方式:(1)等距分桶,每个桶的长度是固定的,这种方式适用于样本分布比较均匀的情况;(2)等频分桶,即每个桶里样本量一样多,但也会出现特征值差异非常大的样本被放在一个桶中的情况;(3)模型分桶,使用模型找到最佳分桶,例如利用聚类的方式将特征分成多个类别,或者利用树模型,这种非线性模型天生具有对连续型特征切分的能力,利用特征分割点进行离散化。
分桶是离散化的常用方法,连续特征离散化是有一定价值的:离散化之后得到的稀疏向量,运算速度更快,计算结果易于存储。离散化之后的特征对于异常值也具有更强的鲁棒性。需要注意的是:1)每个桶内都有足够多的样本,否则不具有统计意义;2)每个桶内的样本尽量分布均匀。
3) 特征交叉
对于连续特征x、y,通过非线性函数f的作用,我们将z=f(x,y)作为交叉特征,一般f可以是多项式函数,最常用的交叉函数是f=xy,即两个特征对应的值直接相乘。通过特征交叉可以为模块提供更多的非线性,可以更细致地拟合输入输出之间的复杂关系,但非线性交叉让模型计算处理变得更加困难。
c 时空特征
时间和地理位置也是两类非常重要的特征,下面分别来说明怎么将它们转化为模型特征。
对于时间来说,一般有如下几种转换为特征的方式:
1) 转化为数值
比如将时间转化为从某个基准时间开始到该时间经历的秒数、天数、月数、年数等。用更大的单位相当于对小单位四舍五入(比如用到当前时间经历的年数,那么不足一年的时间都忽略了)。
2) 将时间离散化
比如我们可以根据当前时间是不是节假日,将时间离散化为0-1二值(1是假日,0是工作日)。再比如如果我们构建的模型是与周期性相关的,我们可能只需要取时间中的周几这个量,那么时间就可以离散化为0-6七个数字(0代表星期天,1代表星期一,如此类推)。
对于地理位置来说,我们有行政区划表示,还有经纬度表示,以及到某个固定点的距离等表示方式,下面分别说明。
1) 行政区划表示
典型的是用户所在地区,因为地区是固定的,数量也是有限的,这时地理位置就转化为离散特征了。
2) 经纬度表示
地理位置也可以用经纬度表示,这时每个位置就转化为一个2维向量了(一个分量是经度,另一个分量是纬度)。
3) 距离表示
对于像美团、滴滴这类基于LBS服务的产品,一般用商家或者司机到用户的距离来表示位置,这时地理位置就转化为一个一维的数值了。
d 文本特征
对于文本一般可以用NLP相关技术进行相关处理转化为数值特征。对于新闻资讯等文档,可以采用TF-IDF、LDA等将每篇文档转化为一个高维的向量表示。或者基于Word2Vec等相关技术将整篇文档嵌入(doc2vec)到一个低维的稠密向量空间。
e 富媒体特征
对于图片、音频、视频等富媒体,一般也可以基于相关领域的技术获得对应的向量表示,这种向量表示就可以作为富媒体的特征了。这里不细介绍,感兴趣的读者可以自行搜素学习。
f 嵌入特征
上面文本、富媒体中提到的嵌入技术是非常重要的一类提取特征的技术,所谓嵌入,就是将高维空间的向量投影到低维空间,降低数据的稀疏性,减少维数灾难,同时提升数据表达的鲁棒性。随着Word2Vec及深度学习技术的流行,嵌入特征越来越重要。
标的物嵌入分为基于内容的嵌入和基于行为的嵌入。前者使用标的物属性信息(如视频的标题、标签、演职员、海报图,视频、音频等信息),通过 NLP、CV、深度学习等技术生成嵌入向量,后者是基于用户与标的物的交互行为数据生成嵌入,拿视频来举例,用户在一段时间中前后点击的视频存在一定的相似性,通常会表现出对某类型视频的兴趣偏好,可能是同一个风格类别,或者是相似的话题等,因此我们将一段时间内用户点击的视频 id 序列作为训练数据(id可以类比word,这个序列类比为一篇文档),使用 skip-gram 模型学习视频的嵌入特征。由于用户点击行为具有相关关系,因此得到的嵌入特征有很好的聚类效果,使得在特征空间中,同类目的视频聚集在一起,相似类目的视频在空间中距离相近。在电视猫的相似视频推荐中,我们就是采用这种嵌入,并且聚类,将同一类别中的其他视频作为相关推荐的,效果还是非常好的。
对于用户嵌入,我们也可以有很多方法,下面是两种比较基础的方法。
可以将一段时间内用户点击过的视频的平均嵌入特征向量作为该用户的嵌入特征,这里的“平均”可以是简单的算术平均,可以是element-wise max,也可以是根据视频的热度和时间属性等进行加权平均或者尝试用 RNN 替换掉平均操作。我们可以通过选择时间周期的长短来刻画用户的长期兴趣嵌入和短期兴趣嵌入。
另外参考YouTube推荐系统(见参考文献6)的思路,我们可以把推荐问题等价为一个多类别分类问题,使用 softmax 损失函数学习一个 DNN 模型,最终预测在某一时刻某一上下文信息下用户观看的下一个视频的类别,最后把训练好的 DNN 模型最后一层隐含层输出作为用户的嵌入(参考《深度学习在推荐系统中的应用》这篇文章第三节1中的介绍)。
3.3
特征选择
特征选择是指从所有构建的特征中选择出一个子集,用于模型训练与学习的过程。特征选择不光要评估特征本身,更需要评估特征与模型的匹配度,评估特征对最终的预测目标的精准度的贡献。特征没有最好的,只有跟应用场景和模型合适的,特征选择对于构建机器学习应用是非常重要的一环。特征选择主要有以下两个目的:
简化模型,节省存储和计算开销,让模型更易于理解和使用;
减少特征数量、降维,改善通用性、降低过拟合的风险。
知道了什么是特征选择以及特征选择的价值,下面我们提供进行特征选择的具体方法,主要有基于统计量的方法和基于模型的方法。
a 基于统计量选择
基于统计量选择主要有如下几种方式,我们分别介绍:
1)选择方差大的特征
方差反应了特征样本的分布情况,我们可以分析特征的数据分布,分布均匀的特征,样本之间差别不大,该特征不能很好区分不同样本,而分布不均匀的特征,样本之间有极大的区分度,因此通常可以选择方差较大的特征,去掉方差变化小的特征。具体方差多大算大,可以事先计算出所有特征的方差,选择一定比例(比如20%)的方差大的特征,或者可以设定一个阈值,选择方差大于阈值的特征。
2)皮尔逊相关系数
皮尔森相关系数是一种简单的,能帮助理解特征和目标变量之间关系的方法,用于衡量变量之间的线性相关性,取值区间为[-1,1],-1 表示完全的负相关,+1 表示完全的正相关,0 表示没有线性关系。通过分析特征与目标之间的相关性,优先选择与目标相关性高的特征。如果两个特征之间线性相关度的绝对值大,说明这两个特征是有很强的相关关系的,我们没必要都选择,只需要选择其中一个即可。
3)覆盖率
特征的覆盖率是指训练样本中有多大比例的样本具备该特征。我们首先计算每个特征的覆盖率,覆盖率很小的特征对模型的预测效果作用不大,可以剔除。
4)假设检验
假设特征变量和目标变量之间相互独立,选择适当检验方法计算统计量,然后根据统计量做出统计推断。例如对于特征变量为类别变量而目标变量为连续数值变量的情况,可以使用方差分析,对于特征变量和目标变量都为连续数值变量的情况,可以使用皮尔森卡方检验。卡方统计量取值越大,特征相关性越高。
5)互信息
在概率论和信息论中,互信息用来度量两个变量之间的相关性。互信息越大则表明两个变量相关性越高,互信息为 0 时,两个变量相互独立。因此可以根据特征变量和目标变量之间的互信息来选择互信息大的特征。
b 基于模型选择
基于模型的特征选择,可以直接根据模型参数来选择,也可用子集选择的思路选出特征的最优组合。
1) 基于模型参数
对于线性模型,可以直接基于模型系数大小来决定特征的重要程度。对于树模型,如决策树、梯度提升树、随机森林等,每一颗树的生成过程,都对应了一个特征选择的过程,在每次选择分类节点时,都会选择最佳分类特征来进行切分,重要的特征更有可能出现在树生成早期的节点,作为分裂节点的次数也越多。因此,可以基于树模型中特征出现次数等指标对特征重要性进行排序。如果我们想要得到稀疏特征或者说是对特征进行降维,可以在模型上主动使用正则化技术。使用L1正则,调整正则项的权重,基本可以得到任意维度的稀疏特征。
2) 子集选择
基于模型,我们也可以用子集选择的思路来选取特征。常见的有前向搜索和反向搜索两种思路。如果我们先从N个特征中选出一个最好的特征,然后让其余的N-1个特征分别与第一次选出的特征进行组合,从N-1个二元特征组合中选出最优组合,然后在上次的基础上,添加另一个新的特征,考虑3个特征的组合,依次类推,这种方法叫做前向搜索。反之,如果我们的目标是每次从已有特征中去掉一个特征,并从这些组合中选出最优组合,这种方法就是反向搜索。如果特征数量较多、模型复杂,那么这种选择的过程是非常耗时间和资源的。我们在后面讲到的自动特征工程中会提到通过算法自动选特征的技术方案。
3.4
特征评估
所谓特征评估是在将特征灌入模型进行训练之前,事先评估特征的价值,提前发现可能存在的问题,及时解决,避免将有问题的特征导入模型,导致训练过程冗长而得不到好的结果。特征评估是对选择好的特征进行整体评价,而不是特征选择中所谓的对单个特征重要性的评判。特征评估包括特征的覆盖率、特征的维度、定性分析和定量分析等几种方式。
特征的覆盖率是指有多少比例的样本可以构建出相关特征,对于推荐系统来说,存在用户冷启动,因此对于新用户,如果选择的特征中包含从用户行为中获得的特征,那么我们是无法为他构建特征的,从而无法利用模型来为他进行推荐。
特征的维度衡量的是模型的表达能力,维度越高,模型表达能力越强,这时就需要更多的样本量和更多的计算资源、优秀的分布式计算框架来支撑模型的训练。为了达到较好的训练效果,一般对于简单模型可以用更多维度的特征,而对于复杂模型可以用更少的维度。
定性分析是指构建的特征是否跟用户行为是冲突的,可以拿熟悉的样本来做验证,比如在视频推荐中,可以根据自己的行为来定性验证标签的正确性。我个人最喜欢看恐怖电影,那么基于标签构建特征的话,那么对于我的样本,在恐怖这个标签上的权重应该是比其他标签权重大的。
定量分析,通过常用的离线评估指标,如Precitson、Recall、AUC等等来验证模型的效果,当然,最终需要上线做AB测试来看是否对核心用户体验、商业化指标有提升。
关于特征工程的其他介绍读者还可以参见参考文献1、2、3,另外也可以参考《特征工程(上)—特征选择》、《特征工程(中)-特征表达》、《特征工程(下)—特征评估》这三篇文章。参考文献8、9也是两篇比较好的关于特征工程的介绍文档。另外,Spark的MLlib中也集成了很多与特征工程相关的算子,参见参考文献10。scikit-learn中也包含大量与数据处理、特征构建、特征选择相关的算子,参见参考文献11。
四、常用推荐算法之数据与特征工程
在本节我们基于3类主流的推荐产品形态来介绍与之相关的数据与特征工程。不同产品形态可以有不同的推荐算法实现,我们会根据常用的推荐算法来说明需要什么样的数据,以及怎么基于这些数据通过特征工程来构建特征用于推荐模型训练。
1
排行榜推荐
排行榜推荐是非个性化推荐,也是最简单的一类推荐算法,一般可以作为独立产品或者作为其他个性化推荐算法的默认推荐。排行榜推荐一般只依赖于用户行为数据,根据用户在过去一段时间(比如过去一周、一月、一年等)的操作行为或者标的物自身相关的属性特征,基于某个维度统计最受欢迎的标的物列表作为推荐列表。常用的有最新榜(这个是根据标的物上线时间来统计的)、最热榜、收藏榜、热销榜等等。
这类推荐算法也不需要什么复杂特征工程,只需要对数据进行简单的统计处理就可以了,一般用select sum(N) as num from T group by sid order by num desc limit 100这类SQL就可以搞定,这里N是标的物的播放量、销量等,T是通过数据预处理生成的结构化的表,sid是标的物的唯一编码id)。需要注意的是,对于不同类别的标的物(如电影和电视剧),如果要混合排序的话,需要将统计量(如播放量)归一化到同一个可比较的范围中。
2
标的物关联标的物推荐
标的物关联标的物推荐,就是我们通常所说的关联推荐,给每个标的物关联一系列相关的标的物作为推荐列表。根据所使用算法不同,对数据源、数据处理及特征工程有不同的要求。下面分别介绍。
2.1
基于内容的关联推荐
如果是新闻资讯类标的物,一般我们可以用TF-IDF算法来向量化每篇文章,这样就可以根据向量相似度来计算两篇文章的相似度了。这时我们利用的数据就是标的物本身的文本信息,该算法也没有复杂的特征工程,只需将所有文章进行分词,构建词库,剔除停用词,得到最终所有词的corpora,对每篇文章利用TF-IDF算法获得每篇文章的向量表示,这个向量就可以认为是是最终的特征。
当然也可以利用向量空间模型,将标的物的每一个属性转换为一个特征,进而获得特征表示。如果标的物包含标签信息,我们可以用每一个标签表示一个特征,采用one-hot编码的方式构建特征表示。对于标的物图片、视频、音频数据也可以采用嵌入技术构建特征向量。
对于基于内容数据通过技术手段构建标的物的向量表示,大家可以参考《基于内容的推荐算法》第二节3“构建标的物特征表示”来进行深入了解。
2.2
基于协同过滤的关联推荐
传统的item-based协同过滤,通过获取用户操作行为,构建用户行为矩阵,该矩阵的每一列就是某个item的特征向量表示,基于该向量就可以根据cosine余弦计算相似度。基于矩阵分解的协同过滤,也是通过用户行为矩阵进行矩阵分解,获得标的物特征矩阵,该矩阵的每一列就是标的物的特征表示。这两类方法,只需要利用用户行为数据,获得的标的物向量表示就是最终的特征,所以也不存在复杂的特征工程。具体读者可以参见《协同过滤推荐算法》和《矩阵分解推荐算法》这两篇文章中相关章节的介绍。
还有一种基于item2vec的方法基于用户行为数据来获得标的物的嵌入表示,也不需要进行复杂的特征工程,读者参见《嵌入方法在推荐系统中的应用》第三节2相关内容。
3
个性化推荐
个性化推荐是业界最常用的一种推荐产品形态,下面对常用个性化推荐算法来说明该算法所使用的数据集和相关特征工程方面的知识点。
3.1
基于内容的个性化推荐
如果我们基于内容算法获得了每个标的物最相似的标的物列表,可以基于用户的操作历史记录,采用类似基于user-based或者item-based这类线性加权的方式获得用户的推荐,或者根据用户的操作历史获得用户的嵌入向量表示(用户操作过的标的物的向量表示的加权平均可以作为用户的嵌入表示),通过计算用户向量和标的物向量内积来获得用户对标的物的评分,根据评分降序排序获得最终给用户的推荐列表。具体细节读者可以参考《基于内容的推荐算法》第二节4中相关介绍,这类算法只需要用户操作行为数据及标的物相关数据,并不需要复杂的特征工程。
3.2
基于协同过滤的个性化推荐
常规的user-based、item-based、矩阵分解协同过滤,只需要用户行为数据,经过简单的算法就可以获得给用户的推荐,读者参见《协同过滤推荐算法》和《矩阵分解推荐算法》这两篇文章相关介绍,这里不再赘述。
3.3
基于多数据源构建复杂特征的召回、排序模型
上面我们提到的算法都是基于简单规则或者人工假设的模型,基本不涉及到复杂的特征工程,我们都是一笔带过。下面我们提到的推荐召回、排序模型,都是需要通过构建复杂的特征来训练的,这类算法有多种,比如经典的logistic回归、FM算法,还有最近比较火的深度学习等。这里我们重点讲解视频场景中,用经典的logistic回归模型来做推荐排序中涉及到的特征工程相关的知识点,其他模型类似。
对于利用logistic模型来预测用户对某个视频的点击率,样本是用户观看过的视频,每个用户视频对构成一个样本。这里正样本是用户点击播放过的视频(或者是播放时长超过一定时间的视频),而负样本可以是曝光给用户但是用户没有点击过的视频(或者播放时间少于某个阈值的视频)。
这类构建复杂特征来训练召回模型的方法,需要尽可能多的数据,才能构建足够多样的特征,所以一般用户行为数据、用户特征数据、标的物特征数据、上下文数据等都会被使用到。下面分别对这4类数据构建的特征加以简单介绍。
a 行为特征:视频的播放时长、播放完整度、点赞、转发、分享、评论等多种互动行为都与用户的最终点击有关,都是可以构建成特征的。
b 用户属性特征:是否是会员,地域,活跃度,登陆时间分布,观看节目分布,平均观看时长,搜索行为,点赞行为,收藏行为,是否高危地区,设备信息,当前版本。.
c 节目属性特征:是否是会员节目,是否获奖,豆瓣得分,年代,是否高清(isHd),地区,节目语言(language),上映时间(show_time)等。
d 场景特征:是否节假日、用户所在路径,以及上下文(context)特征,context 特征通常是客户端带的信息,在用户授权的前提下可以直接获取,比如请求时间、用户手机品牌、手机型号、操作系统、当前网络状态(3g/4g/wifi)、用户渠道等实时属性特征以及之间的交叉特征。
基于上面这些信息,我们可以构建4大类特征(基于第三节3中特征工程相关知识点),形成如下面图8的模型训练样本集合,通过特征构建、特征选择、训练、离线评估等步骤我们最终获得了一个训练好的logistic回归模型。
图8:构建logistic模型及相关特征
通过上面的介绍我们知道经典的个性化推荐算法,如item-based、user-based、矩阵分解、KNN等属于基于简单规则(假设)的模型,模型是我们人为事先设定好的,比如利用内积来表示相似度,某个样本点最近的K个点的类别进行投票确定该点的类别,这类模型没有需要学习的参数(KNN和矩阵分解中的隐因子数量都是人为事先确定的,属于超参数),这类算法只需要进行简单的数据处理或者训练就可以为用户生成推荐,而包含大量参数的模型(如线性模型、FM、深度学习模型等)是需要进行复杂的特征工程的。
五、推荐系统数据与特征工程未来趋势
伴随科技的发展,互联网技术渗透到了生活的方方面面,各类互联网产品层出不穷,而产品所提供的信息和服务更是爆炸性增长,这其中非常重要的一个帮助用户筛选、过滤信息的有效工具就是推荐系统,推荐系统一定是未来产品的标配技术,它一定会在更多的场景中得到应用。随着深度学习、强化学习等更多更新的技术应用于推荐系统,推荐的效果越来越好。随着各类传感器种类的丰富、交互方式的多样化,我们可以收集到越来越多样的数据。用户对反馈及时性的强烈需要,推动互联网产品更加实时地处理用户的请求,为用户提供更加实时化的交互体验。从这些大的趋势来看,推荐系统依赖的数据和特征工程处理技术也会面临更多的变化与挑战,下面作者就基于自己的理解和判断来说说在未来几年推荐系统数据与特征工程的几个重大变化和发展趋势。
1
融合更多的数据源来构建更复杂的推荐模型
数据是一切机器学习的基础,只有数据量够多、质量够好,才可以构建高质量的推荐模型。我们在这篇文章中总结了推荐系统四种数据源:行为数据、用户属性数据、物品属性数据、上下文数据。每类数据的种类趋向于多样化,拿行为数据来说,我们可以收集用户在手机屏上的滑动幅度、滑动快慢、按压力度等数据,在车载系统或者智能音箱场景中可以收集用户与机器的语音交互数据,在VR/AR场景中我们可以收集用户手势、眼动、头部转动等各种信息,如果智能推荐未来拓展到这些场景中,那么无疑这些数据对构建推荐系统是非常关键的。在社交场景中,用户的社交关系数据对构建推荐系统也是非常重要的。如果某个公司有多个APP,那么用户在多个APP上的行为可以联合起来进行学习,构建更好的推荐系统。
2
深度学习等复杂技术减少人工特征工程的投入
深度学习技术在很多应用场景下构建的模型效果比传统算法好很多,深度学习另外一个被大家称道的优点是可以减少人工特征工程的繁琐投入,直接将较原始的数据灌入模型,让深度模型自动学习输入与输出之间的复杂非线性关系。
随着深度学习技术在推荐系统中的应用逐步成熟,目前应用到了非常多的行业及场景中,获得了非常好的效果。未来的趋势是基于特定应用场景,基于多样化数据构建场景化的特殊深度网络结构来获得更好的推荐效果。有了深度学习的加持,可以让推荐算法工程师将更多的时间用于思考业务、构建更加有效的模型上,而不是将大量精力放到构建复杂的特征上,从而解放推荐算法工程师的双手。
3
实时数据处理与实时特征工程
随着社会的发展,人们的生活节奏加快(大城市尤其如此,中小城市也会朝这个趋势发展),人们的时间会更加碎片化,怎样更好地占领用户的碎片化时间,是任何一个公司在开发产品过程中需要关注的重要问题。这种社会趋势的出现,导致了新闻资讯、短视频应用的流行,在这些应用中用户消费一个标的物的时间是非常短的(一般几秒钟到几分钟),在这类产品上构建推荐服务这就要求推荐系统可以近实时响应用户的需求,因此我们需要近实时收集处理数据、近实时构建特征工程、近实时训练算法模型、近实时响应用户需求变化。这一趋势一定是未来非常重要且非常难的一个方向。
4
自动化特征工程
自动化机器学习(AutoML,全称是Automated Machine Learning,参考文献4是一篇关于自动机器学习最近进展的综述文章,参考文献5是一篇关于利用深度学习技术做自动化特性的文章,参考文献14是一篇关于自动化进行特征交叉的文章,读者可以自行学习),是2014年以来,机器学习和深度学习领域最炙手可热的研究方向之一。机器学习过程需要大量的人工干预,这些人工干预表现在:特征提取、模型选择、参数调节等机器学习的各个方面。AutoML试图将这些与特征、模型、优化、评价有关的重要步骤自动化,使得机器学习模型无需人工干预即可自动化地学习与训练。
自动化特征工程也是AutoML研究中非常重要的一环,在AutoML中,自动特征工程的目的是自动地发掘并构造相关的特征,使得模型有更好的表现。除此之外,还包含一些特定的特征增强方法,例如特征选择、特征降维、特征生成、以及特征编码等。这些步骤目前来说都没有达到自动化的程度。
自动化特征工程目前虽然是学术研究中非常火的一个方向,但目前还不够成熟,也没有非常有效的方法很好地应用于各类业务场景中。自动特征工程在真实业务场景中确实是一个比较强的需求,因为手动构建特征工程需要很强的领域知识,需要懂机器学习的领域专家参与,而既懂机器学习又对业务理解透彻的人毕竟是少数。对于提供机器学习服务的云计算公司或者toB创业公司,需要接触到很多不同的行业,也不可能为每个领域配备一个专家,因此也希望可以通过技术手段来做自动特征工程,以减少人力和资源的投入,加快项目的推进进度,在这方面国内的明星创业公司第四范式做了很多尝试。
对于自动特征工程在推荐系统中的应用,读者可以看看参考文献12、13,文章中提供了很多很好的方法和思路。
总结
本文对推荐系统算法模型构建过程中依赖的数据源进行了较全面的介绍,包括数据的种类、数据生成、数据预处理、数据存储等,这些数据是构建推荐模型的原料。在讲解数据的基础上,我们介绍了特征工程相关的概念和技术,通过特征工程可以将数据转化为推荐算法可以直接使用的特征,这时推荐算法才能够发挥用武之地。
同时,我们讲解了常用的推荐算法是怎么使用数据和基于这些数据来构建特征的,有了这些知识,我们可以更好、更全面地理解推荐业务全流程,而不仅仅只是知道算法。在最后,作者根据自己的经验和理解,对推荐系统在数据与特征工程的后续发展方向和面临的挑战等问题进行了探讨,希望给读者提供一定的方向性指导。
推荐系统的数据与特征工程这块知识是一般书本上很少讲到但是在实际业务中非常重要的,期望本文可以让读者较全面地学习了解这方面的知识,并能学以致用。
参考文献
1.图书:《精通特征工程》
2.图书:《特征工程入门与实践》
3.[特征工程到底是什么?] https://www.zhihu.com/question/29316149
4.[2019] Taking the Human out of Learning Applications- A Survey on Automated Machine Learning
5.[2019] AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks
6.[2016 YouTube] Deep Neural Networks for YouTube Recommendations
7.[2016 Google] Wide & Deep Learning for Recommender Systems
8.[浅谈微视推荐系统中的特征工程] https://mp.weixin.qq.com/s/EgiSIJCRfiRLKwHUC1m46A
9.[如何解决特征工程,克服工业界应用 AI 的巨大难关] https://www.infoq.cn/article/solve-feature-engineering-in-industry/#
10.http://spark.apache.org/docs/latest/ml-features.html
11.https://scikit-learn.org/stable/data_transforms.html
12.[AutoML 在推荐系统中的应用] https://gitbook.cn/books/5bcd96da48da2b3b6ac43327/index.html
13.[罗远飞:自动特征工程在推荐系统中的研究] https://zhuanlan.zhihu.com/p/98006452
14.[2019] AutoCross: Automatic Feature Crossing for Tabular Data in Real-World Applications