yusanshi / news-recommendation

Implementations of some methods in news recommendation.
MIT License
241 stars 50 forks source link

auc异常高 #13

Closed chen849157649 closed 3 years ago

chen849157649 commented 3 years ago

您好,我自己按照mind数据集格式构造的中文训练样本,在data_preprocess.py中,去掉了nltk那部分,直接使用分词后的词语,每个词embedding通过模型训练得到。其他没做大的修改,训练之后auc基本都在0.98上下,查到了模型预测值,确实是点击过的news值更大,这种异常应该是哪里有问题?谢谢

yusanshi commented 3 years ago

去掉了nltk那部分,直接使用分词后的词语

这个地方我没有理解您的意思,现在的代码用 nltk 包只用到了里面的 word_tokenize 用来分词,“直接使用分词后的词语”是什么意思?

你的结果是在什么数据上测试的啊?(large or small, dev or val)

chen849157649 commented 3 years ago

不是mind数据集,是根据mind格式,构造的真实新闻客户端中文数据集,news.tsv 7ensiXgff7R 历史 中共民国事件 历史^^中国现代史^^tp_13386^^上海公报^^1972^^三联生活周刊^^彭迪^^周总理^^唐龙彬^^罗杰斯^^基辛格^^尼克松^^总理^^中方^^夫妇^^熊猫^^夫人^^大熊猫^^海洋^^握手^^美国^^长城^^周恩来 跨过^^握手^^访华^^辽阔^^??^^尼克松^^周恩来^^1972^^海洋 7ezU1wDzkRU 历史 国外历史事件 历史^^历史其他^^tp_12280^^世界新闻报^^哈里曼^^斯大林^^罗斯福^^大使^^金唇^^窃听器^^国徽^^克格勃^^冷战^^特工^^办公室^^间谍^^礼品^^典礼^^美国大使馆^^苏联^^美国^^莫斯科^^克里米亚 谍战^^黄金时代^^美国大使馆^^内藏^^苏联^^国徽^^窃听器^^冷战 7gHCSylcU55 房产 家居装修 房产^^家居装修^^现代简约^^大户型^^书房设计^^沙发^^客厅^^阳台^^餐桌椅^^餐厅^^客厅设计^^房间^^智能家居^^主卧^^书房^^书架^^风格 美观^^现代简约^^打造^^20万^^实用^^140^^风格^^大户型 在data_preprocess.py改了对应的代码,如下: 企业微信截图_20210601222223 其他地方没做修改,训练后auc,不管是在训练集还是验证集上都0.98上下,觉得有问题,但是又差不多原因。

yusanshi commented 3 years ago

看起来 split 的逻辑没啥问题,我也不清楚了。 如果不是 val/test 的较多数据已经在 train 中出现这样的泄漏问题,可能就是数据集本身的“难易程度”的问题了吧。

chen849157649 commented 3 years ago

找到原因了,是因为我把当前点击item提前放到用户的点击历史了。另外发个错误,但是代码依然能运行 你在evaluate.py文件中

https://github.com/yusanshi/NewsRecommendation/blob/master/src/evaluate.py#L239 做了转置操作,那这样的话clicked_news_vector形状:训练时batch_size, num_clicked_news_a_user, num_filters,测试验证是形状num_clicked_news_a_user,batch_size, num_filters,这两者不一致了。请教一下原因,多谢。

yusanshi commented 3 years ago

https://github.com/yusanshi/NewsRecommendation/blob/master/src/evaluate.py#L235-L239 这里的代码运行完,clicked_news_vector 的 shape 确实是 (batch_size, num_clicked_news_a_user, num_filters),如果没有 transpose 的话就成了 (num_clicked_news_a_user, batch_size, num_filters),这个你可以 debug 下验证下。当然,把外层 torch.stackdim 设成 1 也能避免 transpose。

之所以出现这样的问题还是因为 minibatch["clicked_news"] 的“shape”实际上是 (num_clicked_news_a_user, batch_size),这个应该是跟 pytorch DataLoader 的实现逻辑有关。

chen849157649 commented 3 years ago

我昨天发现了,这个问题,是DataLoader的问题,所以关闭了问题,谢谢你,另外问下模型最终预测的结果是概率值,越大越好,可debug发现有时候结果值是几百,几十,有时候是很小很小的值。发自我的华为手机-------- 原始邮件 --------发件人: yusanshi @.>日期: 2021年6月4日周五 中午11:50收件人: yusanshi/NewsRecommendation @.>抄送: chenguitao @.>, State change @.>主 题: Re: [yusanshi/NewsRecommendation] auc异常高 (#13)

https://github.com/yusanshi/NewsRecommendation/blob/master/src/evaluate.py#L235-L239 这里的代码运行完,clicked_news_vector 的 shape 确实是 (batch_size, num_clicked_news_a_user, num_filters),如果没有 transpose 的话就成了 (num_clicked_news_a_user, batch_size, num_filters),这个你可以 debug 下验证下。当然,把外层 torch.stack 的 dim 设成 1 也能避免 transpose。

之所以出现这样的问题还是因为 minibatch["clicked_news"] 的“shape”实际上是 (num_clicked_news_a_user, batch_size),这个应该是跟 pytorch DataLoader 的实现逻辑有关。

—You are receiving this because you modified the open/close state.Reply to this email directly, view it on GitHub, or unsubscribe.

yusanshi commented 3 years ago

另外问下模型最终预测的结果是概率值,越大越好,可debug发现有时候结果值是几百,几十,有时候是很小很小的值。

这个问题,是因为模型用的 loss 是 nn.CrossEntropyLoss,它已经包含了对原始输出(logits)的 softmax 操作,所以在 model 代码里就没有了 softmax 层;而在 evaluate 的时候,真实的概率分布输出也应该对 logits 做 softmax 才对,但由于 softmax 保单调性,所以对结果 metrics 没有影响,因此就省略了 softmax 操作。