00:00
呃,我们首先回忆一下在基于云语义模型的协同过滤推荐里边核心算法过程,呃,这里边就不用todo了,大家可以想到在这个过程当中,其实主要就是一句as.train就把它搞定了,那这里边我们是当时是直接给了一些经验参数,直接拍脑袋给了一些参数,那得到的这个模型到底好不好呢?这是不是就是我们应该选取的最优参数呢?这当然就是一个问题了,对吧?呃,那这个问题怎么样去解决,这就提到了我们之前讲的模型评估,这里面在做模型评估的时候。如果是。评分预测的话,我们有一个基本的指标,是不是可以用RSE或者是Mae这样的指标去判断它到底预测的准不准啊,这是一类,另外还有一类就是我们可以收集用户反馈,然后来看预测的准确率和呃,精确率和召回率这样的一些指标,那在这里呢,我们就给大家看一下,因为这是一个评分预测评分的一个问题,我们用到的评测指标是什么呢?
01:11
就应该是RMSE,呃,大家可以回忆一下RMSE的一个计算公式是什么呢?其实非常简单,是不是就是均方跟误差嘛,R1就是,所以就是我们有这个预测的平分值,有实际的平分值两个一减,得到它的误差平方,求和,求平均数,最后再开个根号,就是所谓的均方根误差RMS,好,那接下来我们就在这个包里边啊,给大家新建一个class,那当然这里边既然是模型评估,我们也就是跑一下去把它算出来就可以了,也是一个单立对象。我们叫as trainer。给个名字。
02:00
呃,那么在这个里边我们就不去创建对应的一些样例类了,因为在同一个包底下,我们直接引用前面营运一模型离线推荐里面的内容就可以,对吧?呃,这里边我们就是把基本的东西给大家定义出来就好,首先内函数里边啊,那该有的东西我们还是抄过来吧,内函数里边就是直接抄,对,其实这一部分很简单啊。数据加载,大家想到这是不是也一样啊,一直可以超到数据加载这一步啊,所以。这部分直接copy过来。好,这里边我们就直接用offline recommender里边的这些定义就好,呃,大家会想到在后边我们去用这个as算法做英语模型的训练的时候呢,是要把这个rating类型是不是转换,就是把这个rating数据要转换成ML lab里边的RA类型啊,那大家可能会想到,何必这么麻烦呢?我前面是不是在这里直接一转,是不是也就完事了呀?啊,所以这个工作我可以直接放到这里来做。
03:11
诶,这样是不是就可以了啊,当然这里如果我们没有定义的话,需要把它再做一个引入。这样转换出来之后的结果是不是就是一个RA类型的RDD啊,这就是符合我们LS点缀需要的那个数据结构。呃,然后接下来可能会不太一样的是,我们要做模型评估,那前提是我们能我我们能用这个训练数据。接着对模型进行评估吗?进行评测吗?我们用同一份儿数据可以吗?呃,大家已经忘记我们之前讲到的这些概念了,是不是?呃,就是当时我们曾经说过,对,是不是应该要划分训练集和测试集啊,所以在这里其实就遇到了这样一个问题,我们如果用训练集,你指定了这个训练集,然后给定这些参数去训练的话,那训练出来的结果再把它套到那个RMSE的计算里边,这个显然是。
04:19
呃,显然是不能说明问题的,对吧?我们其实想要去考察他到底好不好,到底哪个模型这个参数更优,其实是要看他在测试集上的表现的,而不是说你就是用自己的那个数据去看,所以一开始我们首先要做的是对数据集的切分。切分成训练级和测试级啊,那这里面我们用什么方式呢?其实也很简单啊,我们定义一个split,调用RDD,有一个叫做random split的一个方法啊对,随机切分对不对啊,它里面的参数大家看到其实要传一个数组的,这个数组就代表它的权重,对吧?Double类型的数组传进去就可以,那我这里边是不是就可以。
05:17
直接指定就好了,比方说我们可以三七开二八开对吧,这里边0.80.2,这是一个二八开的。训练集和测试集,那然后我就可以定义呃,Training。RDD,它就应该等于是不是前面切分好的splits这个数组里边的第一个元素啊,大家看到这个random split它返回的是不是一个RDD的数组啊,对,所以我们可以把它第一个元素返回作为训练,那么第二个testing r DD是不是同样取这个SP里边的第一个元素就好了?
06:03
训练集和测试集的划分好,那接下来大家就会想到我可能要选取一组参数,可以取得这个参数列表,然后挨个把那个训练放到用,用这个训练级的数据应用这些参数,对吧?去得到模型,然后再用测试级的数据对进行测试,算一下它的RMSE哪个最小,对应的那一组参数就是我们的最优参数,对吧?那这是我们整体的一个思路,那这里面可能会比较复杂,所以我这里边给一个呃,核心实现。就是输出最优最优参数,这里边就用一个包装成一个函数吧,叫adjust。Als。
07:02
这里面需要的参数是什么呢?这里面需要的参数是什么呢?啊,大家就会想到这里面可能需要对本身需要我们的那那一组参数啊,这组参数我干脆就放到它里边去,去直接指定好了,那另外要传入的对是不是就是训练做模型的训练测试集,做最后的评测对吧,计算RSE,所以这里边就把training r DD和testing r DD传进去就好了,最后做完了。关闭。呃,Stop,呃,Spark对吧,就可以了,所以接下来我们关键是要实现这个函数just as parameter,呃,那这里边它的参数是两个RDD,我们前面还是把它叫做train data,后边叫做test data。
08:05
啊,那么这个RDD。我们把它引入。他应该啊,我们这里边如果只是直接把它这里做一个这样的调用的话,那就是把对应的参数直接输出到控制台里边就好了啊对,所以那么这里边我们就不需要去给这个指定返回了,好,那大家看一下接下来我们里边是不是应该去做一个for循环啊,For循环便利一组参数的取值,然后对应去做训练,然后做测试计算RSE得到的结果保存起来就可以了,对吧?所以这里边我可以直接定义一个result的这样一个结果。呃,它应该等于什么呢?用一个for循环去做啊,参数的便利这里边啊。
09:01
他这个就是我没有手动输出吗。呃,当然这里边就是如果我们没有在外面定义好的话,这里面就可以就相当于在这里直接指定,比方说我直接指定两个数组rank,我在哪里取呢?呃,我直接给一个数字RA在这个范围里面去取,大家知道这样的一个写法,对吧?SC里面后循环的一个写法,那么后边的这个取值,比方说我随便定义一下啊,二十三十。五十一百啊,这个这个你随便可以给对不对啊,这个就是按照自己的这个想法去取,但是大家如果觉得这个取的太多的话,我可以先给少一点啊,五十十二十,我给个50吧,呃,大家可以想一下这个选取怎么样的一个参数,它最后的这个RSE会小呢?呃,等一下看到结果大家就知道了,那然后除了rank之外还有其他的参数,比方说还应该有这个LA达,这是正则化系数对不对?那这个LA达我们也可以直接用一个,大家可以在外层把这个数组直接定义出来,这里就传进来就好了,对吧?那这里我就简单写了啊,大家知道这个参数怎么样取就可以,比方说这里边我就取10.1。
10:24
0.01啊,这是不是也是一组参数啊,这里面我就直接电立。数组中定义的参数取值。呃,这里边我没有,呃大家看到还有一个参数是那个迭代次数inter,呃,那个我们认为可能,呃在这里面你想让他准的话,你就取得更大一点,对吧,或者我们这里边直接指定。
11:00
就可以了,所以这里边没有详细的再把它也列进来,大家如果想做的话,可以再加进来啊,那后边当然就是应该去看这个放循环,循环体里边做什么事情了,但是这里注意一下我们最后这个result。是不是希望把每一次循环的结果对应的那个MSE都算出来,都存一下呀,诶我们这里面有一种简单的写法,怎么样去存储循环,每一次循环里边的中间结果呢?对,是不是可以用这个I去做一个。这个关键字是不是就表示把放循环里边每一次循环的中间结果都保存下来啊,然后里边这就是一样的事情了,是不是先训练一个模型als.train啊,这里如果no。我们先把as引入,然后后边就会有他的train方法,我们传进来的数据应该是train data对吧,那后边给一个rank啊,第三个参数我这里直接写死吧,比方说前面我们给的是多少哦,十,我这里面就给的一样吧,都给十,然后后边是拉姆达把这几个参数给定,训练出来模型之后。
12:22
是不是就可以去计算RSE了啊?得到预测评分矩阵就可以得到RSE了,这里面我还是定义一个函数吧,计算RSE的函数,比方说这里叫get RM SE。这里要传的参数,当然就是要把这个model也得传进去,因为我们要用它来做预测评分,呃,获取到预测评分,那对应的是不是应该把测试数据传进去啊,Test data啊,这是我们的两步,最后中间结果我们保存什么呢?当前的参数rank和lada,另外还有当前的对RMSE。
13:05
那这个函数我们最后其实放循环结束之后,是准备要直接输出到控制台的啊,那当然就是直接来一条printline对吧?那print什么呢?把result里边我们关心的是不是就是它RMSE最小的那条数据啊,就是我们对应的最优参数,所以大家看这里可以直接输出一个明白。那么拜哪一个元素呢?对,它对应的第三个元素,也就是我们这里的RMSE做一个输出就可以了,对,当然大家可以都可以输出,你看看他的那个大小关系是什么样的啊,我这里边就是只把这个输出就可以啊,你可以做一个那个for each,把它做一个结果的输出,对不对?好,那么这里边就是按照。RMSE排序并输出最优参数。
我来说两句