基于PaddleRec的用户点击率预测

基于PaddleRec的用户点击率预测

  • 一、前言
    • 推荐系统的痛点
  • 二、推荐系统的数据获取
    • 获取数据的三种方法
      • 1.使用现成的数据集
      • 2.网络爬虫
      • 3.调查问卷
  • 三、数据处理
    • PaddleRec推荐数据集格式
      • 1.slot:value的格式说明
      • 2.只有value的输入数据格式
  • 四、完成点击率预测的具体实现
    • 1.首先安装PaddleRec及相关依赖
    • 2.参数配置
      • data——存放数据集
      • config.yaml——配置训练参数
        • sparse_slots——稀疏参数
        • dense_slots——稠密参数
      • model.py——网络结构
    • 3.模型训练
    • 4.测试模型效果
  • 五、总结与展望
  • 六、个人介绍

不会吧,不会吧,都0202年了,不会有AI连用户喜欢什么都不知道吧!AI比你更懂自己!

一、前言

推荐系统在我们的日常生活中,可谓是无处不在,比如我们平常逛的淘宝、刷的抖音,这些应用的背后都离不开推荐系统。

说起推荐,大家应该都不陌生:

  • “哪家的月饼好吃?推荐一下!”
  • “今年国庆放8天假,去哪玩比较好呢?”
  • … …

今年是特殊的一年,因为疫情,也许会有一部分人会选择留在家中过中秋,中秋节自然少不了月饼,月饼这么多,哪一家的月饼符合你的心意,这就需要推荐系统了(总不能每一家月饼都尝一边吧);庆国庆,去哪玩也许是一个令你头疼的问题,每个人的喜好不同,选择的地方也会不同,这也需要推荐系统的帮助。总之,我们的生活离不开推荐。

CTR(Click Through Rate),即点击率,是“推荐系统/计算广告”等领域的重要指标,对其进行预估是商品推送/广告投放等决策的基础。简单来说,CTR预估对每次广告的点击情况做出预测,预测用户是点击还是不点击。CTR预估模型综合考虑各种因素、特征,在大量历史数据上训练,最终对商业决策提供帮助。

推荐系统的痛点

但是,话说回来,搭建一个推荐系统,真的有这么简单吗?

我们都知道,在深度学习里,数据对模型的效果在一定程度上起到了不可小觑的作用。推荐系统更是如此,它主要解决的是信息过载的问题,目标是从海量物品筛选出不同用户各自喜欢的物品,从而为每个用户提供个性化的推荐。因此,如果数据量很少,或数据质量不高,那么做出来的效果可能就不会很理想。

尽管如此,现在也有很多推荐系统的数据集:

  • MovieLens——数据地址:https://grouplens.org/datasets/movielens/

    MovieLens数据集中,用户对自己看过的电影进行评分,分值为1~5。
  • Book-Crossings——数据地址:http://www2.informatik.uni-freiburg.de/~cziegler/BX/

    该包含90000个用户的270000本书的110万个评分。评分范围从1到10,包括显式和隐式的评分。
  • Last.fm——数据地址:https://grouplens.org/datasets/hetrec-2011/

    Last.fm提供音乐推荐的数据集。 对于数据集中的每个用户,包含他们最受欢迎的艺术家的列表以及播放次数。它还包括可用于构建内容向量的用户应用标签。

我们可以先使用这些现成的数据集,学习如何处理数据,并搭建一个推荐系统。

二、推荐系统的数据获取

当今时代,是大数据时代,谁拥有数据,谁就有筹码。在搭建推荐系统的全流程中,获取数据是第一步,也是最关键的一步。

在做这个项目之前,我想做中秋节赏月地点个性化推荐的,但是苦于没有数据,所以我暂时放弃了这个想法。

获取数据的三种方法

我目前能想到的比较可行的数据获取方案有三种:

  • 最简单的当然是找现成的数据集,这类数据集往往是一些研究机构公开的,一般也比较好;
  • 退而求其次就是自己去一些公开网站上用自动化的方法采集数据,但这些数据往往缺少一些特征,更何况爬虫有风险;
  • 最后一种是最实在的方法,但这种方法收集到的数据量往往很少,对个人来说真的很困难。

1.使用现成的数据集

