shenweichen / DeepCTR

Easy-to-use,Modular and Extendible package of deep-learning based CTR models .
https://deepctr-doc.readthedocs.io/en/latest/index.html
Apache License 2.0
7.53k stars 2.21k forks source link

DSIN模型示例的一些疑问 #254

Open laizef opened 4 years ago

laizef commented 4 years ago

Please refer to the FAQ in doc and search for the related issues before you ask the question.

Describe the question(问题描述) 您好,我不是做推荐的,所以对DSIN的数据处理部分不是很熟悉。看着示例只能去猜测每一项的含义,猜了两天还是跑不起来,所以只能提问了:

1.代码26-30行的uid,ugender,iid,cateid,score等变量是不是可以认为是一张长度为3表中的各个属性,46行的y对应这张表的标签值? 是否意味着uid行允许重复——当一个用户被多次采样,也将允许他的id在uid行中出现多次?

2.假设uid行允许重复时:32-36行的sess1,sess2是与用户id对应的,还是与表中行对应的?比如,一个用户0被采样10次,uid=[0,0,0,0,0,0,0,0,0,0],这时候这个用户对应的sess会出现1次还是10次?如果按照出现10次的话内存会爆炸;如果按出现1次来的话,就不知道26-30行怎么解释了。

laizef commented 4 years ago

看了相关代码,发现自己的问题有些低级,来自问自答吧:

  1. 是的。
  2. sess1, sess2……也是表的属性,所以是与用户id对应的。DSIN代码中有一步数据预处理:只收集最近5个sess的历史记录,每个sess只收集最后10条记录。所以内存压力没那么大。如果没有这一步,sess部分会有很多无意义的padding。

羞愧羞愧,还是需要提升自身水平。。

gjq718 commented 4 years ago

你好,我有些问题,关于y=【1,0,1】 这个预测到底预测的是哪个项,我理解的是sess1的第一个列表全部都是用户0的历史交互数据,那y标签的是哪一个项?

laizef commented 4 years ago

你好,我有些问题,关于y=【1,0,1】 这个预测到底预测的是哪个项,我理解的是sess1的第一个列表全部都是用户0的历史交互数据,那y标签的是哪一个项?

sess1指的是所有用户的倒数第一次会话,sess2指所有用户的倒数第二次会话……以此类推。 参见DSIN源码中的数据处理部分https://github.com/shenweichen/DSIN/blob/3aed7819e47f0463f12ab78cc2589cacf1081745/code/2_gen_dsin_input.py#L100, 在100-112行。这里做的是把表中的一行进行查表,得到每个用户的sess信息,再将每一个会话信息放入一个sess数组中。

把输入写成这样的形式,应该就清楚了: uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 1 1 2 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 1 0 2 0 3 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 0 1

gjq718 commented 4 years ago

谢谢,我还有疑惑,对于给的例子数据 uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 标红的1作为用户0标签,它标记的是用户点击那一项的概率,正常来说用户一次交互都有一个标签代表有没有点击,平常的数据集也没太见过这种类似方式的 如果我用自己的数据集比如Movieslens,那y那一列我该怎么写,因为movieslens都是用户交互一个项 有一个标签,比如交互200个项有200个标签,sessi之后那y那一列只能写一个数,那这时他标记预测的哪一项呢 期待您的解答,我困在这出不去了

guojq718

guojq718@163.com | 签名由网易邮箱大师定制 在2020年8月6日 11:42,laizefnotifications@github.com 写道:

你好,我有些问题,关于y=【1,0,1】 这个预测到底预测的是哪个项,我理解的是sess1的第一个列表全部都是用户0的历史交互数据,那y标签的是哪一个项?

sess1指的是所有用户的倒数第一次会话,sess2指所有用户的倒数第二次会话……以此类推。 参见DSIN源码中的数据处理部分https://github.com/shenweichen/DSIN/blob/3aed7819e47f0463f12ab78cc2589cacf1081745/code/2_gen_dsin_input.py#L100,100-112行。这里做的是把表中的一行进行查表,得到每个用户的sess信息,再将每一个会话信息放入一个sess数组中。

把输入写成这样的形式,应该就清楚了: uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 1 1 2 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 1 0 2 0 3 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 0 1

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

laizef commented 4 years ago

谢谢,我还有疑惑,对于给的例子数据 uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 标红的1作为用户0标签,它标记的是用户点击那一项的概率,正常来说用户一次交互都有一个标签代表有没有点击,平常的数据集也没太见过这种类似方式的 如果我用自己的数据集比如Movieslens,那y那一列我该怎么写,因为movieslens都是用户交互一个项 有一个标签,比如交互200个项有200个标签,sessi之后那y那一列只能写一个数,那这时他标记预测的哪一项呢 期待您的解答,我困在这出不去了 | | guojq718 | | guojq718@163.com | 签名由网易邮箱大师定制 在2020年8月6日 11:42,laizefnotifications@github.com 写道: 你好,我有些问题,关于y=【1,0,1】 这个预测到底预测的是哪个项,我理解的是sess1的第一个列表全部都是用户0的历史交互数据,那y标签的是哪一个项? sess1指的是所有用户的倒数第一次会话,sess2指所有用户的倒数第二次会话……以此类推。 参见DSIN源码中的数据处理部分https://github.com/shenweichen/DSIN/blob/3aed7819e47f0463f12ab78cc2589cacf1081745/code/2_gen_dsin_input.py#L100,100-112行。这里做的是把表中的一行进行查表,得到每个用户的sess信息,再将每一个会话信息放入一个sess数组中。 把输入写成这样的形式,应该就清楚了: uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 1 1 2 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 1 0 2 0 3 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 0 1 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

