00:00
呃,接下来我们需要做的事情是把对get RM SE搞定,那么这个get r RM SE怎么样去实现呢?首先里边我们应该传入这个model,它的类型大家看它已经自动自动给我们弹出来了啊,是matrix factorization model是不是就是M里面定义的这个模型啊,对吧,这个类型。然后后边还应该传入一个test data,我们这里面就叫data吧,它是一个reading类型的RDD,它是不是应该有一个返回值。这个时候RSE应该有一个返回值,应该是一个什么类型的返回值啊?对,要做这种各种各样的那个计算,军方跟误差肯定是一个double。那么接下来我们可以把它做一个具体实现,呃,大家会想到首先我是不是应该得到那个预测评分啊,对吧?所以那预测评分的时候是不是首先应该构建user product。
01:11
就是我们前面讲到的,呃,那个空的评分矩阵,先要构建这个得到预测评分矩阵,这个空矩阵。怎么拿到呢?从哪里拿到呢?大家想一想,User product之前我们是已经拿到了user r DD,拿到了product r DD,然后做了一个D卡机,那么在这里其实我们根本就没必要再去做这个事这个事情了,因为我们要做的是预测数据集的一个评分矩阵,那么预测集里边这个data里边,对是不是就应该包含着所有的用户和product对应的那个元组啊,啊对,我们就是要让他传进来去做预测的嘛,所以直接从里边取就可以了,当然本身的这个data里边,它本身是个三元组RA类型,是不是三元组啊,还除了user和product之外,还带着一个评分,那就是本身测试集里面带着真实评分的,那我这里边是不是就把它去了就完事,三元组换成一个二元组就可以了,所以定义一个user product。
02:28
Data,做一个map。呃,这里面是不是每一个item要把它转换成对一个二元组,这个二元组是不是应该是item的。User,对,然后item的。是不是只要把这两个拿出来就可以了?大家可能会有问题说诶,你这里边怎么不能用那个下划线那种形式来表达了呢?呃,对,大家注意这里,这里的item是我们那个RA的样例类对吧?啊对,所以你不能用原组的那种,呃,取取值的形式去表达,给大家复习一下就好,然后接下来有了user products是不是就可以做预测评分了,Predict。
03:18
他是不是用model点。是不是可以model.predict啊,里边传入user products去做预测,就可以得到我们每一个用户对于每一个商品的预测评分。好了,那接下来就可以。按照公式计算RM。呃,那这个计算的过程其实还不是特别的简单,因为大家会想到这里边是不是还要去统计他们所有的那个,因为均方跟误差嘛,还要对求和,然后还要做这个呃,平均数的计算,然后对,所以大家会想到要不我就去做一个累加,要不啊大家可以看到啊,我这里边可以是不是还是可以用我们这个表的这种计算方式,把它做一个聚合啊,怎么样聚合呢?我可以按照大家想一想,可以按照什么样的东西去做聚合。
04:30
因为我们最后其实要算的就是每一个用户他的。诶给诶,因为大家看这个我们的这个公式啊,对应的是不是就是里边所有的。用户和这个商品他们他们之间的这个二元组对应的一个评分,然后所有的这个评分做一个平均数计算,那所以我们这里面是不是可以用user ID和user ID和product ID这个二元组作为K,然后去做一个group by,再能想到这样的一个运算方法吗?
05:17
这样group by起来之后,后边对对应的内容,呃,不是不是做group by啊,就是我们是不是可以做一个表的连接操作啊,就是把每一个用户的ID和一个按照这个product商品的ID,我们去做一个对应的这个连接操作,然后是不是就可以得到他们对应的真实值和对应的预测值。然后就可以计算他们之间的误差。然后把每一个都统计出来之后,就可以把你该上去上,该求平均数,求平均数,诶这样就可以直接去做计算了,所以这里大家注意一下。我们首先是要得到预测值和实际值对吧?那么预测值我们争取把它要包装成一个什么样的形式呢?
06:11
首先我们看真实值吧,真实值应该在哪里?真实值用这个observed观察到的RA啊评分来看,它应该在哪里,真实值在哪里。真实值在在这个RA里吗?是不是就在data里啊,传进来的这个测试数据里面是不是包含了真实值,所以我们用这里的data塔去做一个转化,我们想要把它转化成什么样的形式呢?每一个元素都把它转换成。对,都转换成一个元组,什么样的元组就是item的user ID加上。的product ID这个作为一个元组。我们后边要以他为K去做表之间的连接,那是不是就可以得到对应的这个用户对这个物品的评分,它的实际评分和预测评分是不是就都得到了,就把实际评分和预测评分放在一起了,对吧?呃,这是可以用这样的方式去做一个。
07:18
就是这个处理的,那后边应该放着的是它的评分对不对item点。所以大家会看到前边就是user ID和product ID,后边是它的实际评分,那同样我是不是可以按照这样的模式对再来一个预测评分啊,我这里给一个叫做predict。那么它是不是应该从哪里去取,它就不能从data里面去取了,对吧?我是不是应该从predict里面去取?拿到的同样还是一个,这里边返回的predict是不是还是一个RA类型的RDD啊,所以跟上面这个处理是不是一样,还是每一个item拿出来user ID product ID,哎,作为K我们放在前面的这个二元组里边,后边它的RA是不是就代表了预测评分?
08:20
接下来我们按照这样的一个K做一个连接表,连接是不是后边的这个RA,我们就把它的真实值和预测值同时拿到了啊,接下来就可以做计算了,这是我们的一个思路啊。所以这里是。首先。Bob。预测评分和实际评分表做一个连接,按照呃,就是以这个什么为K呢。
09:05
意义,对user ID和product ID做一个连接啊,这是我们想要做的事情,好,那呃已经,但大家看已经就是有了这样的一个操作之后,接下来我们是不是就可以把他俩join应起来,然后去呃按照公式去做计算了,呃,所以大家先想一下这个join应该是一个什么样的join应呢?哎,是不是就是应该是一个应转一个内连接啊,是不是我对应的每一个user和每一个product,它对应的这个就是真实值和预测值都应该有啊呃,你不能只有一个空的还保留下来,对吧?所以这两项是都必须要有的,那直接join语是不是本身默认就是一个内连接inner draw对吧?好,所以接下来里边给进来的应该就是predict join完成之后是不是就可以去map一下了,Map操作这里边我们给一个case啊。
10:11
得到的这个结果应该是什么样子呢?做完join之后操作,做完连接操作之后得到的是前边是K对吧,是一个呃呃,不是啊,是应该是一个user ID。和product ID,这是我们的K,后边应该是一个啊,是不是实际值和预测值啊,因为我们是用实际照应的预测啊,所以后边得到一个实际值actual和预测值predict,呃,为了跟外面区分,我们就叫pre吧,得到这样的两个东西之后。对应做一个什么操作呢?对,就可以算这个误差了,那么error就应该等于A减去pre啊,那大家会想到最后我是不是应该返回它的平方,最后去求和啊,所以这里边直接返回平方,直接是不是error乘error就可以了,是不是这样,这样就做完了这个平方的操作,误差平方的操作我们要算的是均方跟误差,所以他后面应该还得求和,诶这里不用求和了,大家看到是不是直接有M啊。
11:31
这是不是就是均值,哎,所以直接把均值就求出来了,算完这个均值之后是不是还应该啊算一个平方根啊,所以算平方根的话,我们可能得去调用一个SQRT这样一个函数,对吧?呃,我们直接引入这样一个函数去做计算,那这里边我们应该是先把均值求出来之后,是不是再开根号啊,大家看一下这个RMSE的计算公式。
12:05
对,他是军方跟对吧,呃,所以是先求了这个,呃,军方,然后再开根号这样的一个,呃对,这个跟经验风险的表达式不太一样,当然如果我们从这个设计的角度来讲,你用这种模式计算也可以,是不是把这个提到外面来,只是差一个常数项啊,那其实区别也不大,所以说这个大家就是。呃,就是理解清楚就可以,我们把外这个SQRT放到外层那里边做这样的一个计算,这就完成了我们军方跟误差RVSE的一个求解。呃,那么呃,这就是这部分内容,大家看现在我们把这个trainer已经跑完之后,看起来是一切正常啊,呃,但是因为当时我们这个没有调日志级别,所以信息比较多,大家自己跑的时候可以把这个调整一下哦,大家看到在这里是不是有一个输出,这个有点看的不是很明显啊,所以我们得到的最后这个最优的参数是什么呢?
13:12
呃,得到的这里边输出的rank是五,然后呃,拉姆达是0.1,中间的这个后边得到的RMSE是1.3057啊,当然了,这个呃,其实并不是特别的常见啊,就是跑一遍之后居然非常小的这个5RANK等于五是最优参数,呃,大家可能知道,因为我们这个数据本身也有限,而且在这里边会去做一个随机的数据集的划分,所以每一次可能大家跑出来这个结果不一样,如果我再跑一遍,有可能不是这个结果了,再所以大家可以看一下这个结果啊。
我来说两句