J'utilise ALS pour prédire la note, voici mon code:

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")

Mais obtenez des scores négatifs et RMSE est 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

Comment obtenir un bon résultat?

3
Pi Pi 21 avril 2017 à 17:06

3 réponses

Meilleure réponse

Les valeurs négatives n'ont pas d'importance car RMSE met d'abord les valeurs au carré. Vous avez probablement des valeurs de prédiction vides. Vous pouvez les laisser tomber:

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

Bien que cela puisse être un peu trompeur, vous pouvez également remplir ces valeurs avec votre note la plus basse / la plus élevée / moyenne.

Je recommande également d'arrondir x < min_rating et x > max_rating aux notes les plus basses / les plus élevées, ce qui améliorerait votre RMSE.

ÉDITER:

Quelques informations supplémentaires ici: https://issues.apache.org/jira/browse/SPARK -14489

3
jamborta 21 avril 2017 à 14:35

Depuis la version 2.2.0 de Spark, vous pouvez définir le paramètre coldStartStrategy sur drop afin de supprimer toutes les lignes du DataFrame des prédictions contenant des valeurs NaN. La métrique d'évaluation sera ensuite calculée sur les données non NaN et sera valide.

model.setColdStartStrategy("drop");
3
Stanley 3 janv. 2018 à 02:36

Une petite correction résoudra ce problème:

Prediction.na.drop ()

1
Ajay 11 nov. 2017 à 09:34