Spark:测量 ALS 的性能

Posted

技术标签:

【中文标题】Spark:测量 ALS 的性能【英文标题】:Spark: Measuring performance of ALS 【发布时间】:2016-06-24 09:47:10 【问题描述】:

我正在使用来自spark.ml 的 ALS 模型来创建推荐系统 对特定的项目集合使用隐式反馈。我注意到了 模型的输出预测值远低于 1,并且通常在 [0,0.1] 的区间内。因此,使用 MAE 或 MSE 不会使任何 在这种情况下有意义。

因此我使用 areaUnderROC (AUC) 来衡量性能。我通过使用 spark 的 BinaryClassificationEvaluator 来做到这一点,我确实得到了接近 0.8 的结果。但是,我无法清楚地理解这是怎么可能的,因为大多数值都在 [0,0.1] 范围内。

据我了解,在某一点之后,评估者将考虑所有预测都属于第 0 类。这基本上意味着 AUC 将等于负样本的百分比?

一般来说,如果您需要测试模型的性能(与逻辑回归相比),您将如何处理如此低的值?

我训练模型如下:

rank = 25
alpha = 1.0
numIterations = 10
als = ALS(rank=rank, maxIter=numIterations, alpha=alpha, userCol="id", itemCol="itemid", ratingCol="response", implicitPrefs=True, nonnegative=True)
als.setRegParam(0.01)
model = als.fit(train)

【问题讨论】:

【参考方案1】:

@shuaiyuancn 对BinaryClassificationEvaluator 的解释并不完全正确。如果您没有二元评级并且适当的阈值不正确,显然使用这种评估器。

因此,当您的系统考虑二元评级(点击或不点击、喜欢或不喜欢)时,您可以将推荐系统视为二元分类。

在这种情况下,推荐器定义了一个逻辑模型,我们假设用户 u 给项目 v 的评分 (-1,1) 是在逻辑响应模型上生成的:

其中scoreuv是u给v的分数。

有关 Logistic 模型的更多信息,您可以参考 Hastie 等人。 (2009) - 第 4.4 节

这就是说,推荐系统也可以被认为是多类分类问题。这始终取决于您的数据和手头的问题,但它也可以遵循某种回归模型。

有时,我选择使用 RegressionMetrics 评估我的推荐系统,甚至认为教科书推荐使用类似 RankingMetrics 的评估来计算指标,例如 K 或 MAP 的平均精度等。它始终取决于任务和数据在眼前。没有通用的方法。

不过,我强烈建议您阅读Evaluation Metrics 官方文档。它将帮助您更好地了解您要衡量的目标以及您要达到的目标。

参考文献

Statistical Methods for Recommender Systems - Deepak K. Agarwal、Bee-Chung Chen。 统计学习的要素 - Hastie 等人。 Spark 官方文档 - Evaluation Metrics.

编辑:我今天遇到了this answer。这是 python 中二进制 ALS 的示例实现。我强烈建议你看看它。

【讨论】:

【参考方案2】:

在推荐器上使用BinaryClassificationEvaluator 是错误的。通常,推荐者从集合中选择一个或几个项目作为预测。但是BinaryClassificationEvaluator 只处理两个标签,因此 Binary

您仍然从 BinaryClassificationEvaluator 获得结果的原因是结果数据框中有一个 prediction 列,然后用于计算 ROC。这个数字对你的情况没有任何意义,不要把它作为你模型性能的衡量标准。

我注意到模型的输出预测远低于 1,它们通常在 [0,0.1] 的区间内。因此,在这种情况下,使用 MAE 或 MSE 没有任何意义。

为什么MSE 没有任何意义?您正在通过查看预测评分和真实评分的差异(误差)来评估您的模型。 [0, 0.1] 仅表示您的模型预测评级在该范围内。

【讨论】:

在这种情况下,这基本上意味着 ALS 无法捕获数据中的任何模式。我希望得到 [0, 1] 范围内的结果,但是我只得到非常低的值 没有意义的是经过训练的模型,而不是指标:) 是的,你是对的。我不想引起任何误解。由于模型的结果,我选择使用不同的指标,是的,它们似乎没有多大意义。

以上是关于Spark:测量 ALS 的性能的主要内容,如果未能解决你的问题,请参考以下文章

ALS推荐算法在Spark上的优化

Spark 的 ALS 中唯一项目的数量有啥限制?

如何在 Spark 中确定 ALS.transImplicit 中的偏好/置信度?

交替最小二乘+ALS+推荐+Spark

spark使用之ALS版本对比

spark实现ALS矩阵分解-附scala代码