Scala使用ALS模型做推荐
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模型做推荐相关推荐
- 练习题︱ python 协同过滤ALS模型实现:商品推荐 + 用户人群放大
之前的一个练习题:练习题︱豆瓣图书的推荐与搜索.简易版知识引擎构建(neo4j)提及了几种简单的推荐方式. 但是在超大规模稀疏数据上,一般会采用一些规模化的模型,譬如spark-ALS就是其中一款. ...
- 使用bert模型做句子分类
使用bert模型微调做下游任务,在goole发布的bert代码和huggingface的transformer项目中都有相应的任务,有的时候只需要把代码做简单的修改即可使用.发现代码很多,我尝试着自己 ...
- 用ARIMA模型做需求预测
本文结构: 时间序列分析? 什么是ARIMA? ARIMA数学模型? input,output 是什么? 怎么用?-代码实例 常见问题? 时间序列分析? 时间序列,就是按时间顺序排列的,随时间变化的数 ...
- 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测
本文结构: 时间序列分析? 什么是ARIMA? ARIMA数学模型? input,output 是什么? 怎么用?-代码实例 常见问题? 时间序列分析? 时间序列,就是按时间顺序排列的,随时间变化的数 ...
- 非科班,进入美团做推荐算法是怎样的体验
作为一名从toB业务转行到美团做推荐的非科班新人算法工程师,这里分享一下入职4个月以来的一些生活状况与感受. 新人日常 上午9点的闹钟起床(由于租的地方距离公司只需步行3分钟就可抵达,所以早上稍微睡个 ...
- bert模型可以做文本主题识别吗_GitHub - jkszw2014/TextClassify_with_BERT: 使用BERT模型做文本分类;面向工业用途...
TextClassify_with_BERT 使用BERT模型做文本分类:面向工业用途 自己研究了当前开源的使用BERT做文本分类的许多存储库,各有各的缺点.通病就是面向学术,不考虑实际应用. 使用t ...
- 【推荐算法】从零开始做推荐(二)——TopK推荐的评价指标,计算原理与样例
前言 推荐系统的评价指标在不同类型的推荐场景下,选用的不同.有些推荐的评价指标并非完全出自推荐系统,而是从搜索算法,信息检索,机器学习等相关领域沿用过来,因此网上有些对评价指标的解释并非完全以推荐 ...
- 如何利用knowledge base来做推荐
本文描述的是推荐系统使用Linked Data做为主要数据源的情况. 注:文中的SparQL语句可以在这里查询 首先介绍一点背景信息.Dr. Gautam Shroff在<Web Intelli ...
- 人工智能开讲:用 Seq2Seq 模型做数学应用题
▲"鸡兔同笼"的那些年 "盈亏问题"."年龄问题"."植树问题"."牛吃草问题"."利润问 ...
- 协同滤波模型的推荐算法(ACM暑校-案例学习)
基于协同滤波的推荐技术可以细分为基于用户的协同过滤方法.基于产品的协同过滤方法.基于模型的协同过滤方法:本博文进行了一一测试. 1. 数据准备.评价指标 由于协同滤波模型需要用到用户的行为,这里选用M ...
最新文章
- java参数传入泛型类型_Java 5.0 泛型之 使用泛型统一传入的参数类型
- axios get传参_axios 传数组或对象格式的参数用GET和POST的区别
- java中让数据生成excle文件并且支持下载
- github怎么自动更新被人更新过的项目_8 个程序员应该掌握的 GitHub 实用技巧
- 《剑指offer》题目说明
- 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
- 前端实战:仿写小米官网第一天
- 病毒详解及批处理病毒制作:自启动、修改密码、定时关机、蓝屏、进程关闭...
- Windows 域时间同步
- xp计算机组策略怎么打开,打开组策略的命令,教你组策略怎么打开!
- 阿里云云计算ACP学习(二)---弹性存储
- 出售主题HTML代码,房地产HTML主题
- mysql strict_mysql 严格模式 Strict Mode说明
- unity2018转微信小游戏不显示图片
- 在main.js引入模块时,无法找到模块“”的声明文件
- dm服务器未能启动,DM 达梦数据库 创建服务 无法创建目录_REPLACE_SELF_DM_HOME 错误解决方法...
- python证书考试报名时间,python证书考试报名条件
- 数据结构——数据结构算法之《图》
- PHP curl 中文gbk转utf8
- perl范围声明our,my,local
热门文章
- 火狐浏览器打印网页不全_火狐浏览器网页显示不全
- 第六届“强网杯”全国网络安全挑战赛-青少年专项赛
- Can‘t open /dev/sda3 exclusively. Mounted filesystem?
- Linux 通过关键字查询文档内容
- 网络安全学习--破解Win7密码
- 宝付国际一文读懂:跨境电商的外汇风险敞口(四)
- Java使用LocalDate获取某个月的第一天和最后一天日期
- 常见的接口测试 开源网站
- 嵌入式系统设计师需要掌握什么
- 固定翼位置控制_L1