1、代码

import org.apache.spark.sql.SparkSession
import toby.gao.config.modelConfig/*** scala - recommendation 推荐系统* package :  org.apache.spark.ml.recommendation* 方法: ALS 、 ALSModel  交替最小二乘法*/object example28 {def main(args: Array[String]): Unit = {val spark = SparkSession.builder().appName("recommendation").enableHiveSupport().getOrCreate()// 1 - load dataval ratings = spark.read.textFile(modelConfig.dataPath + "/data/sample_movielens_ratings.txt").selectExpr("split(value , '::') as col").selectExpr("cast(col[0] as int) as userId","cast(col[1] as int) as movieId","cast(col[2] as float) as rating","cast(col[3] as long) as timestamp") //时间戳ratings.cache()ratings.show()// 2- train /test splitval Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))// 3 - model ALS 交替最小二乘法import org.apache.spark.ml.recommendation.ALSval als = new ALS().setMaxIter(5).setRegParam(0.01).setUserCol("userId").setItemCol("movieId").setRatingCol("rating")println("Toby:" + als.explainParams())// 4 - model fitval alsModel = als.fit(training)//5 - model predictval predictions = alsModel.transform(test)predictions.cache()predictions.show()// 6 - model evaluateimport org.apache.spark.ml.evaluation.RegressionEvaluatorval evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction")val rmse = evaluator.evaluate(predictions)println(s"Toby : Root-mean-square error = $rmse")// 6 - model metricsimport org.apache.spark.mllib.evaluation.RegressionMetricsval regComparison = predictions.select("rating", "prediction").rdd.map(x => (x.getFloat(0).toDouble,x.getFloat(1).toDouble))val metrics = new RegressionMetrics(regComparison)println("Toby: " + metrics.r2 )println("Toby: " + metrics.meanSquaredError)println("Toby: " + metrics.explainedVariance)// 7 - ranking metrics 推荐的Top候选项的准确性评价// 7- 1  获取用户真实场景中喜欢的电影集合(这里设置阈值 rating > 2.5 为喜欢)import org.apache.spark.mllib.evaluation.RankingMetricsimport org.apache.spark.sql.functions.{col, expr}val perUserActual = predictions.where("rating > 2.5").groupBy("userId").agg(expr("collect_set(movieId) as movies"))perUserActual.cache()perUserActual.show()// COMMAND ----------// 7-2 将预测的电影按照预测值从高到底排序聚合val perUserPredictions = predictions.orderBy(col("userId"), col("prediction").desc).groupBy("userId").agg(expr("collect_list(movieId) as movies"))perUserPredictions.cache()perUserPredictions.show()// COMMAND ----------// 7-3 给用户推荐的电影列表在用户真实喜欢的TOP电影列表中命中率多少import spark.implicits._val perUserActualvPred = perUserActual.join(perUserPredictions, Seq("userId")).map(row => (row(1).asInstanceOf[Seq[Integer]].toArray,row(2).asInstanceOf[Seq[Integer]].toArray.take(15)))perUserActualvPred.cache()perUserActualvPred.show()val ranks = new RankingMetrics(perUserActualvPred.rdd)// COMMAND ----------// 7-4 查看Top准确率println("Toby: " + ranks.meanAveragePrecision ) //平均准确率println("Toby: " + ranks.precisionAt(5))  //Top准确率}
}

2、结果

1 - load data
+------+-------+------+----------+
|userId|movieId|rating| timestamp|
+------+-------+------+----------+
|     0|      2|   3.0|1424380312|
|     0|      3|   1.0|1424380312|
|     0|      5|   2.0|1424380312|
|     0|      9|   4.0|1424380312|
|     0|     11|   1.0|1424380312|
|     0|     12|   2.0|1424380312|
|     0|     15|   1.0|1424380312|
|     0|     17|   1.0|1424380312|
|     0|     19|   1.0|1424380312|
|     0|     21|   1.0|1424380312|
|     0|     23|   1.0|1424380312|
|     0|     26|   3.0|1424380312|
|     0|     27|   1.0|1424380312|
|     0|     28|   1.0|1424380312|
|     0|     29|   1.0|1424380312|
|     0|     30|   1.0|1424380312|
|     0|     31|   1.0|1424380312|
|     0|     34|   1.0|1424380312|
|     0|     37|   1.0|1424380312|
|     0|     41|   2.0|1424380312|
+------+-------+------+----------+ 3 - ALS model params
见Scala文档: http://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.spark.mllib.recommendation.ALS5 - model prediction
+------+-------+------+----------+----------+
|userId|movieId|rating| timestamp|prediction|
+------+-------+------+----------+----------+
|    26|     85|   1.0|1424380312| 1.0803492|
|    28|     85|   1.0|1424380312|  3.692985|
|     8|     85|   5.0|1424380312| 3.2585845|
|    28|     94|   1.0|1424380312| 2.6824238|
|    27|     57|   1.0|1424380312| 1.6582177|
|    19|     65|   1.0|1424380312|-1.2475832|
|    27|     27|   3.0|1424380312| -2.898336|
|     1|     19|   1.0|1424380312| 2.0594523|
|    24|     19|   1.0|1424380312|   2.08305|
|    11|     19|   4.0|1424380312| 2.0348344|
|    17|     19|   1.0|1424380312|  4.782441|
|     0|     72|   1.0|1424380312| 0.7783812|
|    18|     70|   1.0|1424380312|-1.1651708|
|     3|     70|   1.0|1424380312|-0.3618136|
|     4|     70|   4.0|1424380312| 1.5592415|
|    11|     70|   1.0|1424380312|-1.2107608|
|     5|     70|   1.0|1424380312|  1.499864|
|    15|     98|   3.0|1424380312| 2.0334811|
|    14|     98|   1.0|1424380312| 3.1419742|
|     9|     98|   1.0|1424380312|-1.0441759|
+------+-------+------+----------+----------+ 6 - RMSE
Toby : Root-mean-square error = 1.78834564765203 6 - R2 \ MSE \ explainedVariance
Toby: -0.6495449885926385
Toby: 3.1981801554759586
Toby: 1.6947224080258068 7-1 - 用户喜欢的电影列表
+------+--------------------+
|userId|              movies|
+------+--------------------+
|    27|        [66, 27, 18]|
|    11|[48, 81, 30, 19, ...|
|     2|                [34]|
|    16|             [5, 90]|
|     9|     [49, 2, 90, 43]|
|    22|    [51, 30, 75, 87]|
|     8|    [52, 85, 31, 95]|
|    21|    [96, 53, 58, 29]|
|    26|        [68, 21, 18]|
|     1|            [21, 77]|
|     6|        [63, 25, 61]|
|    17|                [90]|
|    15|                [98]|
|     4|        [60, 70, 29]|
|    25|        [33, 12, 71]|
|     7|                [29]|
|    20|            [88, 90]|
|    23|                [87]|
|    12|        [16, 31, 23]|
|     5|                [64]|
+------+--------------------+ 7-2 给用户推荐的电影列表
+------+--------------------+
|userId|              movies|
+------+--------------------+
|    27|[27, 25, 22, 31, ...|
|    19|[95, 55, 62, 58, ...|
|    11|[16, 64, 69, 48, ...|
|     2|[52, 34, 15, 10, ...|
|    29|     [33, 79, 62, 3]|
|    16|[38, 90, 99, 56, ...|
|     9|[22, 36, 71, 90, ...|
|     0|[69, 96, 12, 48, ...|
|    22|[51, 26, 30, 45, ...|
|     8|[52, 7, 92, 88, 5...|
|     3|     [35, 70, 33, 9]|
|    21|[96, 30, 29, 0, 8...|
|    26|[21, 85, 18, 62, ...|
|     1|[44, 82, 97, 21, ...|
|     6|[63, 88, 9, 25, 4...|
|    28|[98, 85, 6, 58, 9...|
|    17|[19, 60, 29, 90, ...|
|    15|[33, 29, 37, 98, ...|
|     4|[70, 8, 50, 71, 2...|
|    25|[56, 64, 33, 31, ...|
+------+--------------------+ 7-3 喜欢的电影 和推荐的电影
+--------------------+--------------------+
|                  _1|                  _2|
+--------------------+--------------------+
|        [66, 27, 18]|[27, 25, 22, 31, ...|
|[48, 81, 30, 19, ...|[16, 64, 69, 48, ...|
|                [34]|[52, 34, 15, 10, ...|
|             [5, 90]|[38, 90, 99, 56, ...|
|     [49, 2, 90, 43]|[22, 36, 71, 90, ...|
|    [51, 30, 75, 87]|[51, 26, 30, 45, ...|
|    [52, 85, 31, 95]|[52, 7, 92, 88, 5...|
|    [96, 53, 58, 29]|[96, 30, 29, 0, 8...|
|        [68, 21, 18]|[21, 85, 18, 62, ...|
|            [21, 77]|[44, 82, 97, 21, ...|
|        [63, 25, 61]|[63, 88, 9, 25, 4...|
|                [90]|[19, 60, 29, 90, ...|
|                [98]|[33, 29, 37, 98, ...|
|        [60, 70, 29]|[70, 8, 50, 71, 2...|
|        [33, 12, 71]|[56, 64, 33, 31, ...|
|                [29]|[15, 49, 33, 29, ...|
|            [88, 90]|[12, 32, 30, 88, ...|
|                [87]|[0, 69, 87, 77, 1...|
|        [16, 31, 23]|[23, 86, 53, 24, ...|
|                [64]|[64, 38, 70, 31, ...|
+--------------------+--------------------+ 7-4
平均准确率: 0.2770502645502645
Top准确率: 0.5166666666666667

Scala使用ALS模型做推荐相关推荐

  1. 练习题︱ python 协同过滤ALS模型实现:商品推荐 + 用户人群放大

    之前的一个练习题:练习题︱豆瓣图书的推荐与搜索.简易版知识引擎构建(neo4j)提及了几种简单的推荐方式. 但是在超大规模稀疏数据上,一般会采用一些规模化的模型,譬如spark-ALS就是其中一款. ...

  2. 使用bert模型做句子分类

    使用bert模型微调做下游任务,在goole发布的bert代码和huggingface的transformer项目中都有相应的任务,有的时候只需要把代码做简单的修改即可使用.发现代码很多,我尝试着自己 ...

  3. 用ARIMA模型做需求预测

    本文结构: 时间序列分析? 什么是ARIMA? ARIMA数学模型? input,output 是什么? 怎么用?-代码实例 常见问题? 时间序列分析? 时间序列,就是按时间顺序排列的,随时间变化的数 ...

  4. 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测

    本文结构: 时间序列分析? 什么是ARIMA? ARIMA数学模型? input,output 是什么? 怎么用?-代码实例 常见问题? 时间序列分析? 时间序列,就是按时间顺序排列的,随时间变化的数 ...

  5. 非科班,进入美团做推荐算法是怎样的体验

    作为一名从toB业务转行到美团做推荐的非科班新人算法工程师,这里分享一下入职4个月以来的一些生活状况与感受. 新人日常 上午9点的闹钟起床(由于租的地方距离公司只需步行3分钟就可抵达,所以早上稍微睡个 ...

  6. bert模型可以做文本主题识别吗_GitHub - jkszw2014/TextClassify_with_BERT: 使用BERT模型做文本分类;面向工业用途...

    TextClassify_with_BERT 使用BERT模型做文本分类:面向工业用途 自己研究了当前开源的使用BERT做文本分类的许多存储库,各有各的缺点.通病就是面向学术,不考虑实际应用. 使用t ...

  7. 【推荐算法】从零开始做推荐(二)——TopK推荐的评价指标,计算原理与样例

    前言   推荐系统的评价指标在不同类型的推荐场景下,选用的不同.有些推荐的评价指标并非完全出自推荐系统,而是从搜索算法,信息检索,机器学习等相关领域沿用过来,因此网上有些对评价指标的解释并非完全以推荐 ...

  8. 如何利用knowledge base来做推荐

    本文描述的是推荐系统使用Linked Data做为主要数据源的情况. 注:文中的SparQL语句可以在这里查询 首先介绍一点背景信息.Dr. Gautam Shroff在<Web Intelli ...

  9. 人工智能开讲:用 Seq2Seq 模型做数学应用题

    ▲"鸡兔同笼"的那些年 "盈亏问题"."年龄问题"."植树问题"."牛吃草问题"."利润问 ...

  10. 协同滤波模型的推荐算法(ACM暑校-案例学习)

    基于协同滤波的推荐技术可以细分为基于用户的协同过滤方法.基于产品的协同过滤方法.基于模型的协同过滤方法:本博文进行了一一测试. 1. 数据准备.评价指标 由于协同滤波模型需要用到用户的行为,这里选用M ...

最新文章

  1. java参数传入泛型类型_Java 5.0 泛型之 使用泛型统一传入的参数类型
  2. axios get传参_axios 传数组或对象格式的参数用GET和POST的区别
  3. java中让数据生成excle文件并且支持下载
  4. github怎么自动更新被人更新过的项目_8 个程序员应该掌握的 GitHub 实用技巧
  5. 《剑指offer》题目说明
  6. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
  7. 前端实战:仿写小米官网第一天
  8. 病毒详解及批处理病毒制作:自启动、修改密码、定时关机、蓝屏、进程关闭...
  9. Windows 域时间同步
  10. xp计算机组策略怎么打开,打开组策略的命令,教你组策略怎么打开!
  11. 阿里云云计算ACP学习(二)---弹性存储
  12. 出售主题HTML代码,房地产HTML主题
  13. mysql strict_mysql 严格模式 Strict Mode说明
  14. unity2018转微信小游戏不显示图片
  15. 在main.js引入模块时,无法找到模块“”的声明文件
  16. dm服务器未能启动,DM 达梦数据库 创建服务 无法创建目录_REPLACE_SELF_DM_HOME 错误解决方法...
  17. python证书考试报名时间,python证书考试报名条件
  18. 数据结构——数据结构算法之《图》
  19. PHP curl 中文gbk转utf8
  20. perl范围声明our,my,local

热门文章

  1. 火狐浏览器打印网页不全_火狐浏览器网页显示不全
  2. 第六届“强网杯”全国网络安全挑战赛-青少年专项赛
  3. Can‘t open /dev/sda3 exclusively. Mounted filesystem?
  4. Linux 通过关键字查询文档内容
  5. 网络安全学习--破解Win7密码
  6. 宝付国际一文读懂:跨境电商的外汇风险敞口(四)
  7. Java使用LocalDate获取某个月的第一天和最后一天日期
  8. 常见的接口测试 开源网站
  9. 嵌入式系统设计师需要掌握什么
  10. 固定翼位置控制_L1