前面已经给大家提供了一些现成数据集,除了电影、图书、音乐数据集之外,还有一些可用于推荐系统的数据集:

  • MovieLens——数据地址:https://grouplens.org/datasets/movielens/

    MovieLens数据集中,用户对自己看过的电影进行评分,分值为1~5。
  • Book-Crossings——数据地址:http://www2.informatik.uni-freiburg.de/~cziegler/BX/

    该包含90000个用户的270000本书的110万个评分。评分范围从1到10,包括显式和隐式的评分。
  • Last.fm——数据地址:https://grouplens.org/datasets/hetrec-2011/

    Last.fm提供音乐推荐的数据集。 对于数据集中的每个用户,包含他们最受欢迎的艺术家的列表以及播放次数。它还包括可用于构建内容向量的用户应用标签。
  • Wikipedia——数据地址:https://en.wikipedia.org/wiki/Wikipedia:Database_download#English-language_Wikipedia

    该数据集已广泛用于社交网络分析,图形和数据库实现测试,以及维基百科用户行为研究
  • OpenStreetMap——数据地址:http://planet.openstreetmap.org/planet/full-history/

    OpenStreetMap是一个协作的地图项目,类似于维基百科。它的数据由用户提供,数据集中的对象包括道路,建筑物,兴趣点,以及您可能在地图上找到的任何其他内容。

2.网络爬虫

使用网络爬虫的话,首先需要一定的Python基础,并且对前后端的知识有一定的了解。

AI Studio上也有一些关于爬虫的教程,可以去学习学习:

  • Python入门-豆瓣电影TOP250爬取——https://aistudio.baidu.com/aistudio/projectdetail/70149
  • 《青春有你2》数据爬取与分析——https://aistudio.baidu.com/aistudio/projectdetail/396959

我以前也做过一些爬虫程序,可以参考参考:

  • 抓取王者荣耀英雄列表以及对应图片——https://blog.csdn.net/zbp_12138/article/details/101595246
  • 抓取中国天气网当前时段所有城市的天气数据——https://blog.csdn.net/zbp_12138/article/details/101617083

3.调查问卷

调查问卷就简单多了,不需要代码基础,像问卷星就能帮你制作采集表单。

当然,如果想要自己做采集表单的话,也可以自己尝试搭一个服务器用于存放数据,这也需要一定的前后端基础,有兴趣的同学可以学一下Django。

三、数据处理

一般来说,直接采集到的数据是不能直接拿来训练的,因此,我们还需要一定的数据处理功底。对于数据处理,我首先推荐Excel,如果有能力的同学,可以尝试Python代码。

PaddleRec推荐数据集格式

GitHub文档:https://github.com/PaddlePaddle/PaddleRec/blob/master/doc/slot_reader.md

PaddleRec对于数据输入有两种方式。一种是数据已经处理成slot:value的格式可以直接输入模型,我们就用这种方式输入;另一种方式是配置一个reader,在reader中对数据进行处理,再用yield的方式输入。

1.slot:value的格式说明

当你的数据集格式为slot:feasign这种格式,或者可以预处理为这种格式时,可以直接使用PaddleRec内置的Reader。

  • Slot直译是槽位,在推荐工程中,是指某一个宽泛的特征类别,比如用户ID、性别、年龄就是Slot.
  • Feasign则是具体值,比如:12345,男,20岁。

在实践过程中,很多特征槽位不是单一属性,或无法量化并且离散稀疏的,比如某用户兴趣爱好有三个:游戏/足球/数码,且每个具体兴趣又有多个特征维度,则在兴趣爱好这个Slot兴趣槽位中,就会有多个Feasign值。

PaddleRec在读取数据时,每个Slot ID对应的特征,支持稀疏,且支持变长,可以非常灵活的支持各种场景的推荐模型训练。

在一条数据中,每个特征用slot:feasign表示,相邻两个特征用\t分隔,如下所示:

logid:100009 age:49 bookid:60392452 label:8

logid:100009 age:49 bookid:60502258 label:6

logid:100009 age:49 bookid:60977337 label:9

logid:100009 age:49 bookid:312289871 label:0

logid:100009 age:49 bookid:312981589 label:6

logid:100009 age:49 bookid:312982518 label:8

logid:100009 age:49 bookid:312983654 label:9

… …

电影推荐数据集部分训练数据:

logid:100000548 time:976672993 userid:53793338 gender:54713968 age:23292885 occupation:32989794 movieid:26774464 title:57847355 title:44022005 title:36622433 title:3467516 genres:58455809 label:5

logid:100001212 time:974716889 userid:52427656 gender:40715500 age:38930457 occupation:113722 movieid:51981119 title:48706141 title:41846042 title:33234546 genres:28043405 genres:51532872 label:2

