在ALS模型中计算RMSE

时间:2016-07-07 03:42:04

标签: scala apache-spark apache-spark-mllib

我想在ALS模型中计算RMSE,我找到这样的代码:

    val ratings = data.map(_.split(',') match {
      case Array(user,item,rate)
      =>
        Rating(user.toLong,item.toInt,rate.toFloat)
    })

    val ratingsDF= ratings.toDF

    val model = new ALS().setRank(3).setMaxIter(10).fit(ratingsDF)
    val predictions = model.transform(ratingsDF)
    val evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction")
    val rmse = evaluator.evaluate(predictions)
    System.out.println("Root-mean-square error = " + rose)

然而,我得到了" NaN" 。 我想知道我使用的方法是错误的还是数据本身的问题。 如果代码有问题,计算RMSE的正确方法是什么? 我只找到像这样的方法:

    var predictions = model.predict(usersProducts).map { case Rating(user, product, rate) =>        ((user, product), rate)    }
    val ratesAndPreds = ratings.map { case Rating(user, product, rate) =>      ((user, product), rate)    }.join(predictions) 
    val rmse= math.sqrt(ratesAndPreds.map { case ((user, product), (r1, r2)) =>      val err = (r1 - r2)      err * err    }.mean())println(s"RMSE = $rmse")

这不能在这里使用。怎么做?

1 个答案:

答案 0 :(得分:1)

这似乎是一个缺陷。有关更多信息,请查看此Spark JIRA:https://issues.apache.org/jira/browse/SPARK-14489

  

构建包含ALS估算器的Spark ML管道时,   指标" rmse"," mse"," r2"和" mae"全部归还NaN。