我有一个使用Spark ALS构建的协作系统。我没有评价,而是根据他们购买的产品向用户推荐产品。所以我为用户购买的所有产品设置了1。并建立了一个ALS系统。预测得分超过1,rmse为0.99。我设置了implicitprefs = True。请在下面找到代码。将rmse设为0.99不是太高。这是一种正确的方法吗?
注意:我使用for循环改进了迭代和秩参数。
Ratings = Ratings.withColumn("Ordered",Ratings["Ordered"].cast('int'))
Ratings = Ratings.withColumn("UserId", Ratings["UserId"].cast('int'))
Ratings = Ratings.withColumn("ProductId", Ratings["ProductId"].cast('int'))
Ratings = Ratings.na.drop()
(train, test) = Ratings.randomSplit([0.8, 0.2])
Model = (ALS(maxIter=3,regParam=0.01,rank=4,
userCol="UserId",itemCol="ProductId",ratingCol="Ordered",
implicitPrefs=True,nonnegative=True))
Fit = Model.fit(train)
print(Model.getImplicitPrefs)
Pred = Fit.transform(test)
Pred = Pred.na.drop()
Pred.toPandas().to_csv("Prediction.csv")
print("before printing")
#print(Pred.show(100))
Evaluator = RegressionEvaluator(metricName="rmse",labelCol="Ordered",predictionCol="prediction")
rmse = Evaluator.evaluate(Pred)
print("rmse is",str(rmse))
答案 0 :(得分:0)
你应该考虑一下你的方法。如果您的数据集只有二进制反馈,则您使用的指标不合适。 RMSE用于回归(即连续值的预测)。对于使用隐式反馈的推荐系统,合适的度量标准是精确度或召回率。 Cremonsesi等。写了一篇关于评估Top-N推荐系统(https://dl.acm.org/citation.cfm?id=2507225)的伟大论文。
答案 1 :(得分:0)
这是隐式反馈问题,因此必须设置implicitprefs = True
。根据Spark文档,他们正在使用本文来实现。
http://yifanhu.net/PUB/cf.pdf
该文还提到均方误差是不合适的。 ROC相关指标更好。所有二进制分类度量都是合适的。
另一个想法是,您使用implicitprefs = True
,而不是使用二进制编码反馈,您仍然可以使用购买的项目数或花在该项上的金额作为输入。