logid:100002309 time:971972222 userid:28238127 gender:54713968 age:50367871 occupation:113722 movieid:31124213 title:41573393 title:37130060 title:33234546 genres:17697846 genres:16423920 label:2

logid:100005308 time:975112166 userid:4949303 gender:54713968 age:50367871 occupation:113722 movieid:26896829 title:48110462 title:57345835 title:24278372 title:2549750 genres:7891961 genres:51532872 label:2

2.只有value的输入数据格式

slot:value这种格式的数据是PaddleRec推荐的数据集格式,当然,这种格式不是唯一的。

假设数据A、B、C在文本数据中,每行以这样的形式存储:

0.1,0.2,0.3…3.0,3.1,3.2 \t 99999,99998,99997 \t 1 \n

则示例代码如下:

from paddlerec.core.utils import envs
class Reader(ReaderBase):def init(self):self.avg = envs.get_global_env("avg", None, "hyper_parameters.reader")
def generator_sample(self, line):def reader(self, line):# 先分割 '\n', 再以 '\t'为标志分割为listvariables = (line.strip('\n')).split('\t')# A是第一个元素,并且每个数据之间使用','分割var_a = variables[0].split(',') # listvar_a = [float(i) / self.avg for i in var_a] # 将str数据转换为float# B是第二个元素,同样以 ',' 分割var_b = variables[1].split(',') # listvar_b = [int(i) for i in var_b] # 将str数据转换为int# C是第三个元素, 只有一个元素,没有分割符var_c = variables[2]var_c = int(var_c) # 将str数据转换为intvar_c = [var_c] # 将单独的数据元素置入list中# 将数据与数据名结合,组织为dict的形式# 如下,output形式为{ A: var_a, B: var_b, C: var_c}variable_name = ['A', 'B', 'C']output = zip(variable_name, [var_a] + [var_b] + [var_c])# 将数据输出,使用yield方法,将该函数变为了一个可迭代的对象yield output

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 融入知识的弱监督预训练语言模型

论文笔记整理:叶群,浙江大学计算机学院,知识图谱、NLP方向。会议:ICLR 2020链接:https://arxiv.org/pdf/1912.09637.pdf Abstract预训练语言模型不仅在传统的语言学任务上取得了很好的表现,在一些涉及到背景…

2021 年 1 月程序员薪资出炉,持续上涨!你过平均线了吗?

瑟瑟发抖!程序员薪资报告又来了。2021 年 1 月的薪资报告一定能给你个大惊喜!程序员薪资扶摇直上。(2021年1月程序员收入情况)1 月全国程序员平均工资 14915 元,工资中位数 12500 元,其中 96% 的人工资介于…

