Spark——ALS代码及注解


一、简介

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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值