00:00
那接下来我们看一下训练营运营模型。这是我们的核心算法,对吧,这个过程其实是对于我们这个程序来讲是最重要的一部分。但是我们会看到,实现起来其实最简单,我们看一眼啊,首先需要得到这个train data,那么train data应该是什么样的数据类型呢?需要从RARDD里边再去做一个转换,把它转换成。As算法里边需要的RA数据类型啊,所以大家会看到这个不一,对于我们来讲,这不已经是一个RA了吗?一个user ID,一个product ID,一个一个score,对吧,这还不行,我们必须得是按照。ML lab里边定义好的RA类型才可以好,所以这里边我们去做一个对应的map操作。把每一个元素X转换成什么呢?转换成呃,大家大家注意看啊,这里面如果我定义RA的话,是不是默认还是我自己上面定义好的这个RA啊,呃,所以为了避免这个重复,我们可以在前面指定它的那个作用域啊,但是为了避免重复更方便一点,对我我把这个换一个名字不就完事吗?那这里边我叫一个product RA。
01:25
下边对应的这里也要改。这里边加载的时候是我们这里边自定义的这个样例类,这里边要用到的是什么呢?大家可以看到,对m ML lab里边recommendation下边有一个叫做RA的数据类型。搞错了吗?好,这里边大家看到可以点进去看一下啊,它到底是个什么东西,它是个什么东西啊。一个样例类对吧,它定义的就是一个user,一个product,然后还有一个RA啊,所以大家会看到为什么前面我们user ID product ID都给的是int呢?就是因为这里边对应到。
02:14
这个MLLA里边RA这个数据格式,他要的就是这样的数据格式,我们这里边就不用做数据类型转换了。呃,那当然了,我们必须得包装成这个才能用as算法才能够调,这是这一部分内容啊,我们还是回到这个代码里面来,那这里边我们用到的MLLA里边的RA数据结构,它其实要的就是一个一个user,一个product,然后最后还有一个RA,所以我们其实就把前面已经包装好的这个user ID product ID score,是不是换个名字给他传进去,完了呀。所以这里就是X的第一个元素,X的第二个元素,X的第三个元素,这样把它做一个转换是不是就完事了?呃,这就是前面给大家说过的啊,就是为什么这里边要换一个名字,把它叫做product,跟这里边做一个区分,我们这里边用到的是ML lab里边的RA数据结构。
03:14
有了这个。训练数据之之后,那么大家就会想到了,我是不是可以直接训练模型了,定义一个model。大家看啊,怎么训练呢?Als点啊,那当然了,这里还没有这个als,我们这里调用m l live下边的LS,呃,它主要是针对这个RDD来做操作的,这里边还报错,因为里边的参数我们还没有给,那我们可以看一眼这个train,大家可以看到它对应的这个,呃,实现里边可以传不同的参数,首先第一个参数是不是就应该传一个RA类型的RDD,叫做ratings啊,这是我们的训练数据对不对?后面可以给ranks啊,当然别的一些参数我们也可以传拉姆达对不对,还可以传其他的一些东西,我们这里边。
04:06
传ch data先传进去,然后后边还应该有rank,还有inter对吧?呃,Inter,呃,最后我们再传一个lada,大家看它有提示的啊lada。这里面我们没有定义过这三个三个参数,所以说我们是不是在前面应该去直接指定这三个参数,先给他一个预设值就可以了。Lada,那这里的这个值给什么呢?啊,我们就先直接拍脑袋给一个对吧,之后我们遇到。想要看考察他到底给什么的时候,我们把它放在后面那一部分做参数选取,模型评估,呃,这里就直接先给一个,比方说我这里边呃5RANK表示什么意思来着,大家还记得吗?对,表示我们那个影特征的维度,影特征的数量K对吧?然后inter,这就是迭代次数了,呃,就是我们做那个交替最小二乘嘛,迭代的次数我这里少一点吧,方便运行啊,十次,然后拉达给一个经验值,给一个0.01,所以。
05:29
给一条注释,这里边我们是定义。模型训练的参数,呃,Rank表示的是引语义。影影特征个数。那么表示的是迭代次数。最后的lambda。是什么LA的对正则画系数,正则画像系数对吧?啊,大家把这些搞明白就可以了,所以我们这一部分看起来很核心,很复杂,其实在实际的这个调用当中非常简单,as.tree那前面这些东西其实都是一些预定义的东西了啊,核心是不是就这么一句啊?
06:23
直接把它搞定就可以了,好,如果已经把这个模型这一行调用之后,我们就已经得到了一个训练成熟的一个模型,那接下来是不是可以用这个模型去做。预测评分啊,啊,可以做这个预测评分了,那大家会想到我们预测评分的时候调用什么方法呢?调用的是,呃,我们先定义一个predict啊,调用的是model下边会有一个predict的方法,呃,大家会看到这个predict它需要传入什么参数呢?
07:02
呃,刚才大家已经看到了啊,它可以传入一个对user和product传入一,这是传入一个用户,一个商品,我们这里是不是希望把所有的那个一下传进去,你把矩阵都给我算出来就完事了啊,那我们看看他想要的数结构得是什么呢?是不是得是一个user products这样的一个RDD啊。哎,所以那这个RDD我们怎么得到呢。这就是我们之前说的,是不是可以求一个笛卡尔机啊,用user对RDD和product r DD做一个笛卡机。得到。呃,这个一个。对空的RDD对吧。
08:03
User。Product。这样的一个RDD,好,那么这里边我们具体的操作就是。可以定义一个user products,它等于什么呢?做D卡机是不是user r DD可以调它的这个对。呃,他三对吧,里边传参数传进去product r DD,这样就可以做预测了。这里边predict进来的参数就是user products,这样就没问题了。已经拿到这个预测评分之后,那我们想要的那个数据结构user res。是不是就可以从预测评分里面去提取啊,那最后的那个推荐列表对不对,得到从预测评分矩阵中。
09:04
提取得到用户推荐列表,呃,那当然我们需要creating去做一个转换操作,首先大家会想到你这个评分评评出来的有可能有大有小,我一开始可以先给一个门槛条件,比方说,呃,我如果要是不设太大的门槛的话,大家会想到有可能你那个还有可能有负的,所以我是不是至少应该让它先大于零啊,所以这里边得到的这一个就是这个,大家会想到这个predict,呃,Predict得到的是什么呢?是不是又是一个RA类型的RTD啊?呃,那么我需要对它里边的每一个元素。它的RA是不是可以给他做一个筛选条件,比方说这里边只取大于零的,大家如果说我想只取大于三的,大于二的都可以,对吧?啊,你做做这个预筛选。
10:06
然后接下来筛出来之后,那就可以去做转换了。呃,大家首先可以想到我们之后要去做选取的时候,是不是要按照每一个用户ID,然后去选它的一组评分啊,呃,对应的那个物品的评分,那所以我是不是应该把它转换成一个什么样的形式呢?最好是把它转换成。对,User ID是一个key,然后后边的东西全全放到后面去,转换成这样的格式,我们是不是后边就可以group by k了,哎,这样的操作啊,思路是这样的一个思路,所以我就把本来这里边的是每一个RA,把它转换成什么呢?转换成这样的一个元组,对ra.user放在最前面,后边是不是就是其他的product和它的那个评分都放到后边去合成一个元组啊,还是叫ra.product。
11:12
另外还有对应的。RA点,哎,这就是ra.ra了,对不对?呃,因为本身的这个RA数据类型,它里边的那个评分是不是就叫RA啊,所以我们这里边是ra.ra啊,大家知道就可以了,这个数据格式是不是就跟我们定义好的样例类是不是非常像了呀?我们最后是不是就对这个user ID做一个聚合,后边得到的就是它对应的那个列表了,然后转换成我们这个样例类的形式,最后写到mango里面就可以了,这是我们整体的思路,好做了这一步转换之后,对接下来group by。Group by k是不是直接直接就可以了,按照我们这个user ID去做一个聚合啊,接下来再去做一个转换,大家会想到我我这里边是不是就是要去把它先按照评分去做排序,聚合起来之后按照评分去做排序提取,对前20个,然后最后是不是还要包装成我们想要的那个样例类的格式啊,主要就是做这样的一个操作,那我们这里边用一个模式匹配的方式来写吧,呃,这里边case,这里边拿到的是不是一个user user ID后边跟着是他的那个推荐列表啊,Rax对吧?那么我们把它转换成什么样的形式呢?
12:43
最后是不是就要把它转换成一个样例类user xx这样的一个东西,这就是我们的推荐列表对吧?呃,最后我们把这个东西写到mango DB里边就可以,那么这里边里边的东西又是什么呢?对,第一项就是user ID,这个没问题。
13:03
后边这个Rex,哎就比较麻烦了,我们首先想到的是是不是想要对它做一个排序啊,啊大家会想到可以去做一个sal,诶这里边它不能做salt。那可以把它大家会想到是不是可以做一个转换,先把它转成list,因为它有to list的方法,对吧?对,然后我们是不是就可以了。哎,呃,当然我们可以在外面写好啊,我这里边就就大家一行搞定就可以了,对不对?呃,South这里边是不是就需要给一个筛选条件,筛选条件的话可以可以怎么写,对可以对用下划线这样的形式啊,我们用它的哪一个元素去做筛选呢?对,大家注意这里边的Rex里边的每一个元素是不是应该是product和RA这样的格式啊,我们是不是按照第二个RA去做排序,所以是下划线。
14:03
二对吧,呃,对,我们的排序是降序排列,是不是可以用这样的一个模式去写啊。这这个我们之前应该讲过这个算子对不对?好,大家看现在这个还在报错啊,当然后面我们还得去选取前20个,那么我们可以take take,这里边定义了常量,叫做user max recommendation。所以前面这一串其实就是做排序,然后选取,最后是不是要把它再转换成里边的每一个元素,现在还还报错呢。是因为里边的元素我们最后是不是要转换成对应的recommendation这个样类的模格式啊呃,所以最后再做一个map就好了。呃,Map的话,是不是每一个元素X转换成一个recommendation啊,呃,这里边当然就是它的一它的二都传进来,诶这样就不报错了,对吧?但是大家如果看着这个有点长的话,我们可以在前面加一行,把这个先先做一个转换,先先拿出来对吧,后面再把它包装一下就好了,这就是我们最后得到的user RA这样的一个推荐列表。
15:23
那当然我们如果要是还是保存到芒果的时候,要调用data frame的writer去写入的话,还是把它转换成DF,呃就可以了,呃,接下来,呃,这里边我们因为比较少,就就不用单独再去把它提取一个方法了,大家也可以像前面做统计推荐的时候,把它单独提取一个方法来写入到mango DB,对吧?传入参数我这里边就直接写好了,User rex.right。呃,那后边的这些参数是不是跟我们这里面实现都一样啊啊,这里可以直接去照抄。
16:09
这里要注意给的这个collection name,这里就要直接定义好叫做我们叫什么来着啊,就叫user,把它传进来,然后写入就可以了,这就是我们的用户。预测,呃,按照预测评分给出的用户推荐列表,这部分其实思路还是很清晰的,可能就是这做各种转换的时候稍微有点绕,但其实都是常规操作,呃,大家就是把这个看着不明显的话,大家实现的时候把这个拆开,然后一步一步做,应该就会比较明确了,整体来讲还是比较简单的。
我来说两句