请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

als recall 召回

第九章 als recall 召回

val Array(training, test) = data.randomSplit(Array(0.8, 0.2))
training 只包含了80%的数据, 而且可能漏掉部分用户的行为数据;
例如某个用户 user_a, 他在原始的数据集中 有且只有一条浏览的pv记录, 那这个随机的 training dataset 可能没有包含这条记录, 我们用这个 training dataset 来训模型
val model = als.fit(training)// 找到一个最优的

最后我们用这个model 来进行召回, 召回的结果写入hbase
val list = model.recommendForAllUsers(20)

召回的结果list 会包含 user_a 的结果吗?
老师帮忙解释一下这个原理, 谢谢!

正在回答 回答被采纳积分+3

2回答

小简同学 2021-02-22 13:35:55

同学你好,val Array(training, test) = data.randomSplit(Array(0.8, 0.2)),这个式子的意思是将数据集80%作为训练数据,20%作为参考数据,然后将训练数据训练模型,再将模型结果和参考数据对比,比较误差,来检验模型的效果,所以这种训练方式不会只进行一次,要生成多个模型,从中取最好的那个作为最终模型,als有封装这个比较的方法,所以你说的是否会漏掉了某条数据,首先这不重要,因为推荐是个概率的问题,1,2条数据不会影响到整体的概率,其次作为训练数据,数据量要有一定的量才有效果,数据量太小训练出来的模型没有什么意义的。祝学习愉快!

1 回复 有任何疑惑可以回复我~
  • 提问者 森垚27 #1
    小简老师,  我的目的是想理解一下ALS的原理,  在深入讨论下, user_a 对应的user_id是一个 整数, 假设有1亿数据, 最大的user_id 对应的是值是1亿, 假设80% 的数据就是没有user_a 的数据, als 模型为什么会知道user_a 对应user_id的存在, 召回的list为什么不会有user_id 的值 为  1亿 + 1 的数据? 因为就算生成多个模型, 最优的那个模型也只是用80%的数据训练出来的
    回复 有任何疑惑可以回复我~ 2021-02-22 20:26:26
  • 小简同学 回复 提问者 森垚27 #2
    同学你好,als算法简单来说,就是一个用户物品稀疏矩阵约等于用户爱好矩阵和物品属性矩阵的乘积,有推导过程的,als算法就是用交替迭代的方式求出用户爱好矩阵和物品属性矩阵。
    至于你说的als为什么知道用户的user_id,这个是我们传过去的,在生成als实例里,有setUserCol和setItermCol两个方法指明用户id和物品id对应的列,在”als算法在spark上的实现”视频里有详细的代码演示。
    祝学习愉快!
    回复 有任何疑惑可以回复我~ 2021-02-22 23:25:06
  • 小简同学 回复 提问者 森垚27 #3
    同学可能你的意思是说那80%的训练数据没有包含到某个user_id的数据,首先,我们切分的那个数据集是用户物品的打分数据集,是用户对所有物品的打分,表中的一行就是一个用户对一个物品的打分,有10个物品,这个用户在表中就会有10条记录,如果用户对某个物品没有任何的操作,我们可以把它的打分设为0。所以80%的训练数据肯定会取到某个用户对某几样物品的打分,如果还不放心,怕取不到某个用户的打分,可以一个用户对应一个打分表,但很少这样做,因为生成的表太多了。通常都是所有用户对所有物品的打分都集中在一张表里。祝学习愉快!
    回复 有任何疑惑可以回复我~ 2021-02-23 07:43:46
小简同学 2021-02-22 13:59:35

还有你提到的例子,user_a有且只有一条数据,在召回的list是否包含user_a的数据,首先肯定包含,但你这个例子没有意义,user_a的数据量太小,训练出来的模型没有意义。正如上面所说的,随机取80%的数据作为训练数据,如果担心训练数据量小,那就取90%,而且不止取一次,然后根据模型的评估指标,例如均方差,来取最优的模型。祝学习愉快!

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信