Spark机器学习实战 (十二) - 推荐系统实战

0 相关源码

将结合前述知识进行综合实战,以达到所学即所用。在推荐系统项目中,讲解了推荐系统基本原理以及实现推荐系统的架构思路,有其他相关研发经验基础的同学可以结合以往的经验,实现自己的推荐系统。

1 推荐系统简介

1.1 什么是推荐系统



1.2 推荐系统的作用

1.2.1 帮助顾客快速定位需求,节省时间

1.2.2 大幅度提高销售量

1.3 推荐系统的技术思想

1.3.1 推荐系统是一种机器学习的工程应用

1.3.2 推荐系统基于知识发现原理

1.4 推荐系统的工业化实现

  • Apache Spark
  • Apache Mahout
  • SVDFeature(C++)
  • LibMF(C+ +,Lin Chih-Jen)

2 推荐系统原理

可能是推荐系统最详细且简单的入门教程

官方文档指南

协同过滤

协同过滤通常用于推荐系统。这些技术旨在填写用户项关联矩阵的缺失条目。
spark.ml目前支持基于模型的协同过滤,其中用户和产品由一小组可用于预测缺失条目的潜在因素描述。
spark.ml使用交替最小二乘(ALS)算法来学习这些潜在因素。 spark.ml中的实现具有以下参数:

  • numBlocks
    用户和项目将被分区为多个块的数量,以便并行化计算(默认为10)。
  • rank
    模型中潜在因子的数量(默认为10)。
  • maxIter
    要运行的最大迭代次数(默认为10)。
  • regParam
    指定ALS中的正则化参数(默认为1.0)。
  • implicitPrefs
    指定是使用显式反馈ALS变体还是使用适用于隐式反馈数据的变量(默认为false,这意味着使用显式反馈)。
  • alpha
    适用于ALS的隐式反馈变量的参数,其控制偏好观察中的基线置信度(默认为1.0)。
    nonnegative指定是否对最小二乘使用非负约束(默认为false)。

注意:基于DataFrame的ALS API目前仅支持用户和项ID的整数。 user和item id列支持其他数字类型,但id必须在整数值范围内。

显性与隐性反馈

基于矩阵分解的协同过滤的标准方法将用户项矩阵中的条目视为用户对项目给出的显式偏好,例如,给予电影评级的用户。

在许多现实世界的用例中,通常只能访问隐式反馈(例如,观看,点击,购买,喜欢,分享等)。
spark.ml中用于处理此类数据的方法取自Collaborative Filtering for Implicit Feedback Datasets。本质上,这种方法不是试图直接对评级矩阵进行建模,而是将数据视为表示用户操作观察强度的数字(例如点击次数或某人花在观看电影上的累积持续时间)。然后,这些数字与观察到的用户偏好的置信水平相关,而不是与项目的明确评级相关。然后,该模型试图找到可用于预测用户对项目的预期偏好的潜在因素。

缩放正则化参数

我们通过用户在更新用户因素时产生的评级数或在更新产品因子时收到的产品评级数来缩小正则化参数regParam以解决每个最小二乘问题。 这种方法被命名为“ALS-WR”,并在“Netflix奖的大规模并行协同过滤”一文中进行了讨论。 它使regParam较少依赖于数据集的规模,因此我们可以将从采样子集中学习的最佳参数应用于完整数据集,并期望获得类似的性能。

冷启动策略

在使用ALS模型进行预测时,通常会遇到测试数据集中的用户和/或项目,这些用户和/或项目在训练模型期间不存在。这通常发生在两种情况中:

  • 在生产中,对于没有评级历史且未对模型进行过训练的新用户或项目(这是“冷启动问题”)。
  • 在交叉验证期间,数据在训练和评估集之间分割。当使用Spark的CrossValidator或TrainValidationSplit中的简单随机分割时,实际上很常见的是在评估集中遇到不在训练集中的用户和/或项目
    默认情况下,当模型中不存在用户和/或项目因子时,Spark会在ALSModel.transform期间分配NaN预测。这在生产系统中很有用,因为它表示新用户或项目,因此系统可以决定使用某些后备作为预测。

但是,这在交叉验证期间是不合需要的,因为任何NaN预测值都将导致评估指标的NaN结果(例如,使用RegressionEvaluator时)。这使得模型选择不可能。

Spark允许用户将coldStartStrategy参数设置为“drop”,以便删除包含NaN值的预测的DataFrame中的任何行。然后将根据非NaN数据计算评估度量并且该评估度量将是有效的。以下示例说明了此参数的用法。