LeetCode 590. N叉树的后序遍历(后序遍历)

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 2. 解题 2.1 递归 class Solution { public:vector<int> postorder(Node* root) {vector<int> ans;postRec(root, ans);return ans;}void postRec(Node* root, vector<int> &ans){if (root NULL)return…

人物志 | MIT 科技创新“远见者”:美团 NLP 负责人王仲远

2019 年 1 月 21 日&#xff0c;《麻省理工科技评论》发布了 2018 年“35 岁以下科技创新 35 人”&#xff08;35 Innovators Under 35&#xff09;中国榜单&#xff0c;美团点评AI平台部 NLP 中心负责人、点评搜索智能中心负责人王仲远获评为“远见者”。 Innovators Under 35…

Android官方开发文档Training系列课程中文版:与其它APP交互之允许其它APP启动你的Activity

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/intents/filters.html 在前两节课程中我们只关注了事情的一面&#xff1a;从你的APP启动其它APP。但是如果你的APP可以执行一些功能&#xff0c;并且这些功能可以被其它APP所利用&#xff0c;那么你可以做一…

论文浅尝 | GraphSAINT—基于图采样的归纳学习方法

论文笔记整理&#xff1a;杨海宏&#xff0c;浙江大学博士生&#xff0c;研究方向为开放世界下的多语言知识问答。1. 简介受显存的因素限制&#xff0c;应用图神经网络于大规模图学习任务上面临“邻居爆炸&#xff08;Neighbor Explosion&#xff09;”问题&#xff0c;导致网络…

LeetCode 105. 已知前序中序 求二叉树

文章目录1. 题目2. 解题1. 题目 类似POJ 2255 Tree Recovery 2. 解题 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {unordered_map<int,int> m;//哈希表for(int i 0; i < inorder.size(); i) {…

李在福羽毛球教学

2020年11月27日更 工作的业余之时一定要记得好好健身哦&#xff0c;争取做个健康小达人很行动上的小巨人。不困于时间、不困于地点、不困于等等。没有借口哦&#xff0c;投资自己的身体也是未来很重要的一部分噶。 1 握拍&#xff1a;大拇指和四个手指头握紧&#xff0c;可以更…

不讲武德,只用标签名就能做文本分类

文 | 谁动了我的炼丹炉编 | 兔子酱今天给大家介绍一篇微软研究院在EMNLP2020上发表的论文&#xff0c;主题是弱监督文本分类。看到标题的你可能会和我刚开始一样震惊&#xff0c;只是知道标签名怎么给文本分类呢&#xff1f;是的&#xff0c;虽然听起来不可思议&#xff0c;但看…

Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP

原文地址&#xff1a;http://android.xsoftlab.net/training/building-content-sharing.html 引言 Android应用程序有一项伟大的事情就是它们有可以与其它应用程序交流及整合。为什么不重新使用已经存在于其它APP中的非核心功能呢&#xff1f; 这节课覆盖了一些共同的方式&a…

美团点评技术年货:一本覆盖各技术领域、1200+页的电子书

春节已近&#xff0c;年味渐浓。 又到了我们献上技术年货的时候。 不久前&#xff0c;我们已经给大家分享了技术沙龙大套餐&#xff0c;汇集了过去一年我们线上线下技术沙龙99位讲师&#xff0c;85个演讲&#xff0c;70小时分享。 今天出场的&#xff0c;同样重磅——技术博客2…

论文浅尝 | 基于文本关联的知识图谱的无监督嵌入增强

来源&#xff1a;IJCAI2019论文链接&#xff1a; https://www.ijcai.org/proceedings/2019/0725.pdf概述知识图谱嵌入是从多关系数据中提取数据的工具&#xff0c;最近的嵌入模型对从现有数据库中推断新事实具有很高的效率。然而&#xff0c;这种精确结构的数据通常在数量和范围…

ICLR2021 Oral |9行代码提高少样本学习泛化能力

文 | 杨朔知乎本文已获作者授权&#xff0c;禁止二次转载介绍一篇我们刚刚发表在ICLR2021 Oral上的一篇少样本学习工作&#xff0c;简单有效。题目&#xff1a;Free Lunch for Few-shot Learning: Distribution Calibration链接&#xff1a;https://openreview.net/forum?idJW…

Android官方开发文档Training系列课程中文版:分享简单数据之从其它APP接收简单数据

原文地址&#xff1a;http://android.xsoftlab.net/training/sharing/receive.html 正如你的程序可以发送数据给其它程序&#xff0c;那么你也可以轻松的接收数据。想象一下用户如何与你的程序交互&#xff0c;以及你想从其它应用程序接收的数据类型。举个例子&#xff0c;一个…

腾讯-视频打标签算法探讨

腾讯-视频打标签算法探讨&#xff1a;https://cloud.tencent.com/developer/article/1191746

LeetCode 106. 已知中序后序 求二叉树

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 类似题目LeetCode 105. 已知前序&中序 求二叉树 2. 解题 2.1 递归 递归法&#xff0c;后序最后一个是根节点 class Solution { public:TreeNode* buildTree(vector<int>& inorder, vector<int>& p…

React Native工程中TSLint静态检查工具的探索之路

背景 建立的代码规范没人遵守&#xff0c;项目中遍地风格迥异的代码&#xff0c;你会不会抓狂&#xff1f; 通过测试用例的程序还会出现Bug&#xff0c;而原因仅仅是自己犯下的低级错误&#xff0c;你会不会抓狂&#xff1f; 某种代码写法存在问题导致崩溃时&#xff0c;只能全…

做一个好的搜索引擎有多难

文&#xff5c;见鹿知乎本文已获作者授权&#xff0c;禁止二次转载前言搜索引擎是个极其复杂的系统工程&#xff0c;搜索引擎上并不会大力出奇迹&#xff0c;需要一点点打磨。在搜索引擎上&#xff0c;q-u相关性计算是基础&#xff0c;但仍需要考虑其他很多因素&#xff0c;其中…

Android官方开发文档Training系列课程中文版:分享简单数据之添加简单的分享行为

原文地址&#xff1a;http://android.xsoftlab.net/training/sharing/shareaction.html 从Android4.0开始&#xff0c;使用ActionProvider可以更方便的在ActionBar上实现一个有效的、用户友好的分享按钮。一个ActionProvider一旦依附到了ActionBar的菜单条目上&#xff0c;它会…