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