注意:目前支持的冷启动策略是“nan”(上面提到的默认行为)和“drop”。将来可能会支持进一步的战略。

在以下示例中,我们从MovieLens数据集加载评级数据,每行包含用户,电影,评级和时间戳。 然后,我们训练一个ALS模型,默认情况下,该模型假设评级是显式的(implicitPrefs为false)。 我们通过测量评级预测的均方根误差来评估推荐模型。

import org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.recommendation.ALS

case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long)
def parseRating(str: String): Rating = {
  val fields = str.split("::")
  assert(fields.size == 4)
  Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong)
}

val ratings = spark.read.textFile("data/mllib/als/sample_movielens_ratings.txt")
  .map(parseRating)
  .toDF()
val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))

// Build the recommendation model using ALS on the training data
val als = new ALS()
  .setMaxIter(5)
  .setRegParam(0.01)
  .setUserCol("userId")
  .setItemCol("movieId")
  .setRatingCol("rating")
val model = als.fit(training)

// Evaluate the model by computing the RMSE on the test data
// Note we set cold start strategy to ‘drop‘ to ensure we don‘t get NaN evaluation metrics
model.setColdStartStrategy("drop")
val predictions = model.transform(test)

val evaluator = new RegressionEvaluator()
  .setMetricName("rmse")
  .setLabelCol("rating")
  .setPredictionCol("prediction")
val rmse = evaluator.evaluate(predictions)
println(s"Root-mean-square error = $rmse")

// Generate top 10 movie recommendations for each user
val userRecs = model.recommendForAllUsers(10)
// Generate top 10 user recommendations for each movie
val movieRecs = model.recommendForAllItems(10)

// Generate top 10 movie recommendations for a specified set of users
val users = ratings.select(als.getUserCol).distinct().limit(3)
val userSubsetRecs = model.recommendForUserSubset(users, 10)
// Generate top 10 user recommendations for a specified set of movies
val movies = ratings.select(als.getItemCol).distinct().limit(3)
val movieSubSetRecs = model.recommendForItemSubset(movies, 10)

如果评级矩阵是从另一个信息源派生的(即从其他信号推断出来),您可以将implicitPrefs设置为true以获得更好的结果:

val als = new ALS()
  .setMaxIter(5)
  .setRegParam(0.01)
  .setImplicitPrefs(true)
  .setUserCol("userId")
  .setItemCol("movieId")
  .setRatingCol("rating")

3 推荐系统实战coding

3.1 分割数据集

  • 数据集 tab分割
  • 代码分割数据集
  • 分割结果

3.2 预测评分

  • 预测代码
  • 预测结果

3.3 MovieLens数据集推荐

  • 数据集推荐代码

    MovieLens数据集由GroupLens研究组在 University of Minnesota — 明尼苏达大学(与我们使用数据集无关)中组织的。 MovieLens是电影评分的集合,有各种大小。 数据集命名为1M,10M和20M,是因为它们包含1,10和20万个评分。 最大的数据集使用约14万用户的数据,并覆盖27,000部电影。 除了评分之外,MovieLens数据还包含类似“Western”的流派信息和用户应用的标签,如“over the top”和“Arnold Schwarzenegger”。 这些流派标记和标签在构建内容向量方面是有用的。内容向量对项目的信息进行编码,例如颜色,形状,流派或真正的任何其他属性 - 可以是用于基于内容的推荐算法的任何形式。

MovieLens的数据在过去20年中已经由大学的学生以及互联网上的人们进行收集了。 MovieLens有一个网站,您可以注册,贡献自己的评分,并接收由GroupLens组实施的几个推荐者算法这里之一的推荐内容。

  • 用户ID
  • 所推电影

Spark机器学习实践系列

X 交流学习

Java交流群

博客

知乎

Github

原文地址:https://blog.51cto.com/13601128/2382216

时间: 2024-10-27 04:52:16

Spark机器学习实战 (十二) - 推荐系统实战的相关文章

Android学习笔记(十二)——实战:制作一个聊天界面

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Patch图片是一种被特殊处理过的 png 图片,能够指定哪些区域可以被拉伸而哪些区域不可以.一般用来作为聊天信息的背景.在此我们先准备一张png图片.然后在 Android sdk 目录下有一个 tools 文件夹,在这个文件夹中找到 draw9patch.bat文件. 双击打开之后, 在导航栏点击 File→

应用程序框架实战十二:公共操作类开发技巧(初学者必读)

