Mahout概述
- 基于Spark/Flink/H2O开发的数据挖掘/机器学习库
- 截止2014年底,mahout不再接收任何MapReduce开发的算法,转向spark
- 良好的扩展性和容错性
- 充分利用了MapReduce/Spark/Flink 和HDFS 的扩展性和容错性
- 属于Hadoop生态系统重要组成部分
- 实现了大部分常用的数据挖掘算法
- 聚类算法
- 分类算法
- 推荐算法
后端计算引擎
Hadoop MapReduce、Spark、H2O、Flink
Mahout架构:high-level
Mahout架构:low-level
Mahout提供的算法
Mahout分类算法
Mahout聚类算法
Mahout其他算法
Mahout推荐算法介绍
- Mahout实现了协同过滤框架
- 使用历史数据(打分,点击,购买等)作为推荐的依据
- User-based: 通过发现类似的用户推荐商品。由于用户多变的特性,这种方法很难扩展;
- Item-based:通过计算item之间相似度推荐商品。商品不易变化,相似度矩阵可离线计算得到。(诞生于Amazon)
- MF-based:通过将原始的user-item矩阵分解成小的矩阵,分析潜在的影响因子,并以解释用户的行为。(诞生于Netflix Prize)
- 使用历史数据(打分,点击,购买等)作为推荐的依据
- Mahout实现了协同过滤框架
- SVD(Singular Value Decomposition)因式分解实现协同过滤
- 基于ALS(alternating least squares)的协同过滤算法
Mahout推荐系统架构
利用Mahout构建推荐系统
- 输入输出
- 输入:原始数据(user preferences,用户偏好)
- 输出:用户偏好估计
- 步骤
- Step 1:将原始数据映射到Mahout定义的Data Model中
- Step 2: 调优推荐组件
- 相似度组件,临界关系组件等
- Step 3: 计算排名估计值
- Step 4:评估推荐结果
Mahout推荐系统组件
- Mahout关键抽象是通过Java Interface实现的
- DataModel Interface
- 将原始数据映射成Mahout兼容格式
- UserSimilarity Interface
- 计算两个用户间的相关度
- ItemSimilarity Interface
- 计算两个商品间的相关度
- UserNeighborhood Interface
- 定义用户或商品间的“临近”
- Recommender Interface
- 实现具体的推荐算法,完成推荐功能(包括训练,预测等)
- DataModel Interface
推荐系统组件:DataModel
-
DataModel是一个描述用户喜好存储方式的接口
-
DataModel支持的数据源
- Database
- MySQLJDBCDataModel, PostgreSQLDataModel
- NoSQLdatabasessupported:MongoDBDataModel,CassandraDataModel
- Database
-
外部文件
- FileDataModel
-
Generic
- GenericDataModel
-
GenericDataModel
- 通过Java调用读取数据
-
FileDataModel
- CSV(Comma Separated Values)
-
JDBCDataModel
- JDBC Driver
- 标准数据库格式
FileDataModel – CSV 格式
- 不管是什么数据源,他们共享同样的底层实现
- 基本对象:Preference
- 三元组(user, item, score)
- 存储在UserPreferenceArray中
推荐系统组件:UserSimilarity
- UserSimilarity定义了两个用户的相似度
- 类似的,ItemSimilarity定义了两个商品间的相似度
- 相似度实现
- Pearson Correlation
- Spearman Correlation
- Euclidean Distance
- Tanimoto Coefficient
- LogLikelihood Similarity
相似度举例:TanimotoDistance
相似度举例:CosineSimilarity
Pearson vs. Euclidean distance
推荐系统组件:UserNeighborhood
-
UserNeighborhood定义了“临近”这一概念
- Nearest N users
- 最相似的前N个用户称为“neighbors”
- Thresholds
- 相似度高于某个阈值的用户均成为“neighbors”
推荐系统回顾
- 相似度高于某个阈值的用户均成为“neighbors”
- Nearest N users
-
Mahout提供了大量的基于CF的推荐器
- 不同的推荐算法
- 不同的“邻接”定义
- 不同的相似度定义
-
评估不同的算法实现非常耗时
- Mahout提供了评估不同算法组合效果的工具
- Mahout提供了标准的推荐系统评估接口
推荐系统评估
-
Mahout提供了大量方法用于推荐系统
- Prediction-based measures
- Mean Average Error
- RMSE (Root Mean Square Error)
- IR-based measures
- Precision, Recall, F1-measure
- NDCG (ranking measure)
- Prediction-based measures
-
Prediction-based measures
- Class: AverageAbsoluteDifferenceEvaluator
- Method: evaluate()
- Parameters:
- Recommender implementation
- DataModel implementation
- TrainingSet size (e.g. 70%)
- % of the data to use in the evaluation (smaller % for fast prototyping)
-
IR-based measures
- Class: GenericRecommenderIRStatsEvaluator
- Method: evaluate()
- Parameters:
- Recommender implementation
- DataModel implementation
- Relevance Threshold (mean+standard deviation)
- % of the data to use in the evaluation (smaller % for fast prototyping)
Mahout推荐算法实战
实例1:preferences
- 要求
- 创建user-item偏好数据,并输出
- 实现
- 使用GenericUserPreferenceArray创建数据
- 通过PreferenceArray存储数据
实例2:DataModel
- PreferenceArray存储了单个用户的偏好
- 所有用户的偏好数据如何保存?
- HashMap? NO!
- Mahout引入了一个为推荐任务优化的数据结构
- FastByIDMap
- 需求
- 使用GenericDataModel读入FastByIDMap数据
实例3:Recommender
- 需求
- 通过User-based协同过滤推荐算法给用户1推荐2个商品
- 实现
- 使用FileDataModel读入文件
- 通过PearsonCorrelationSimilarity来计算相似度
- 使用GenericUserBasedRecommender构建推荐引擎
常用开放数据集:MovieLens
- 内容
- 从http://movielens.org收集到的电影点评数据
- 数据量(数据条数)
- 100K
- 1M
- 10M
- 20M
- 数据集下载
- http://grouplens.org/datasets/movielens/
实例4:推荐模型评估(1)
- 需求
- 评估实例3的推荐系统的优劣
- 实现
- 使用AverageAbsoluteDifferenceRecommenderEvaluator和RMSRecommenderEvaluator来评估模型
- 通过RecommenderBuilder来实现评估模型
实例5:推荐模型评估(2)
- 需求
- 通过IR指标来评估实例3的推荐系统的优劣
- 实现
- 使用RecommenderIRStatsEvaluator来进行评估
实例6:MovieLens推荐系统
- 需求
- 使用MovieLens 1M数据集实现电影推荐系统
- 步骤
- 实现MovieLens数据集的DataModel
- 实现Item-based和User-based的协同过滤推荐,并保存结果
常用开放数据集:Book-Crossing
- 内容
- 来自Book-Crossing图书社区,读者对书籍的评分
- 数据量(数据条数)
- 278858个用户对271379本书进行的评分,包括显式和隐式的评分
- 数据集下载
- http://grouplens.org/datasets/book-crossing/
实例7:BookCrossing推荐系统
- 需求
- 使用BookCrossing数据集实现两种图书推荐系统
- 基于ratings推荐
- 无ratings推荐
- 步骤
- 实现BookCrossing数据集的DataModel
- 实现两套推荐系统
- 使用GenericBooleanPrefUserBasedRecommender
- 实现DataModelBuilder