未登录,请登录后再发表信息
最新评论 (0)
播放视频

《边学Python边学数据科学》#3 推荐系统

Recommendation Systems - Learn Python for Data Science #3

大家好 我是西拉杰
本视频中 我们要写一个脚本
它能从一个电影评级的数据库中读取信息
然后再为用户推荐新电影
让我们用40行的Python代码搞定它
我们现在处于一个新文艺复兴时代
理由就是我们拥有海量的数据
我们在过去两年中所创造的数据
超过了之前整个人类历史所拥有的数据
在互联网中
你有无数的机会去学习 体验 创造
这太棒了 看得太多都要晕吐了
但丰富的资源也带给我们一些烦恼
也就是选择的矛盾
因为有太多的选择
我们把时间都放在选择上了
最终却什么都没选
更坏的是 我们做出选择
然后得了错失恐惧症
如果我们既能够有多种选择性
又能找到那些我们真实需要的东西
那就非常理想了 对吧
推荐系统就能很好地帮助我们
机器通过学习分析我们所有的历史选择
了解我们的喜好
然后推荐那些我们最喜欢的
它推荐地无比精确
它们甚至比我们自己还要了解我们
亚马逊给我们推荐我们会喜欢的商品
谷歌给我们推荐我们会喜欢的搜索结果
脸书给我们推荐我们会喜欢的朋友
几乎所有的服务都具备了这种推荐功能
推荐系统主要有两种模式
一种是协同推荐
另一种是内容推荐
协同推荐分析那些和你有相同喜好的人
通过他们在过去的喜好 来给你做推荐
内容推荐则是通过分析你过去的喜好
来预测你的喜好
还有一些像Netflix的服务商
将两种推荐系统结合来做更精准的推荐
接下来我们自己写代码
来给用户推荐电影
我们要安装一些依赖项 然后写脚本
我们要用到3个依赖项
numpy和scipy会帮助我们做些数学运算
lightfm这个模块 则能够让我们
执行任意数量的推荐算法
让我们从载入numpy开始 并给它起名叫np
lightfm是个非常大的模块
所以我们只要从中导入我们需要的子模块就可以了
或者使用from…import…的命令
来导入某个子模块中我们要使用的方法
我们从lightfm子模块的datasets中导入fetch_movielens这个方法
再从lightfm中导入LightFM这个子模块
我们将来要用它造一个模型
然后我们导入能够帮我们拿电影数据的模块
我们创建一个名为data的变量来储存电影数据
我们用之前导入的fetch_movielens方法
来帮我们抓取电影数据
MovieLens数据是一个很大的csv文件
文件中有10万条电影评分数据
包含了一千名用户对1700部电影的评分
每个用户至少为20部影片打分
分值在1-5分之间
接下来这个影片很可能是0分
我将用Visual Basic创造一个图形处理界面
试着去追踪一下他们的IP地址
无力吐槽
fetch_movielens方法使用min_rating作为可选参数
min_rating表示被抓取电影评分的最低值
这里设置为4.0
那么就只会抓取评分在4分及以上的电影
这样 我们就可以建立表单数据生成我们的csv文件了
并将数据变量存储为字典
字典是一种存储数据的方式 和列表一样
区别在于列表只能运用数字检索数据
而字典则没有限制
这里我们采用字符串进行检索
fetch_movielens方法将数据集分割为训练集和测试集
我们可以用train和test作为关键字来获得其中数据
再输出结果
来看看编码后终端的显示情况
它会同时输出训练矩阵和测试矩阵
可以看到训练集中的数据量是测试集的十倍
现在将模型存储在一个命名为model的变量中
我们用loss这个变量来初始化LightFM这个类
loss代表功能名称
估量模型预测值和期望值间的偏差程度
通过训练不断降低偏差
这样模型的预测就会越来越准
我们有好几个可以选择
这里我们选择一个叫warp的损失函数
warp是Weighted Approximate-Rank Pairwise
warp通过对现有的评分电影进行分析
帮我们生成用户推荐
并预测用户评分
它利用梯度下降算法
不断迭代加权值 来不断改善预测系统
参考数据有用户历史 浏览历史
这是基于内容
还有相似用户的浏览历史 这是基于协同
这是一个混合系统
现在模型建好了
可以开始训练了
我们用model变量的fit方法来训练一下
fit方法有三个参数
要在哪个数据集上训练
要训练多少个时期
以及要在多少线程上运行
这里我们选用刚刚创建的字典
然后将它指向用字符串train作为关键字保存的训练集
我们将这次训练的时期设为30
将线程 或者叫并行计算 设为2
现在要让模型生成推荐
在此之前 我们要建立一个样本推荐函数
包括三个参数
模型 数据和用户ID列表
用户就是推荐分析的对象
首先 确定用户数量
再确定数据数量 在这里就是电影数量
这一步要借助字典类型的shape属性
我们现在要用for循环得到一个用户表
然后知道每一行的正负值
LightFM将评分为5记为正
4及以下的记为负
让问题二元化 简单多了
这样就会抓取出为正的评分数据
存储格式为CSR
这是我们训练集中的一个数组
是我们通过indices属性来检索拿到的
接下来会利用模型的预测方法
生成推荐
并将其存储在scores变量中
将用户ID作为第一参数
然后是电影列表
numpy库的arange方法从0开始
可以检索列表中的所有电影
这样我们就能为每部电影预测评分了
然后根据评分对其进行整理
由于负号标记 由numpy得到的倒序电影评分
会被还原成正序
现在来输出结果
首先输出用户ID
输入%s会将ID以字符串输出
我们先创建一个的for全循环
输出用户评分最高的三部电影
然后再创建一个for循环
输出模型预测最推荐的三部电影
最后再把model data和三个随机用户作为参数
传入我们写的脚本中
每个用户都有对应的自己喜欢的电影列表
和系统为他们推荐的电影
我们再来分步骤回忆一下
推荐算法通过学习我们的喜好
帮助我们做出决定
推荐算法主要有两种类型
一种基于内容 一种基于协同
最后 如果你想自己写一个推荐系统
LightFM是个非常好的入门选择
上期视频的编码挑战冠军是Rohan Verma
他令人难以置信地搞了一个Web App
你可以输入主题 进行搜索
会得到很多推文 有些话语进行了高亮显示
本周最佳
亚军是Arnaud Delauney
代码可读性很高 定义方法很准确
本周挑战题目是对这一编码进行润色
所以不再是运用默认的fetch_movielens方法
而是写一个新方法 抓取其他推荐数据集的数据
并进行格式化
用三个不同的模型进行训练
比对结果 输出最好的那个
把你的GitHub链接贴在评论区里
下期视频我们会选出一个冠军
链接等等都在视频简介栏
欢迎分享视频
点击订阅观看更多编程视频
现在我要去研究雅虎能苟延残喘到现在的原因了
感谢观看

发表评论

译制信息
视频概述

教你用40行代码写出推荐系统

听录译者

收集自网络

翻译译者

Funcii煦风

审核员

审核员

视频来源

https://www.youtube.com/watch?v=9gBC9R-msAk

相关推荐