推荐系统常见问题(七):惊讶!为什么训练集比例越大,效果越差?_训练集越多,效果越好吗__ dingding_的博客-程序员宅基地

技术标签: # 推荐系统常见问题  推荐系统  

一、苦恼的一周

最近做实验,被一个问题苦恼了一周。本来想要验证算法在40%、60%、80%数据集比例情况下的不同实验效果。结果发现,训练集比例越大,效果竟然越差!!!这和我以往的–训练集越多,训练效果越好的认知完全相违背!!!

然后我开始一个个的排除这样情况的原因:

  1. 先看看是不是我训练集和测试集的弄反了,结果没有反;
  2. 再看看我的实验方法是不是哪里有错误,结果找不出错误;
  3. 然后我又在想我划分数据集是按总的评分数据量随机划分的,或者换成按每个用户留一定比例在训练集,一定比例在测试集的方法划分试试,结果还是训练集比例越大,效果越差;
  4. 简直无奈了,我就想是不是数据集的问题,结果换了几个数据集还是同样的问题;
  5. 最后我不用我自己写的算法了,我用 LibRec 中已经实现的方法看看,结果发现那些算法的结果也是这样,我都震惊了!!!到底是哪里出错了???

二、附上证据

下面附上我跑 LibRec 中已经实现算法的实验结果:

1、证据1:MostPopular方法

首先是最基本的 pop 方法,使用的数据集是 movielens/ml-100kTopN=10,参数配置都是 LibRec 中的默认配置

Training Precision Recall NDCG AUC Novelty AP RR
0.8 0.1902 0.1132 0.1860 0.8809 11.1020 0.11068 0.40134
0.6 0.3107 0.1002 0.2751 0.9560 10.6027 0.1972 0.5676
0.4 0.3949 0.0918 0.3374 0.9944 10.1971 0.2699 0.6476
0.2 0.4538 0.0852 0.3778 1.0115 10.0071 0.3206 0.7045

从实验结果可以看出准确性指标 Precision 以及 AUC 随着训练集数据越少,效果越好,排序指标 NDCG、AP(是MAP)、RR(是MRR)也是随着训练集越少,效果越好,只有 Recall 和 新颖性指标 Novelty 随着训练集越少,效果在不断的下降。

2、证据2:BPR方法

Rendle et al., BPR: Bayesian Personalized Ranking from Implicit Feedback, UAI 2009.

下面换一个经典的 BPR 算法,使用的数据集是 movielens/ml-100kTopN=10

Training Precision Recall NDCG AUC Novelty AP RR
0.8 0.2563 0.1652 0.3101 0.9222 14.8216 0.1864 0.5502
0.6 0.3744 0.1370 0.4141 0.9763 12.6314 0.2702 0.6798
0.4 0.3895 0.1005 0.4196 0.9970 11.1562 0.2671 0.6855
0.2 0.3686 0.0834 0.3890 0.9875 14.5735 0.2495 0.6075

从实验结果可以看出在训练比例大于0.2以上时,准确性指标 Precision 以及 AUC 随着训练集数据越少,效果越好,排序指标 NDCG、AP(是MAP)、RR(是MRR)也是随着训练集越少,效果越好,只有 Recall 和 新颖性指标 Novelty 随着训练集越少,效果在不断的下降。

或者你会问,训练集比例都 0.2了,这训练有啥用???没有训练好进行推荐那不就是随机推荐???所以我看了下随机推荐的结果,随机推荐跟训练集的多少没有关系,完全就是随机给每一个用户进行推荐,压根就不需要训练集,实验结果显示在 movielens/ml-100k 数据集下,它的 precision效果是远远 < 0.1的~ 所以训练还是有些用处的。

3、证据3:CADE方法

Collaborative Denoising Auto-Encoders for Top-N Recommender Systems,WSDM 2016

下面换CADE方法,使用的数据集是 movielens/ml-100kTopN=10,参数配置都是 LibRec 中的默认配置。

