推荐实践(3):调用算法接口实现一个 demo

2021 年 1 月 22 日 AINLP


朋友们好,谢谢你们一起陪伴我继续学习~

这篇依然是比较简单的内容,我们调用了 surprise 中的算法接口,但是自己完成了除此之外的所有工作,包括 数据集载入,切割(这是之前的内容) 并行式调用 K 折交叉验证的多组数据集,然后对结果进行统计返回(这是今天的内容) 。在完成今天的练习以后,我们接下来只需要按照源码格式,设计不同的算法即可。

总体流程例子

   
   
     
from surprise.prediction_algorithms import KNNBasic from model_selection.validation import cross_validate
def surprise_code(): reader = Reader(line_format="user item rating", sep=',', skip_lines=1) data = Dataset.load_from_file('./ml-latest-small/ratings.csv', reader) # print(len(data.raw_ratings))
algo = KNNBasic() perf = cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=2, verbose=0) print(perf)

我们从例子中可以看出,调用了 surprise 中的 KNNBasic 算法,对 algo 定义为 KNNBasic(),然后就是调用 cross_validate() 进行验证,而前面的 reader 和 data 都是我们第二节的内容。

按照我们 第一篇文章 中的定义的大纲,我们相当于今天完成第三部分内容,第二部分的算法设计,我们放在了后面。

算法拟合并计算

这里我们介绍一下源码中的 fit_and_score() 函数,先看一下代码:
   
   
     
def fit_and_score(algo, trainset, testset, measures, return_train_measures=False): start_fit = time.time() algo.fit(trainset) fit_time = time.time() - start_fit start_test = time.time() predictions = algo.test(testset) test_time = time.time() - start_test
if return_train_measures: pass
test_measures = dict() train_measures = dict() for m in measures: f = getattr(accuracy, m.lower()) test_measures[m] = f(predictions, verbose=0)
if return_train_measures: pass
return test_measures, train_measures, fit_time, test_time


看这段代码的时候,发现源码中的 docstring 有点错误,顺手提了个 PR 😄,这段代码其实很简单,学习的主要是让我们理解 algorithm 给出的算法功能应该包括什么。


代码内容的第一段分别进行算法拟合,拟合时间计算,算法测试并返回预测结果,测试时间计算。直接调用 time()  就可以。


后面这里是对返回格式的调整,对测试结果返回一个词典,词典的 key 值是需要计算的参数,value 是对应的计算结果的值。也就是说 fit_and_score() 函数可以对给定的算法,给定的数据集,返回需要的测试结果,算法消耗的时间。


这里有一个注意点是 accuracy() 函数我们是调用的 surprise 中的,其中有几个函数分别对应不同的计算指标名字,输入是预测结果 prediction,输出是计算出来的测试结果。

验证多个数据集

这里我们看一下 cross_validation() 函数的作用:

   
   
     
def cross_validate(algo, data, measures=['rmse', 'mae'], cv=None, return_train_measures=False, n_jobs=1, pre_dispatch='2*n_jobs', verbose=False): measures = [m.lower() for m in measures]
cv = get_cv(cv)
delayed_list = (delayed(fit_and_score)(algo, trainset, testset, measures, return_train_measures) for (trainset, testset) in cv.split(data)) out = Parallel(n_jobs=n_jobs, pre_dispatch=pre_dispatch)(delayed_list)
(test_measures_dicts, train_measures_dicts, fit_times, test_times) = zip(*out)
test_measures = dict() train_measures = dict() ret = dict() for m in measures: # transformer tuple of dicts to dict of lists. test_measures[m] = np.asarray([d[m] for d in test_measures_dicts]) ret['test_'+m] = test_measures[m]
if return_train_measures: pass
ret['fit_time'] = fit_times ret['test_time'] = test_times
if verbose: pass
return ret


特别注意的是这里运用了 Parallel,delayed() 函数来进行并行处理,之前还没有接触过这个方法。 简单的看了一下 docstring,类似于多进程处理的思路,但是操作很简单,直接设置一个 delayed() 函数,第一个输入是运算函数,第二个是对应的函数的输入参数,并且应当以一个生成器的格式进行输入。


然后整体的思路就比较清晰了, 首先 通过 get_cv() 得到数据集的对象,cv.split() 就是生成数据集的生成器。


接下来 运用前面提到的 Parallel 和 delayed 来对数据进行处理,传入的计算函数为 fit_and_score(),数据由生成器得到。对得到的输出 out 进行 zip 分配。


然后 得到的是一个由词典组成的元组(tuple),for m in measures 循环中的作用是将其转化为词典,key 为计算的指标,value 为一个 list,其中的每个元素都是对应每组数据集计算得出的该指标的结果。

总结

本周的内容很简单,直接调用了算法的接口来进行计算,但是好在完成了其它的内容,在调用除算法外自己写的函数时,可以完成整个流程,并与原生函数结果一样。


下篇文章我会开始梳理算法部分,让整个流程可以完整的运行,并无需调用 surprise 中自身的代码。如果感兴趣的朋友欢迎 follow 公众号,一起学习~




由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

欢迎加入推荐系统交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注推荐系统

推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
3

相关内容

Python编程基础,121页ppt
专知会员服务
48+阅读 · 2021年1月1日
手写实现李航《统计学习方法》书中全部算法
专知会员服务
48+阅读 · 2020年8月2日
一份简单《图神经网络》教程,28页ppt
专知会员服务
123+阅读 · 2020年8月2日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
224+阅读 · 2020年3月22日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
OpenCV特征提取与图像检索实现(附代码)
Python | 50行代码实现人脸检测
计算机与网络安全
3+阅读 · 2018年1月23日
用Python实现BP神经网络(附代码)
七月在线实验室
4+阅读 · 2017年12月4日
tensorflow项目学习路径
北京思腾合力科技有限公司
10+阅读 · 2017年11月23日
DABT: A Dependency-aware Bug Triaging Method
Arxiv
0+阅读 · 2021年4月26日
Arxiv
0+阅读 · 2021年4月22日
Arxiv
27+阅读 · 2021年2月17日
A Survey on Edge Intelligence
Arxiv
50+阅读 · 2020年3月26日
Arxiv
7+阅读 · 2020年3月1日
Arxiv
4+阅读 · 2019年4月17日
Arxiv
5+阅读 · 2015年9月14日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关VIP内容
Python编程基础,121页ppt
专知会员服务
48+阅读 · 2021年1月1日
手写实现李航《统计学习方法》书中全部算法
专知会员服务
48+阅读 · 2020年8月2日
一份简单《图神经网络》教程,28页ppt
专知会员服务
123+阅读 · 2020年8月2日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
224+阅读 · 2020年3月22日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
相关资讯
OpenCV特征提取与图像检索实现(附代码)
Python | 50行代码实现人脸检测
计算机与网络安全
3+阅读 · 2018年1月23日
用Python实现BP神经网络(附代码)
七月在线实验室
4+阅读 · 2017年12月4日
tensorflow项目学习路径
北京思腾合力科技有限公司
10+阅读 · 2017年11月23日
相关论文
DABT: A Dependency-aware Bug Triaging Method
Arxiv
0+阅读 · 2021年4月26日
Arxiv
0+阅读 · 2021年4月22日
Arxiv
27+阅读 · 2021年2月17日
A Survey on Edge Intelligence
Arxiv
50+阅读 · 2020年3月26日
Arxiv
7+阅读 · 2020年3月1日
Arxiv
4+阅读 · 2019年4月17日
Arxiv
5+阅读 · 2015年9月14日
Arxiv
3+阅读 · 2012年11月20日
Top
微信扫码咨询专知VIP会员