为什么Spark ML ALS算法打印RMSE = NaN?

时间:2017-04-21 14:06:34

标签: scala apache-spark machine-learning

我使用ALS预测评分,这是我的代码:

val als = new ALS()
  .setMaxIter(5)
  .setRegParam(0.01)
  .setUserCol("user_id")
  .setItemCol("business_id")
  .setRatingCol("stars")
val model = als.fit(training)

// Evaluate the model by computing the RMSE on the test data
val predictions = model.transform(testing)
predictions.sort("user_id").show(1000)
val evaluator = new RegressionEvaluator()
  .setMetricName("rmse")
  .setLabelCol("stars")
  .setPredictionCol("prediction")
val rmse = evaluator.evaluate(predictions)
println(s"Root-mean-square error = $rmse")

但得到一些负面分数,RMSE是Nan:

+-------+-----------+---------+------------+
|user_id|business_id|    stars|  prediction|
+-------+-----------+---------+------------+
|      0|       2175|      4.0|   4.0388923|
|      0|       5753|      3.0|   2.6875196|
|      0|       9199|      4.0|   4.1753435|
|      0|      16416|      2.0|   -2.710618|
|      0|       6063|      3.0|         NaN|
|      0|      23076|      2.0|  -0.8930751|

Root-mean-square error = NaN

如何取得好成绩?

3 个答案:

答案 0 :(得分:3)

负值并不重要,因为RMSE首先对值进行平方。可能你有空的预测值。你可以放弃它们:

predictions.na().drop(["prediction"])

虽然这可能有点误导,但您也可以用最低/最高/平均等级来填充这些值。

我还建议将x < min_ratingx > max_rating舍入到最低/最高等级,这样可以提高您的RMSE。

编辑:

这里有一些额外的信息:https://issues.apache.org/jira/browse/SPARK-14489

答案 1 :(得分:3)

自Spark版本2.2.0起,您可以将coldStartStrategy参数设置为drop,以便删除包含NaN值的预测的DataFrame中的任何行。然后,将根据非NaN数据计算评估指标,该评估指标将有效。

model.setColdStartStrategy("drop");

答案 2 :(得分:1)

一个小的修正将解决这个问题:

prediction.na.drop()