Training Precision Recall NDCG AUC Novelty AP RR
0.8 0.1661 0.0977 0.2088 0.8469 20.6802 0.1047 0.3914
0.6 0.2416 0.0735 0.3009 0.9084 20.5823 0.1538 0.4936
0.4 0.2681 0.0572 0.1746 0.9334 21.2737 0.1665 0.5143
0.2 0.2313 0.0363 0.1146 0.9273 24.3241 0.1327 0.4644
从实验结果看来,CADE也一定程度上验证了我的说法是对的,在0.2以上的训练集划分情况下,训练集越大,Precision效果越差。

在这里插入图片描述
在这里插入图片描述
值得一提的是,在CADE这篇论文原文中,是有和 pop 以及 BPR 方法做对比的,但效果和论文中表现的并不一致,在我这里显示的是 CADE 不如 pop 和 BPR方法,当然我我这里用的是movielens 100k的数据集,而原文中用的是movielens 10M 的数据集,同时数据集的处理方式以及参数并没有达到与论文中一致,所以先不纠结这个~

4、证据4

我在最近看的一篇论文中找到了这样一段话,贴上来给大家看看
在这里插入图片描述

5、小结

从以上三个实验结果中,不难得出确实是训练集比例越大,precision效果越差,但是同时也可以发现,recall 效果是越好的,所以如果真的想要验证算法在40%、60%、80%数据集比例情况下的不同实验效果。还是选择 Recall 指标吧。我就先暂时不纠结为什么和我以往的认知不一样了~

三、另外的突发奇想

Biased Matrix Factorization Recommender

我有在思考是不是因为这是TopN推荐的原因,如果是评分预测,是不是会符合这个事实???
下面使用的方法是bias-MF,使用的数据集是 movielens/ml-100kTopN=10,参数配置都是 LibRec 中的默认配置。

Training MSE MPE RMSE MAE
0.8 0.8709 0.9862 0.9332 0.7379
0.6 0.8933 0.9881 0.9451 0.7457
0.4 0.9086 0.9883 0.9532 0.7521
0.2 0.9470 0.9883 0.9731 0.7682

看了结果之后我放心了,评分预测任务并不符合这个这个事实,在这里,训练集越多,效果确实是越好的。(这些指标都是值越小代表越好的)

但如果我要用这个评分预测算法去做 TopN 推荐的话,和之前的结论一样!训练集比例越大,precision 效果越差。而且把实验结果与上面几个算法,比如Pop、BPR、CADE方法比较的话,也验证了我之前提过的推荐系统常见问题(二):可以使用评分预测方法去做 TopN 推荐吗?是正确的,只是利用评分预测方法去做 TopN 推荐的效果不太好而已!

Training Precision Recall NDCG AUC Novelty AP RR
0.8 0.0574 0.0218 0.0475 0.6636 31.0700 0.0180 0.0839
0.6 0.0990 0.0205 0.0783 0.7270 29.6538 0.0371 0.1306
0.4 0.1517 0.0224 0.1439 0.7841 24.6902 0.0884 0.3107
0.2 0.2134 0.0256 0.1931 0.8558 22.9328 0.1339 0.3701

四、总结

综上,我不再纠结是不是我的代码写错了,是不是我应该换个数据集(这里没有写其他数据集,但是验证效果是一样的),是不是我哪里应该调一调,找原因找到自我怀疑!!!然后接着很崩溃!

就像贴的那篇论文里写的一样,如果这是我做实验发现的事实,那论文里写出来就好了!


以上是一家之言,欢迎道友一起交流~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qiqi123i/article/details/105273116

智能推荐

Qt5基于Poppler实现将pdf转成图片-程序员宅基地

本文所用库的资源:链接:https://pan.baidu.com/s/1-F1Gu-ENuFle8wE92h-h5Q提取码:a7tz1,本文库和代码需要在Qt5的32位编译器上运行,如下图所示,如需64位,博主有使用vs2022基于pdfium库的另一项目可供参考(链接)2,此工程流程基本参考另一篇博客(链接),只是在其代码的基础上做了一些修改,定制化了自己的需求。3,所以在此博主仅贴出自己的代码,如需具体流程请参考上述链接。最终工程架构如下图:pdfutils.h#ifndef PDF

