2

我有一个使用 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))
4

2 回答 2

2

这是一个隐式反馈问题,因此implicitprefs = True需要设置。根据 Spark 文档,他们正在使用本文进行实施。 http://yifanhu.net/PUB/cf.pdf
论文中还提到 mean-squared-error 不合适。ROC 相关指标更好。所有的二元分类指标都是合适的。另一个想法是,您仍然可以使用购买的商品数量或在该商品上花费的美元作为输入,而不是使用二进制编码反馈,因为您使用的是implicitprefs = True.

于 2018-03-15T23:13:15.833 回答
0

你应该考虑你的方法。如果您的数据集只有二元反馈,则您使用的指标不合适。RMSE 用于回归(即连续值的预测)。对于使用隐式反馈的推荐系统,合适的度量标准是准确率或召回率。克雷蒙塞西等人。写了一篇关于评估 Top-N 推荐系统的精彩论文 ( https://dl.acm.org/citation.cfm?id=2507225 )。

于 2017-10-13T07:32:33.550 回答