技术标签: # 推荐系统常见问题 推荐系统
最近做实验,被一个问题苦恼了一周。本来想要验证算法在40%、60%、80%数据集比例情况下的不同实验效果。结果发现,训练集比例越大,效果竟然越差!!!这和我以往的–训练集越多,训练效果越好的认知完全相违背!!!
然后我开始一个个的排除这样情况的原因:
下面附上我跑 LibRec 中已经实现算法的实验结果:
首先是最基本的 pop
方法,使用的数据集是 movielens/ml-100k
,TopN=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 随着训练集越少,效果在不断的下降。
Rendle et al., BPR: Bayesian Personalized Ranking from Implicit Feedback, UAI 2009.
下面换一个经典的 BPR 算法,使用的数据集是 movielens/ml-100k
,TopN=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的~ 所以训练还是有些用处的。
Collaborative Denoising Auto-Encoders for Top-N Recommender Systems,WSDM 2016
下面换CADE方法,使用的数据集是 movielens/ml-100k
,TopN=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这篇论文原文中,是有和 pop 以及 BPR 方法做对比的,但效果和论文中表现的并不一致,在我这里显示的是 CADE 不如 pop 和 BPR方法,当然我我这里用的是movielens 100k的数据集,而原文中用的是movielens 10M 的数据集,同时数据集的处理方式以及参数并没有达到与论文中一致,所以先不纠结这个~
我在最近看的一篇论文中找到了这样一段话,贴上来给大家看看
从以上三个实验结果中,不难得出确实是训练集比例越大,precision效果越差,但是同时也可以发现,recall 效果是越好的,所以如果真的想要验证算法在40%、60%、80%数据集比例情况下的不同实验效果。还是选择 Recall 指标吧。我就先暂时不纠结为什么和我以往的认知不一样了~
Biased Matrix Factorization Recommender
我有在思考是不是因为这是TopN推荐的原因,如果是评分预测,是不是会符合这个事实???
下面使用的方法是bias-MF,使用的数据集是 movielens/ml-100k
,TopN=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 |
综上,我不再纠结是不是我的代码写错了,是不是我应该换个数据集(这里没有写其他数据集,但是验证效果是一样的),是不是我哪里应该调一调,找原因找到自我怀疑!!!然后接着很崩溃!
就像贴的那篇论文里写的一样,如果这是我做实验发现的事实,那论文里写出来就好了!
以上是一家之言,欢迎道友一起交流~
本文所用库的资源:链接:https://pan.baidu.com/s/1-F1Gu-ENuFle8wE92h-h5Q提取码:a7tz1,本文库和代码需要在Qt5的32位编译器上运行,如下图所示,如需64位,博主有使用vs2022基于pdfium库的另一项目可供参考(链接)2,此工程流程基本参考另一篇博客(链接),只是在其代码的基础上做了一些修改,定制化了自己的需求。3,所以在此博主仅贴出自己的代码,如需具体流程请参考上述链接。最终工程架构如下图:pdfutils.h#ifndef PDF
每个应用项目必须在项目源设置的根目录中加入 AndroidManifest.xml 文件(且必须使用此名称)。 清单文件会向 Android 构建工具、Android 操作系统和 Google Play 描述应用的基本信息。_源码 androidmanifest
在实际的应用开发中,由于shell缺少许多函数库,所以判断字符串是否为整数就不是一件容易的事儿,那么这里介绍一般的用于判断一个字符串是否为整数的方法。原理:利用expr做计算时变量或字符串必须是整数的规则,把一个变量或字符串和一个已知的整数(非0)相加,看命令返回的值是否为0.如果为0,就认为加法的变量或字符串为整数,否则就不是。 i=5expr $I + 6 &>/dev_shell判断是否是整数
一、 粒子群算法概述粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒_粒子群算法和改进粒子群算法的区别
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基础教程目录基本概念创建Series创建DataFrameDataFrame的属性数据筛选数据更改处理丢失数据导入导出数据DataFrame的合并基本概念:Pandas模块的数据结构主要有两种: -1.SeriesSeries是一维数组,相当于numpy中的一维数组,本身也是基于numpy中的ndarray结构 -2.DataFrameDataFrame...
【代码】【网管日记】Nginx报错踩坑记录。
自留自用#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
四个函数final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, bo_android startprocesslocked
上图图二三,四五接通,下图,一二,五六接通。如图所示开关自锁键未按下时连接的是一边;按下自锁键后连接是另一边。连接电路时中间的引脚一般都选择接入VCC。一共两排引脚,一排3个,每边只有一个是有用的,这两个有用的构成开关,其余4个只是起固定作用,至于具体是哪个得用万用表确定。..._6脚自锁开关引脚图
Jpa是什么?JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。Spring-data-jpa依赖于Hibernate,具体的示例如下:项目配置在pom.xml中添加相关依赖,加入内容如下:org.springframework_spring.jpa.properties.hibernate.dialect
下面浅谈一些自己这个CS小本找工作的肤浅经验,主要是给08、09的后辈们一些参考。主要包括数据结构、算法、C语言、C++的OOP思想等几个方面。 1.数据结构(1)数组关于数组的题目特别的灵活,比如无序数组中找出最大的2个/K个、整数数组中找最大 连续和等等。《编程珠玑》中有一些很好的讨论,可以读读。 (2)链表链表的各种问题,比如判断是否有环并确定环入口、判断两个