Android Manifest 标签解析_源码 androidmanifest_Just_Paranoid的博客-程序员宅基地

每个应用项目必须在项目源设置的根目录中加入 AndroidManifest.xml 文件(且必须使用此名称)。 清单文件会向 Android 构建工具、Android 操作系统和 Google Play 描述应用的基本信息。_源码 androidmanifest

linux的shell脚本下判断一个变量值或字符串是否为整数_shell判断是否是整数-程序员宅基地

在实际的应用开发中,由于shell缺少许多函数库,所以判断字符串是否为整数就不是一件容易的事儿,那么这里介绍一般的用于判断一个字符串是否为整数的方法。原理:利用expr做计算时变量或字符串必须是整数的规则,把一个变量或字符串和一个已知的整数(非0)相加,看命令返回的值是否为0.如果为0,就认为加法的变量或字符串为整数,否则就不是。 i=5expr $I + 6 &>/dev_shell判断是否是整数

【老生谈算法】标准粒子群算法(PSO)及其Matlab程序和常见改进算法——粒子群算法_粒子群算法和改进粒子群算法的区别-程序员宅基地

一、 粒子群算法概述粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒_粒子群算法和改进粒子群算法的区别

基于flask实现的简单博客_基于flask的简易博客-程序员宅基地

github地址:https://github.com/yangzhezjgs/flask_demo/tree/master/blog技术栈: boostrap + flask + sqlalchemy + sqlite3(数据库)python版本: Python3requirement: click==6.7 Flask==0.12.2 Flask-Login==0.4.0 Flask_基于flask的简易博客

Pandas基础教程-程序员宅基地

Pandas基础教程目录基本概念创建Series创建DataFrameDataFrame的属性数据筛选数据更改处理丢失数据导入导出数据DataFrame的合并基本概念:Pandas模块的数据结构主要有两种: -1.SeriesSeries是一维数组,相当于numpy中的一维数组,本身也是基于numpy中的ndarray结构 -2.DataFrameDataFrame...

随便推点

【网管日记】Nginx报错踩坑记录_见见大魔王的博客-程序员宅基地

【代码】【网管日记】Nginx报错踩坑记录。

C++ STL学习(1)--Vector-程序员宅基地

自留自用#include <vector>#include <iostream>#include <algorithm>using namespace std;void showVector(vector<int> iv,int showTimes) //显示向量内容函数{ cout << "This is "<<showTimes<<" vector's content is : "; for

Android中间层分析1.【AMS】进程的启动-startProcessLocked函数分析_android startprocesslocked-程序员宅基地

四个函数final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, bo_android startprocesslocked

六脚自锁开关引脚图及功能定义_6脚自锁开关引脚图-程序员宅基地

上图图二三,四五接通,下图,一二,五六接通。如图所示开关自锁键未按下时连接的是一边;按下自锁键后连接是另一边。连接电路时中间的引脚一般都选择接入VCC。一共两排引脚,一排3个,每边只有一个是有用的,这两个有用的构成开关,其余4个只是起固定作用,至于具体是哪个得用万用表确定。..._6脚自锁开关引脚图

springBoot+Jpa(hibernate)数据库基本操作_spring.jpa.properties.hibernate.dialect-程序员宅基地

Jpa是什么?JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。Spring-data-jpa依赖于Hibernate,具体的示例如下:项目配置在pom.xml中添加相关依赖,加入内容如下:org.springframework_spring.jpa.properties.hibernate.dialect

说一说CS小本找工作的肤浅经验----ustc-程序员宅基地

下面浅谈一些自己这个CS小本找工作的肤浅经验,主要是给08、09的后辈们一些参考。主要包括数据结构、算法、C语言、C++的OOP思想等几个方面。 1.数据结构(1)数组关于数组的题目特别的灵活,比如无序数组中找出最大的2个/K个、整数数组中找最大 连续和等等。《编程珠玑》中有一些很好的讨论,可以读读。 (2)链表链表的各种问题,比如判断是否有环并确定环入口、判断两个