我分个点回答:

1.

标红的1作为用户0标签,它标记的是用户点击那一项的概率,正常来说用户一次交互都有一个标签代表有没有点击,平常的数据集也没太见过这种类似方式的

抱歉我对推荐的场景不太了解,没有理解这句话。关于DSIN里的用户交互历史和标签,您可以看看DSIN论文的实验部分、实验源码和实验数据。他们用第1-7天的用户行为作训练集;第8天的用户行为作测试集;第1天之前的200条用户浏览、购买记录作会话数据。会话数据里面只有正面的记录,如用户收藏、购买、加入购物车等,处理的时候都一视同仁;训练集和测试集则包含了正面和负面的记录,表示用户是否点击。 所以我这里也有点疑惑,如果我们的会话数据包含了负样本,又该怎么处理。我尝试了一些方法都没有效果。如果您解决了这个问题,也希望可以告知,我也卡在这里了。

  1. 如果我用自己的数据集比如Movieslens,那y那一列我该怎么写,因为movieslens都是用户交互一个项 有一个标签,比如交互200个项有200个标签,sessi之后那y那一列只能写一个数,那这时他标记预测的哪一项呢

(1)Movieslens好像是用户评分数据吧,这里的模型做的是分类任务,可以做打分预测吗? (2)DSIN将数据根据时序划分为会话数据、训练数据和测试数据,训练数据和测试数据是有标签的但是会话数据没有。一个用户的一条训练数据可以写成表的一行,y值就是对应的标签。比如,训练数据里面,用户0做了两次交互,这两次的cateid分别是1,2,标签值分别是1,0,则可以写成两行: uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 0 0 1 2 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 0

gjq718 commented 4 years ago
太谢谢你了,我看懂你的说明了。 对于session负样本的问题,session里应该是规定了只能是正样本,而且必须是正样本,因为session里相当于装的是你的兴趣偏好,这是你的依据,如果session里有负样本,这个负样本就相当于噪声,严重混淆你的判断,所以如果存在负样本的话应该剔除,只保留正样本,这是我的理解。 guojq718

guojq718@163.com | 签名由网易邮箱大师定制 在2020年8月7日 10:20,laizefnotifications@github.com 写道:

谢谢,我还有疑惑,对于给的例子数据 uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 标红的1作为用户0标签,它标记的是用户点击那一项的概率,正常来说用户一次交互都有一个标签代表有没有点击,平常的数据集也没太见过这种类似方式的 如果我用自己的数据集比如Movieslens,那y那一列我该怎么写,因为movieslens都是用户交互一个项 有一个标签,比如交互200个项有200个标签,sessi之后那y那一列只能写一个数,那这时他标记预测的哪一项呢 期待您的解答,我困在这出不去了 | | guojq718 | | guojq718@163.com | 签名由网易邮箱大师定制 在2020年8月6日 11:42,laizefnotifications@github.com 写道: 你好,我有些问题,关于y=【1,0,1】 这个预测到底预测的是哪个项,我理解的是sess1的第一个列表全部都是用户0的历史交互数据,那y标签的是哪一个项? sess1指的是所有用户的倒数第一次会话,sess2指所有用户的倒数第二次会话……以此类推。 参见DSIN源码中的数据处理部分https://github.com/shenweichen/DSIN/blob/3aed7819e47f0463f12ab78cc2589cacf1081745/code/2_gen_dsin_input.py#L100,100-112行。这里做的是把表中的一行进行查表,得到每个用户的sess信息,再将每一个会话信息放入一个sess数组中。 把输入写成这样的形式,应该就清楚了: uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 1 1 2 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 1 0 2 0 3 2 ... [0, 0, 0, 0] [0, 0, 0, 0] 0 1 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

我分个点回答:

标红的1作为用户0标签,它标记的是用户点击那一项的概率,正常来说用户一次交互都有一个标签代表有没有点击,平常的数据集也没太见过这种类似方式的

抱歉我对推荐的场景不太了解,没有理解这句话。关于DSIN里的用户交互历史和标签,您可以看看DSIN论文的实验部分、实验源码和实验数据。他们用第1-7天的用户行为作训练集;第8天的用户行为作测试集;第1天之前的200条用户浏览、购买记录作会话数据。会话数据里面只有正面的记录,如用户收藏、购买、加入购物车等,处理的时候都一视同仁;训练集和测试集则包含了正面和负面的记录,表示用户是否点击。 所以我这里也有点疑惑,如果我们的会话数据包含了负样本,又该怎么处理。我尝试了一些方法都没有效果。如果您解决了这个问题,也希望可以告知,我也卡在这里了。

如果我用自己的数据集比如Movieslens,那y那一列我该怎么写,因为movieslens都是用户交互一个项 有一个标签,比如交互200个项有200个标签,sessi之后那y那一列只能写一个数,那这时他标记预测的哪一项呢

(1)Movieslens好像是用户评分数据吧,这里的模型做的是分类任务,可以做打分预测吗? (2)DSIN将数据根据时序划分为会话数据、训练数据和测试数据,训练数据和测试数据是有标签的但是会话数据没有。一个用户的一条训练数据可以写成表的一行,y值就是对应的标签。比如,训练数据里面,用户0做了两次交互,这两次的cateid分别是1,2,标签值分别是1,0,则可以写成两行: uid ugender iid cateid ... sess2_iid sess2_cate_id sess_number y 0 0 1 1 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 1 0 0 1 2 ... [1, 2, 3, 0] [1, 2, 2, 0] 2 0

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.