00:00
那么接下来给大家做一个数据源的解解析,呃,这里面我们用到的数据源,也就是基本的数据是相当于是。真实数据啊,这个是来源于呃,中文亚马逊的一个公开的一个数据,我们用到的是它里边,当然这个数据量我们用到的比较少,是经过修改的一部分数据,那这部分数据呢,拿到的是什么?主要就是两大两大块儿,一个是商品的基本信息,另外一个是用户的评分数据。呃,所以我们这个基于真实数据的话,大家可以看到就是呃,能拿到的东西可能并不是特别的多,呃,所以我们也是基于拿到的数据去做一些考察,去构建我们整个这个推荐系统的。好,首先我们来看一下拿到的商品基本信息有哪些?呃,这就是主要的商品信息,里边的字段有哪些呢?商品ID,呃,Product ID这个肯定是有的啊,然后还有名称啊,这就是它到底是什么商品种类,大家可以看到,呃,这这里边应该是都是竖线分割的啊,这个斜线应该是一个竖线,呃,商品种类我们这里边就列出了这个商品它隶属于哪个类别,后面还有一个是图片URL,这个对于我们业务系统展示非常重要,但是大家会想到对于推荐而言,这ul是不是没什么用了啊,对,我们也可以保留啊,然后还有这个商品标签,这个标签就是用竖线分割的。
01:39
UGC标签,用户给打上的标签,大家看这个是什么啊?水壶好用,乐扣乐扣啊,到货速度快,什么质量好啊,这些标签是用户给商品生成的一个内容信息,所以这可能是我们后面做内容基于内容推荐的一个重要部分。接下来还有一部分信息就是用户评分,大家看用户评分的话,这个就更加简单了,它主要包括哪几个字段呢?
02:09
就是我们说的一个评分,主要的内容是不是就是哪个用户给哪个商品,然后评了多少分,是不是就是这样的一个三元组啊,我们在这里边就是UID,用用用户ID,然后商品ID product ID,还有商品评分,最后还多了一个评分时间。这就是基本的这个评分数据,所以大家可以看到,其实能够利用的数据还是比较少的,那我们怎么样利用这些数据去做推荐呢?即使只有这些数据,我们也可以去做出很好的推荐啊,那怎么样去推呢?首先基于商品的基本信息,我是不是可以做基于内容的推荐,这里面没有用户信息,所以说是不是这个基于人口统计学用画像这一部分就很难做了,所以我们可以基于商品的基本信息做一个基于内容的推荐。另外。
03:06
更多的可能就是基于这个用户行为数据,用户的评分信息,可以去做一个云语音模型,也可以做item CF,对吧?啊,可以基于他去做一些协同过滤的推荐,这是我们的一些基本的考量。有了数据之后,接下来我们看一下里边用到的哪些主要的数据模型,呃,那么这个数据模型的话,这里其实就是我们的表结构了,大家看一眼就可以啊,左边这三张表。是基础数据,那首先有一个商品信息表,这里边的五个字段是不是就是前面我们给大家讲本来那个数据文件里边提供的字段啊,然后接下来还有这个用户评分信息表,这就是我们的那个评分表,然后最后还有一个用户表,当然这个用户表跟我们的推荐其实是关联不大的,因为我们没有拿到它的初始数据。我们这里面的用户表是什么呢?那就是我们自己的业务后台,业务系统自己进来之后,我要去注册一个用户,那就会在这个用户表里边去插入一条数据。
04:15
那在做推荐的时候,其实没有太多用户信息的,这里面保存的就只有用户ID,用户名,然后密码创建时间,这看起来就没有办法对他做推荐,对吧?好,那。呃,另外我们用到哪些表结构呢?其实就是我们推荐的结果都要最后再写入到mango里面去,比方说上面的这三张表。这是不是就是统计推荐的结果啊,呃,然后大家看中间这一部分这四张表,这是跟离线推荐相关的一些表。有什么啊,基于银语义模型的用户推荐列表,然后下面还有什么呢?基于隐语翼模型的商品相似度表。
05:00
呃,那大家可能会想到,这里面我还已经有了用户推荐列表了,还算这个商品相似度干什么呢?这是因为大家会想到后边我们还要做实时推荐,实时推荐那有一个要求,是不是就必须得实时响应,要快啊,要算的快,那我们做这个实时推荐的时候,你是不是要不是基于这个我们既定的规则,要不是不是也得根据相似度去做推荐,如果我们的本身的原则,本身的原理还是基于相似度的话,那这个相似度你是不是不能实时去算啊,所有物品的相似度你如果要实时去算,这个显然算不完嘛,所以我们应该在之前离线的把商品之间的相似度算出来。实时的推荐,这里是不是就可以直接拿来用了,哎,这里就会对这个系统的实时性就会有更好的支持,所以这里边的商品相似度其实是为后续的实施推荐做基础的。
06:07
呃,那当然了,后面我们可以基于内容也去算一个商品的相似度,那这个相似度我可以也可以提供给实时推荐去做基础,也可以直接在商品的详情页啊,就去给用户展示出来相似的商品,对吧。另外还有一个是item CF的商品相似度,这是离线推荐的结果,最后还有一个是实时推荐的结果,我们也用一张表来做保存。那接下来就是各个模块,具体的模块到底去怎么实现了,首先是统计推荐模块,大家看这里边我们给大家举的例子就只有这么呃三个啊,比方说历史热门商品的推荐,还有近期热门商品的推荐,最后还有每个商品的平均评分的一个统计,呃,那大家能想到这个平均评分统计出来之后怎么推荐呢?当然就是评分越高的,综合评分越高的,呃就给推出来对不对,就相当于是一个优质商品推荐,所以在我们整个的商品架构,整个的系统架构图里边,其实就是这一部分啊离线推荐,好,那呃,大家先看一下整体的这个逻辑是什么样的,本身我们在mango里边已经有了商品的基本信息和用户的评分信息,我们根据这些是不是可以用Spark CQ去做一些统计,哎,所以我们用SPA read方法把它read进。
07:37
来,然后用Spark CQ去做一些统计计算得到的结果是不是用这个right方法再把它写回到man里面去就可以了啊,其实很简单啊,这个过程就是这样,具体来看,首先历史热门统计。大家想一下,根据我们已有的这个基本数据啊,商品的基本信息和用户的评分信息,怎么统计它的热门呢啊。
08:08
什么样的商品是热门的商品呢?评分高的是吗?不应该是评分高的,是应该应该是评分多的是更热门的,对不对啊,所以大家注意啊,这里边我们并不是看评分高低,而是要看评分的多少,所以大家看一下,我把这个CQ已经写出来了啊,这个大家应该看得懂吧,呃,Select product ID,然后count product ID什么意思?对,是不是要根据,呃,我们看先看这个select是from哪里啊,From ratings,这是不是要从我们的评分表里边选取数据,哎,所以评分表里面的所有数据我选择product ID和。对product ID是不是要做一个count啊,那这个count你肯定后面得有聚合是group by。
09:06
Product ID对不对?所以大家看,我是从评分表里边根据这个product ID做了一个分组,然后统计它里边每个product ID对应的数量。那这是不是就代表了它的评分数量,也就代表了它的热门程度啊?呃,所以最后我们在order by count,然后做一个降序排列就可以了。最后得到的结果,比方说我们叫一个名字叫more product,写到这个表里边来,它的数据结构其实就是一个ID对应一个count。这个count数量越越大代表越热门,呃,就非常简单的一条C口就能搞定,那接下来我们再考虑一下近期热门这个怎么样去做统计呢?这个好像稍微麻烦一点。近期。
10:01
哦,大家就会想到近期热门的话,我们之前评分表里边除了用户ID,商品ID和评分之外,不是还有另外一个数据吗?对评分的时间戳,我根据这个是不是可以做一个过滤判断一下,诶哪些是近期对吧,或者我这里面还提供另外一个思路。就是我可以根据时间戳把它转换成一个年月的表达。转换成年月之后有什么有一个什么好处呢?我再根据对,我再根据年月的这个数值去做一个分组,那是不是每一组就相当于都是一个月里边的统计啊,哎,所以我再根据年月做一个降序排列,那是不是最近的,那就是最近一个月之内的所有的统计,哎,所以这相当于也是代表了我们近期的热门统计啊,那具体实现的过程当中,我们首先就要定义这样的一个userdf了,呃,就是user def DeFine function对吧?呃,比方说这里我们叫做change data,呃,Change data。
11:15
干什么呢?就是把时间戳转化成一个年月的表达形式,YYYYMM这样的一个格式,转化成它之后,把它叫做year months,呃,那大家看我们第一步其实就是select product ID score,还有要得到它转化之后的这个年月,呃,从RA表里边把它得到,得到的这个东西我们临时的存储一个叫做RA month的,呃,一张临时表,然后做select操作,操作的时候是不是从这个RA of month里边选取啊,选取什么东西呢?哎,我们要把它b by year month,然后还有product ID。那大家想这个分分组之后得到的结果就是什么?
12:03
对,就是每一个年月里边分组,然后再按照每个商品ID去做分组,对不对?统计出来的这个count是不是就是在每个月里边它的评分数量,最后我们按照这个year month和count去做一个降序排列,得到的就是近期热门商品。其实这个这么看的话也不难,对吧,其实就是分成两步走,把它做一个转化就可以,思路清晰就可以。呃,然后最后还有一个商品的平均评分统计,这个就更加简单了,我们是不是还是从评分表里面选取数据,呃,得到的是什么呢?当然就是还是group by product ID选取出来的,是不是每一个ID对应它的。平均评分啊啊,Average score选取出来的结果,我们叫做avg,存储起来就可以了,这就是统计推荐这一部分。
13:07
那主要内容其实就是写CQ了,所以如果大家想我们在这个一个实际的业务系统当中,要去负责统计推荐这个模块的话,那可能我们的主要任务就是去设计我们需要哪些指标啊,然后去想怎么样去C口去做实现,对吧?把对应的这个统计信息选取出来,写到对应的表里面,就可以做相关的推荐了,看这就是这一部分。然后接下来我们的重点其实是后边的个性化推荐,个性化推荐这一部分呢,又分为离线和实时两大块,那离线这一块首先讲一个基于盈语义模型的离线推荐模块,那那首先我们来看一下它在整个我们的项目框架里边处于哪个位置。他其实是在离线推荐,个性化离线推荐服务里边的这一小部分,对不对。
14:07
首先我们看要用ars算法对英语翼模型进行训练,这个过程是怎么样的呢?听起来很复杂,我们用到了很复杂的算法,但实际应用当中其实就一句话,大家可以看到啊,就是在这个业务代码里面,其实就一句。怎么怎么怎么样的一句呢,As点就是调用了这个,当然我们这里边用到的是不是就是MLLA里边的东西了啊,这里边有一个ars这样的一个一个类啊,然后它有一个tri方法,直接调用就完事。那对ML lab里边的方法好,那么我们需要的数据是什么呢?既然是做引语义模型的计算,英语义模型的训练,那么我们需要的数据是不是就应该是评分数据啊?因为英语模型本来就是一个稀疏的评分矩阵嘛,所以我们需要的数据还是RA数据。
15:09
用一个SPA session的read方法把它读进来,然后转成一个RDD,呃,这是为什么呢?这是因为我们后面这里调的这个顺方法是这个就是MLLA里边要求的是RDD的数据结构啊,当然也可以就是调另外的方法,出方法要求的是data frame也可以,这里都一样啊,大家只要知道用什么数据结构,我们转成什么样的就可以了,然后大家看还需要什么样的参数呢,后面还有一个rank。还有还有大家知道这三个参数是什么意思吗?啊,这个好理解,这是迭代次数对吧,Lada也好理解,这是什么,Yes。对正则化技术对吧,或者正则化参数,那前面的rank又是什么呢。
16:11
呃,不,不是那个步长,步长阿尔法是我们在做梯度下降的时候才有的,现在是as,它里面没有阿尔法。那这个rank应该是什么呢?还,还缺什么?忘了我们是不是还缺隐语义模型里边定义的那个影特征的个数啊,哎,缺那个K对吧?所以这里边的RA其实就是当时我们算法实现的时候的那个K,那这里边是要定义出来的,所以如果说我们预先已经把这三个参数选取好的话,这里边直接就一行als点去把它吊起来就完事了。那自然我们大家就会想到这三个参数你到底怎么样去选取的,或者说我一开始随便拍脑袋想的一个数,算出来那个结果训练出来的模型到底好不好呢?这就涉及到模型评估和参数调整了,我们怎么样去做参数调整呢?哎,用我们这个评测的方法,RMSE。
17:16
通过定义RMSE去考察预测出来的评分和实际评分的之间的误差,我们就可以考量取什么样的参数得到的效果会更好。呃,所以这里边我们可以利用RSE的一个计算选取多组参数,看它的RSE到底有多大,我们选取RMSE最小的一组参数,就是我们这里边的最优参数,呃,这里给大家会做一个呃,到时候会有对应的代码实现好那。把这个结果得到之后,我们就应该拿到用户的推荐矩阵了,那根据什么来拿用户推荐矩阵呢?也很简单。
18:03
得到的是一个引语义模型的结果,英语音模型其实用了调用as算法之后,是不是就可以得到用户特征矩阵和物品的特征矩阵?根据这两个特征矩阵,我们是不是可以计算用户的对物品的预测评分?所以再根据他的预测评分,我们做一个排序,是不是就可以得到他的推荐列表啊,所以基本思路非常的简单,大家看具体实现里边其实就是用user的这个RD和商品product的RDD做一个D卡机,这得到的是一个什么东西呢?对,就相当于就是用户和物品两两做匹配得到的那个集合,对吧?啊,就是每一个用户对应每一个物品这样的一个状态,所以我们得到这样的一个RDD,把它带入到model.predict这个方法里面来,那这个model是哪里得到的呢?是不是就是我们前面这里得到的呀,出来的这个结果就是一个model,所以这个model有一个predict方法,把user product,这相当于是一个空的评分矩阵,把它带进去,最后就可以得到预测的评分。
19:28
然后我们再把预测评分按照UID做一个group by,后边是不是就可以得到它的一组评分啊?然后我们再去降序排列,然后根据它的评分做一个降序排列,最后取比方说前20个得到的是不是就是一个长度为20的推荐列表?最后我们把它写回到mongo里面去,就可以展示给用户看了,那这就是很简单的这样的一个实现,基于盈语义模型做的离线推荐,好,那么这一部分做完之后,其实推荐列表就已经得到了,但是前面我们讲了,在营运模型离线推荐这一部分,我们还应该有一个副产品。
20:12
是要为之后的实时推荐打下基础。什么样的副产品呢?哎,就是说我们希望得到。商品之间的一个相似度矩阵,对吧?哎,这个相似度矩阵我们要怎么去算呢。首先我们是不是应该想到之前定义的相似度,我们一般商品的相似度怎么样去算,是不是可以用距离去算,也可以用。余弦相似度去做计算啊,啊,这是我们定义的相似度的计算方法,那怎么样能够去计算两个商品之间的相似度呢?那应该得拿到商品的特征向量才行啊,我们能拿到它的特征向量吗?当然可以,之前我们不是做了盈余模型,做了矩阵分解吗?不是已经得到了用户的特征向量和商品的特征向量吗?哎,所以我们从里边model还有另外一个属性叫什么呢?就叫product features,这是不是就是商品的特征向量啊,啊,当然了,这里面是一个矩阵啊,特征矩阵,所以我们把每一个商品的特征向量拿出来跟另外一个商品的特征向量。
21:30
去一一做比对,那当然了,这就相当于是又把他俩做一个笛卡耳机。得到的结果是不是根据我们的相似度计算的公式去做一个计算,就得到他们俩之间的相似度啊,所以我们最后存储的形式是每一个物品,每一个商品后边跟着他的一组相似度。也就是一个相似度的列表。那这个相似度的列表又是怎么样一个表达形式呢?就是一个商品一个相似度,一个商品一个相似度,这就是跟这个商品相关的一组相似。
22:10
相似商品,大家想想是不是这样?所以这就有点像是我们相似推荐的那种模式。当然这里面我们不是直接做相似推荐,而是给后边的实时推荐做基础的。
我来说两句