我使用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
如何取得好成绩?
答案 0 :(得分:3)
负值并不重要,因为RMSE首先对值进行平方。可能你有空的预测值。你可以放弃它们:
predictions.na().drop(["prediction"])
虽然这可能有点误导,但您也可以用最低/最高/平均等级来填充这些值。
我还建议将x < min_rating
和x > 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()