【大数据技术与推荐系统(7)】Mahout推荐算法实战

时间:2024-04-04 14:02:37

Mahout概述

  • 基于Spark/Flink/H2O开发的数据挖掘/机器学习库
    • 截止2014年底,mahout不再接收任何MapReduce开发的算法,转向spark
  • 良好的扩展性和容错性
    • 充分利用了MapReduce/Spark/Flink 和HDFS 的扩展性和容错性
  • 属于Hadoop生态系统重要组成部分
  • 实现了大部分常用的数据挖掘算法
    • 聚类算法
    • 分类算法
    • 推荐算法

后端计算引擎

Hadoop MapReduce、Spark、H2O、Flink
【大数据技术与推荐系统(7)】Mahout推荐算法实战

Mahout架构:high-level

【大数据技术与推荐系统(7)】Mahout推荐算法实战
Mahout架构:low-level
【大数据技术与推荐系统(7)】Mahout推荐算法实战
Mahout提供的算法

【大数据技术与推荐系统(7)】Mahout推荐算法实战
Mahout分类算法
【大数据技术与推荐系统(7)】Mahout推荐算法实战
Mahout聚类算法
【大数据技术与推荐系统(7)】Mahout推荐算法实战
Mahout其他算法
【大数据技术与推荐系统(7)】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推荐系统架构
【大数据技术与推荐系统(7)】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

  • DataModel是一个描述用户喜好存储方式的接口

  • DataModel支持的数据源

    • Database
      • MySQLJDBCDataModel, PostgreSQLDataModel
      • NoSQLdatabasessupported:MongoDBDataModel,CassandraDataModel
  • 外部文件

    • FileDataModel
  • Generic

    • GenericDataModel
  • GenericDataModel

    • 通过Java调用读取数据
  • FileDataModel

    • CSV(Comma Separated Values)
  • JDBCDataModel

    • JDBC Driver
    • 标准数据库格式
      【大数据技术与推荐系统(7)】Mahout推荐算法实战
      FileDataModel – CSV 格式

【大数据技术与推荐系统(7)】Mahout推荐算法实战

  • 不管是什么数据源,他们共享同样的底层实现
  • 基本对象:Preference
    • 三元组(user, item, score)
    • 存储在UserPreferenceArray中
      【大数据技术与推荐系统(7)】Mahout推荐算法实战

推荐系统组件:UserSimilarity

  • UserSimilarity定义了两个用户的相似度
    • 类似的,ItemSimilarity定义了两个商品间的相似度
  • 相似度实现
    • Pearson Correlation
    • Spearman Correlation
    • Euclidean Distance
    • Tanimoto Coefficient
    • LogLikelihood Similarity

相似度举例:TanimotoDistance
【大数据技术与推荐系统(7)】Mahout推荐算法实战

相似度举例:CosineSimilarity
【大数据技术与推荐系统(7)】Mahout推荐算法实战

Pearson vs. Euclidean distance

【大数据技术与推荐系统(7)】Mahout推荐算法实战

推荐系统组件:UserNeighborhood

  • UserNeighborhood定义了“临近”这一概念

    • Nearest N users
      • 最相似的前N个用户称为“neighbors”
    • Thresholds
      • 相似度高于某个阈值的用户均成为“neighbors”
        【大数据技术与推荐系统(7)】Mahout推荐算法实战
        推荐系统回顾
  • 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

    • 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