基于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,一经查实,立即删除!