一、简介
ALS即协同过滤,ALS属于数据挖掘,可以做推荐系统,比如电影推荐,商品推荐,广告推荐等。
对于给各个指标进行判定、加权重,然后将这些训练集输入ALS,包括其他的参数,内部进行矩阵相乘,根据这些权重,给用户对未知商品也给一个分数,就是喜好程度.。把喜好程度高的商品推荐给用户,假如用户不喜欢,从线上观察效果不好,那这个模型就有问题,需要修改参数,修改权重,或者添加权重,使之达到一个理想的效果。
二、代码
1、数据
以下是示例数据,对应字段分别为用户id、电影id、评分、时间戳。
该数据下载地址:机器学习文件数据包。
0::2::3::1424380312
0::3::1::1424380312
0::5::2::1424380312
0::9::4::1424380312
0::11::1::1424380312
2、代码
package com.ml.als
import org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.recommendation.ALS
import org.apache.spark.sql.SparkSession
object AlsDemo {
def main(args: Array[String]): Unit = {
// 数据字段:用户id,电影id,评分,时间戳
val session = SparkSession.builder().master("local").appName(this.getClass.getSimpleName).getOrCreate()
val file = session.read.textFile("src/main/resources/als/sample_movielens_ratings.txt")
import session.implicits._
val ratings = file.map { line =>
val strs = line.split("::")
assert(strs.length == 4)
Rating(strs(0).toInt, strs(1).toInt, strs(2).toFloat, strs(3).toLong)
}
val array = ratings.randomSplit(Array(0.7, 0.3), 5)
val als = new ALS()
/*
* 潜在因子数量
* 根据数据的分散情况测试出来的值,特征向量纬度。
* 如果这个值太小拟合的就会不够,误差就很大;
* 如果这个值很大,就会导致模型大泛化能力较差
* */
.setRank(5)
// 迭代次数
.setMaxIter(20)
// 标准的过拟合参数;值越大越不容易产生过拟合,但值太大会降低分解的准确度
.setRegParam(0.3)
.setUserCol("userId")
.setItemCol("movieId")
.setRatingCol("rating")
// 创建模型
val model = als.fit(array(0))
// 预测
val predictions = model.transform(array(1))
predictions.show()
//rmse-平均误差平方和开根号,越接近0越好
//mse-平均误差平方和
//mae-平均距离(绝对)
val evaluator = new RegressionEvaluator()
.setMetricName("rmse")
.setLabelCol("rating")
.setPredictionCol("prediction")
val rmse = evaluator.evaluate(predictions)
println("RMSE: " + rmse)
session.stop()
}
}
// 样例类,用于保存评分
case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long)