作者丨gongyouliu
编辑丨lily
推荐系统是机器学习的一个子领域,并且是一个偏工程化、在工业界有极大商业价值的方向。大量应用于提供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结构化数据
所谓结构化数据就是可以用关系型数据库中的一张表来存储的数据,每一列代表一个属性/特征,每一行就是一个数据样本。一般用户属性数据和物品属性数据都可以用一张表来存储,用户和物品的每一个属性都是表的一个字段,因此是结构化数据。下表就是视频的结构化表示。
表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上下文数据
上下文数据一般是动态变化的,是用户在某个场景下的特定时间点、特定位置所产生的数据,所以一般是实时获得的,也一般应用于实时推荐系统中。
2数据预处理
数据预处理一般称为ETL(Extract-Transform-Load),用来描述数据从生产源到最终存储之间的一系列处理过程,一般经过抽提、转换、加载3个阶段。目的是将企业中的分散、零乱、标准不统一的数据整合到一起,将非结构化或者半结构化的数据处理为后续业务可以方便处理使用的结构化数据,为企业的数据驱动、数据决策提供数据基础。数据基础设施完善的企业一般会构建层次化的数据仓库系统,数据预处理的最终目的也是将杂乱的数据结构化、层次化、有序化,最终进入数据仓库。对于推荐系统来说,通数ETL将数据处理成具备特殊结构(可能是结构化的)的数据,方便进行特征工程,最终供推荐算法学习和训练之用。下面分别对ETL三个阶段的作用进行简单介绍。
2.1抽提(Extract)
这一阶段的主要目的是将企业中分散的数据聚合起来,方便后续进行统一处理,对于推荐系统来说,依赖的数据源多种多样,因此是非常有必要将所有这些算法依赖的数据聚合起来的。推荐系统的数据源比较多样,不同的数据抽取的方式不一样,下面分别简单介绍。
用户行为数据一般通过在客户端埋点,通过