当前课程知识点:高级大数据系统 > Machine Learning System > Recommendation in Mahout > Video
刚才介绍了分布式机器学习系统
以及我们介绍了一个recommendation
他最简单的一个实现
因为recommendation是机器学习里面
重要的一种任务
也是今天大量的互联网企业
或者互联网的服务
他们所依赖的一个基础设施
那么现在我们就要去看一下
通过mahout
怎么样从代码的这种层面
去实现一个推荐的策略
那么mahout
在处理推荐的时候
大概可以分成这么几个步骤
首先是我们看一下输入和输出
输入就是原始数据
包含了用户点击
item的记录
或者说是用户给item的
一个评分
那么输出就是我们对于那种
没有评分过没有点击过的
这些记录
他的偏好的一个估计
利用这个估计我们可以对用户
进行内容的推荐
比如说我们把最高分的偏好的
内容推荐用户
那么这4个步骤大概是这样的
一个过程
第一步我们会建立一个这个
数据输入的模型
那么这个模型会把原始的文件
原始的表格
或者原始的数据库的数据源
给导入到我们mahout里面
然后第二步
我们会去加入这个
推荐的这些模块
那么具体来说这里面会定义用户
或者item的之间的similarity
相似度
然后再去做推荐的时候
我们到底参考多大范围的
相同的用户
或者相同的item
也叫做neighbor
这是第二步
我们去定义推荐的模块
那么第三步
我们去计算偏号的这样一个估计
把偏号的估计计算出来
那么第四步
进行推荐性能的一个评测
那注意这个评测并不是用户需要
去进行
而是mahout本身带有的
这样一个评测
帮助我们能够在完成了
一个机器学习算法之后
告诉用户这个机器学习算法
它到底是好还是坏
有多好或者有多坏
好 那我们来看一下这几个步骤
它分别对应的这个接口是什么
那么数据的输入对应的接口
叫做data model
就是说用户通过去实现data model
实际上它是可以
在mahout里面去提供数据
那么data model
今天的mahout实际上支持了
非常丰富的这种data model
就像我刚刚说到它可以来自
分布式文件系统
可以来自于nosql的数据库
可以来自于其他的这种
关系数据库等等
那么user similarity这个interface
这个接口是用来定义用户的
相似度
也就是说用户A和用户B
它到底有多相似
基于这个相似度
我们会去做推荐
然后item similarity定义的是
内容和内容之间的相似度
那么基于这个相似度
我们可以把内容推荐给用户
那么user neighbour
定义了我们在对用户
进行推荐的时候
我们参考了用户周围哪一些
其他的用户
那么所谓的周围指的是和它具有
相似的这个偏好的这些用户
最后是这个
recommender的这个接口
那么recommender的这个接口
实际上会去运行刚刚我们定义的
similarity和neighbour
把这些模块给串联起来
同时会去完成整个推荐算法的
一个evaluation
我们先深入到这个data model
这个interface
我们来看
它到底提供了什么样的一些能力
data model它的作用
是把数据灌给整个
mahout系统
我们来看看
目前实现
在mahout当中实现了这个
data model
包含的这个情况是什么样
首先是基于
data base的
这个data model
它可以把传统的这种关系数据库
mysql
或者是其他的这个数据库
支持标准SQL接口的
这种数据库
把它这个数据给提取出来
然后支持大数据这种数据库类型
nosql
比如说这里面支持了这个
mangoDB
它的这样一个接口
然后可以从外部的文件
直接把数据给读起来
可以从单机的文件
可以从分布式文件系统
把数据load起来
这也是在大数据背景下
被广泛用来存储用户偏好数据
用户行为记录的这样一个
数据模式
当然还有其他用户可以进一步
去自定义的这个接口
叫做generic的这样一个接口
在这种接口底下
用户可以从网络
以任何的这种协议的方式
把数据给读取到
mahout里面去
这是数据接口的一个情况
在数据接口里面
我们需要包含什么样的
这个信息呢
它对应到的就是generic的
这种data model
以及文件保存成CSV的
这样一个格式
以及数据库的这样一个具有
表格模式的这样一个数据形式
这几种数据形式实际上都要求它
具有这样的一个数据的一个属性
和数据的结构
是什么样呢
就是说我们要有
user的ID
要有item的ID
要有它的preference
user的ID
用户的这个编号
我们可以用它来区别
两个不同的用户
那么item id
这个内容的编号
我们可以用它来区分不同的内容
同时还有一个实数
用来表征了用户对item的
一个打分
这是在mahout里面
我们需要的这样一个数据的
输入的样子
这也是我们在大量的系统中
可以得到的这样一个样子
这边给出了一个例子
在这种file data的
data model底下
这个文件会长成什么样子
我们可以看
它的user ID
它的item ID
它的用户的这种打分
所以非常的容易理解
我们可以用这样的方式
把用户之前历史上发生的这种
行为记录
给记录下来
同时这种记录又可以在我们之前
学习的分布式文件系统
或者是hadoop里面
得到有效的存储和处理 生成
好 刚刚说到
我们可以在文件里面把数据给
存成一个表格的形式
CSV的形式
本质上来说
在mahout里面
只要你能够以一个
triple的形式
把user item和score
给存储下来
实际上就不会影响它的计算
所以如果是在其他的
这种数据结构里面
只要你能够通过你自己的
自定义的代码
能够把刚刚说到的三方面的信息
提供出来
实际上mahout
都可以把它作为输入
直接去处理
第二个这个component
就是user的这个similarity
user similarity实际上定义的是
用户和用户在当前这个系统里面
当前这个推荐任务底下
它们的相似度
它们的相似度可以通过
比如说用户之前的这个行为记录
我们可以把它计算出来
我们也可以通过其他额外的信息
比如说我们已经知道这两个用户
在社交网络里面存在着某一种
相似性
我们也许可以把它用到
mahout里
这是相似度可以去做的
但是在典型的这个推荐系统里面
我们通常是不依赖于其他
外部信息
比如说社交媒体里面用户的
这种相似度
我们而是依赖于它的这种
行为记录
也就是说他们在item上的
这个行为记录
通过行为记录
我们大概可以通过以下的一些
距离计算方法
来把用户的相似性给计算出来
包含典型的
比如说pearson这种线性的
这种相关度
然后spearman这种相关系数
以及其他的这个likelihood等等
这种相似性的计算方法
我们在这边给出了一个相似度的
计算的一个例子
那么在这边的这个矩阵中
实际上我们是把item
相似度给算了出来
我们发现相同的内容
它的相似度通常是比较大的
一个值
也符合我们的这种直观的
一个印象
其他的这个0到1之间的数据是
表示两个内容他们之间的
一个相似度
比如说0.507
这样一个相似度
假设我们是通过我们刚刚说到的
一些距离的计算方式来计算的话
它大概是这样发生的
比如说我们用余弦相似度
它的一个计算方法
就是用这个产品A跟产品B
共同的购买人数
除以它们两个产品分别的
购买人数的这样一个平方根
这就是余弦相似度的一个定义
这个相似度它的一个原理就在于
当两个产品他们共同的这个用户
多的话
它的这个值就会更加趋近于一
如果两个产品它们共同的用户
比较少的话
也就是它们交集比较小
他们的这个销售就会趋近于零
我们用这样一个0到1的数值
就表示出了两个产品的相似度
我们把这个方法也可以同样
运用到user上
两个用户
如果他们看过的内容
尽可能多的话
他们的这个相似度接近于一
如果他们看的内容比较少的话
共同的内容比较少的话
它们的相似度就会趋近于零
有了这个
我们就可以定义用户的
一个相似度
有了用户或者item的
相似度之后
我们还有一个mahout的概念
叫做这个user neighborhood
所谓mahout就是说
我在做推荐的时候
我到底参考多大范围
实际上从原理上讲
我们想要参考的是
全网的范围 对吧
比如说我们的系统中
有100万用户
我们在对其中一个用户
进行内容推荐的时候
我们其实是可以参考所有
100万用户
他之前的这种偏好和行为记录
但实际上那样有两个问题
第一是没有必要
因为我们参考这100万
不见得会比我们参考10个人
得到效果更好
第二就是说在做这个真正的
计算和处理的时候
它会带来很大的开销
又没有必要
然后又有很大的开销
所以并不是我们想要选择的
所以我们的一个思路就说我们
能不能只参考一小部分用户
也能得到一个比较好的
推荐的效果
这是neighborhood的作用
在mahout里面
对neighborhood的这个定义
实际上只有两种办法
一种就是去找最相近的N个用户
就是说我每次参考
一定是参考N个用户
这N个用户是和我相似度最近的
N个用户
我们刚刚已经定义了相似度
另外一个
就是说我不一定去找固定数量的
一个用户
而是通过一个阈值去挑选
那我必须要求这些参考的用户
和我的相似度达到多大的一个值
我才能够进行下去
两种方法实际上各有它的好处
如果我们选最近的N个用户
实际上我们可以控制每次这个
N的数量
达到一个相对来说比较稳定的
运行时间
相对比较可控的一个计算规模
但是它的缺点可能我们会把一些
并不是特别相近的人
也给放进去参考
或者说我们没有包含足够多
非常相近的人
它的反向
反过来就是说
如果我们去参考阈值的话
我们可能会没法控制运行的时间
因为预值可能会带来参考
非常量大的这样一个用户集
所以这是两种neighborhood的选择上
可能会需要去做的一个考量
有了这样一个数据
然后有了similarity
又有了neighborhood之后
实际上我们的推荐的框架就已经
可以运行起来了
在我们mahout里面支持的
这个推荐框架
我们刚刚已经反复说过
包含了基于用户的
基于item的
然后基于svn
和基于这个slope-one的
这个cf
这个协同过滤
大家可以根据这个具体
你的任务的一个要求
比如说我们的任务
它的这种相似的偏好非常的明显
并且它具有很好的相关性
同时它的这个参考也比较简单
那我们可以用slope-one
但如果我们的这种相似性
并不是那么明显
或者说我们需要参考
比较多的数据
才能发现这种相似性的话
我们可能会需要选择相对
复杂一些的推荐的引擎
或者推荐的这个算法
那这是
用户在实现的时候
可以具体去尝试的
那么在这张表中
实际上我们给出了mahout
它最初实现的几个算法
它的一些特性
我们简单的可以给大家来看一下
比如说我们用这个
基于用户的这种
generic的基于用户的这个
推荐的引擎的话
实际上它是相对
它是相对规模是比较小的
因为它需要去对这个用户的
similarity
做一个定义同时需要对mahout或者
和它的这种neighborhood做定义
所以当你的范围比较大的时候
你就可能不太容易去决定你的
这些值需要去怎么样去设定
那么再往底下
我们可以看到基于矩阵的
一些方法
那么矩阵的方法也是今天工业界
在验证当中发现它是一个性能
能够得到保障
然后在实际的系统中
运行效率比较高的这样一个方法
那么它的这个问题就是说我们
需要一定的这种预处理
比如说我们需要对矩阵
进行一定的预处理
尤其是当你的这种
用户数和内容数
呈现一定的吸收度
或者说它的这个长宽有一定的
这个形状的时候
我们需要做这种特定的预处理
还有knn的方法
也就是说我们参考最近的
这N用户
那么它的这种knn的方法
那么同样它也有一些这种
scalabity上的
这种局限性
总之大家会根据自己的这个
具体的任务
你做的是什么样的推荐
或者你做的是什么样的预测
来选择你的这个推荐引擎
甚至你也可以同时运行多个
推荐引擎
来比较它们的优劣
那么我们把整个系统
运行起来之后
我们需要去进行evaluation
我们需要去评测
它到底是好还是坏
那么在mahout里面
和其他机器学习的
这种评测是对应
它也提供了基于这个
prediction的这种
这个评测的一个结果
和基于这种信息检索
information retrieval的这种评测的结果
那么在这里面主要是对预测结果
或者推荐结果的准确性
进行一个评估
包含了这个mae的
这样一个指标
或者是rmse这样的一个
错误率的一个指标
那么它本质上是去比较我推荐
或者我估计出来的
这样一个偏好的一个评分值
和真实的评分值
它们之间的这个差
而还有一种方法
就是我通过信息检索
这样一个评测方法
那他在里面关心的是我分类
到底对还是不对
比如说我推荐了一个item
到底用户后面有没有点击它
那是通过这样的办法
它对应的指标
包含了prediction
和recall
这部分如果大家想要去
详细了解的话
我们推荐大家去读一些
和数据挖掘和模式识别相关的
这个书籍
然后了解一下这两种评分方法
对于你的系统是不是合适
或者说你需要更加个性化
比如说对rank进行排序
排序之后又要同时结合一些
评分方法
那么我们在这个最后
给到了一个参考的这样一个代码
实际上
这个代码这这段伪代码是
在mahout里面
大家如果去实现
一个推荐系统的话
可以参考的这样一个原形
我们来看
那么首先
我们第一步
构建data model
那么data model呢
我们是从一个这个文件里面
获得了user item
和评分的这样一个数据
然后我们构建了用户的
这个similarity
使用了皮尔森的这种评分方式
他们会对用户在item上的
这样一个评分
进行一个线性相关系数的
这样一个计算
那么也是一样的接近于零
说明两个用户不太相似
接近于一
说明两个用户高度相似
然后我们定义了neighborhood
我们使用了一个
threshold的方式
当两个用户
他的similarity
超过0.1的时候
我们认为是可以去参考的用户
使用了这样一个neighborhood
那么这时候我们有了用户
可以参考
我们有了这个新用户点击的内容
我们就可以做推荐
那么在推荐的引擎里面
使用的是一个genericBasedRecommendation
然后使用了刚刚提到的neighborhood
和这个similarity
那么后面我们可以对内容
进行推荐
当然在这一步推荐
正式进行推荐之前
我们还需要对整个推进系统
它的这个性能进行evaluation
大家可以选择刚刚提到的这个
基于正确率
或者是基于它的这种分类的
准确度的这样一个验证的方法
那么我们下面给大家看一段视频
让大家了解一下
mahout它在真实系统中
应用的时候一个情况
-What is big data and what is big data system?
--Video
-Problems in big data systems?
--Video
-Overview of the course
--Video
-Principles of big data system design
--Video
-Manipulating Data on Linux
--Video
--Video
--Video
-Basics of Linux Data Processing--Manipulating Data
-Running Commands on a Single Machine
--Video
-Running Commands on a Single Machine--作业
-Using a Linux Cluster
--Video
-Using a Linux Cluster--作业
-Storage for Big Data Computing: Distributed file system
--Video
-Storage for Big Data Computing: Distributed file system--作业
-File system and GFS
--Video
-File system and GFS--作业
-Understanding HDFS using Legos
--Video
-Understanding HDFS using Legos--作业
-File System Implementation and DFS
--Video
--Video
-File System Implementation and DFS--作业
-What is MapReduce and why
--Video
-What is MapReduce and why
-Learn MapReduce by playing with cards
--Video
-Processing pattern
--Video
-Processing pattern--作业
-Hadoop
--Video
-Hadoop--作业
-Algorithms in MapReduce
--Video
-Algorithms in MapReduce--作业
-Tutorial
--Video
-Background
--Video
-Background--作业
-Spark
--Video
-Spark--作业
-Use Spark for data mining
--Video
-Use Spark for data mining--作业
-Spark data processing
--Video
-Spark data processing--作业
-Experiment in Spark
--Video
-Experiment in Spark--作业
-Introduction to streaming data processing
--Video
-Introduction to streaming data processing--作业
-Storm
--Video
--Video
--Video
-Storm--作业
-Spark streaming
--Video
--Video
-Spark streaming--作业
-NoSQL introduction
--Video
-NoSQL introduction--作业
-Common Advantages
--Video
-Common Advantages--作业
-Bigtable
--Video
-Bigtable--作业
-Master Startup
--Video
-Master Startup--作业
-HBase
--Video
-HBase--作业
-What is GraphDB and Graph data processing
--Video
-What is GraphDB and Graph data processing--作业
-Graph systems
--Video
-Graph systems
-Example of a GraphDB
--Video
-Example of a GraphDB--作业
-Mahout
--Video
-Mahout--作业
-Case Study: Recommendation
--Video
-Case Study: Recommendatio作业
-Recommendation in Mahout
--Video
-Recommendation in Mahout--作业