本文专门为初学者而写,因为很多初学者可能还不了解公共操作类的作用和封装技巧,大部分有经验的程序员都会把自己所碰到的技术问题整理封装成类,这就是公共操作类.公共操作类往往具有一些通用性,也可能专门解决某些棘手问题.公共操作类是应用程序框架的核心,主要目标是解决大部分技术问题.我将在本文介绍封装公共操作类的要点,供初学者参考. 开发公共操作类的原因 很多初学者会奇怪,.Net Framework提供的API相当易用,为何还要多此一举,进行一层封装呢.下面列举封装公共操作类的一些动机. .Net Fr

Node.js 切近实战(十二) 之Linux部署

之前的话我们的项目都是跑在windows上,今天我们要将我们的程序跑到linxu机器上.在看linux部署之前,我们先看一下node.js类似于asp.net mvc的过滤器或者叫拦截器.在app.js中我们加入如下代码 var beforeRequest = function (req, res, next) {     if (req.originalUrl == '/'          || req.originalUrl == '/login'          || req.orig

ASP.NET MVC4+BootStrap 实战(十二)

最近实在是太忙,没时间写博客,只能夜里等孩子睡着了再写.感觉最近一个月又是在浪费时间,心里万分焦急.感觉自己的技术还不行,但是却没有时间去加强.吉日嘎啦的<程序员你伤不起>一书中讲到要孩子要晚了的坏处,比如自己30岁要的孩子,自己60岁了,孩子都30岁了,可能谁也照顾不上谁.其实我想说的是生早了也同样有坏处,比如现在只能晚上12点后写博客写程序. 好了,不多说了,来点高兴的,第一次也是第一个获得组内季度之星奖杯的我,终于觉得自己这三个月来当Master并且承担Coding任务的艰辛得到了很好的

Netty实战十二之WebSocket

如果你有跟进Web技术的最新进展,你很可能就遇到过"实时Web"这个短语,这里并不是指所谓的硬实时服务质量(QoS),硬实时服务质量是保证计算结果将在指定的时间间隔内被递交.仅HTTP的请求/响应模式设计就使得其很难被支持. 实时Web利用技术和实践,使用户在信息的作者发布信息之后就能够立即收到信息,而不需要他们或者他们的软件周期性地检查信息源以及获取更新. 1.WebSocket简介 WebSocket协议是完全重新设计的协议,旨在为Web上的双向数据传输问题提供一个切实可行的解决方

Hyperledger Fabric 实战(十二): Fabric 源码本地调试

借助开发网络调试 fabric 源码本地调试 准备工作 IDE Goland Go 1.9.7 fabric-samples 模块 chaincode-docker-devmode fabric 源码 步骤 添加本地域名 127.0.0.1 peer 127.0.0.1 orderer 用 ide 打开 $GOPATH 下的fabric源码目录 在源码目录下添加 dev-network 把 sampleconfig 下的所有文件复制到 dev-network 修改 core.yaml 中 fil

机器学习(十二、十三):K-means算法、高斯混合模型

简介: 本节介绍STANFORD机器学习公开课中的第12.13集视频中的算法:K-means算法.高斯混合模型(GMM).(9.10.11集不进行介绍,略过了哈) 一.K-means算法 属于无监督学习的聚类算法,给定一组未标定的数据(输入样本),对其进行分类,假设可分为k个类.由于算法比较直观,故直接给出步骤和MATLAB代码.(k-means算法在数学推导上是有意义的) MATLAB代码: %% %k均值聚类 clear all; close all; %% n=2; m=200; v0=r

大数据,云计算,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战视频教程

经过了近两个月的艰苦工作,这次在阿里天池的比赛终于结束了.第一次正经的去参加数据挖掘的比赛,从第一赛季开始到第二赛季结束,完整地经历了整个流程,每天提出新想法,学习新的方法,然后用编程的方法去实现,看着自己的MAPE一天天的下降,那种感觉也是很棒的.觉得付出了很多,也收获了很多,自己也找到了自己的方向,希望自己在未来可以朝着大数据和人工智能方向继续前行.而且这次比赛之后,自己在剩下三年的大学时光中还会继续参加很多这种比赛的,觉得这种比赛要比基础算法比赛更有趣,漫长的周期也更适合我比较散漫的生活方

Spark(五十二):Spark Scheduler模块之DAGScheduler流程

导入 从一个Job运行过程中来看DAGScheduler是运行在Driver端的,其工作流程如下图: 图中涉及到的词汇概念: 1. RDD——Resillient Distributed Dataset 弹性分布式数据集. 2. Operation——作用于RDD的各种操作分为transformation和action. 3. Job——作业,一个JOB包含多个RDD及作用于相应RDD上的各种operation. 4. Stage——一个作业分为多个阶段. 5. Partition——数据分区,