【问题标题】:Why Spark ML ALS algorithm print RMSE = NaN?为什么 Spark ML ALS 算法打印 RMSE = NaN?
【发布时间】:2017-09-18 13:56:04
【问题描述】:

我使用 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

如何获得好的结果?

【问题讨论】:

  • 也许predictions.where("prediction != 'NaN'")) 有效。

标签: scala apache-spark machine-learning


【解决方案1】:

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

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

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

我还建议将 x < min_ratingx > max_rating 舍入到最低/最高评分,这将提高您的 RMSE。

编辑:

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

【讨论】:

  • 我使用 predictions.na.drop(),但仍然得到 NaN。
  • 如果您有任何空值或 NA,您可以检查您的数据吗?
  • 我已经检查了我的结果,它仍然是“NaN”。
  • 如果您能更新您的问题将会很有帮助。哪几列?那是空值还是NaN?等等。很难回答一个不可重现的问题。
  • 我使用spark.sql("select * from result where prediction != 'NaN'") 过滤结果。它有效!
【解决方案2】:

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

prediction.na.drop()

【讨论】:

    【解决方案3】:

    从 Spark 版本 2.2.0 开始,您可以将 coldStartStrategy 参数设置为 drop 以删除包含 NaN 值的预测数据帧中的任何行。然后,评估指标将在非 NaN 数据上计算,并且将是有效的。

    model.setColdStartStrategy("drop");
    

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2019-12-24
      • 1970-01-01
      • 2015-01-29
      • 2017-11-19
      • 2021-09-19
      • 1970-01-01
      • 2020-05-09
      • 2020-02-28
      相关资源
      最近更新 更多