gpt4 book ai didi

apache-spark - 使用spark的ALS时如何使RMSE(均方根误差)变小?

转载 作者:行者123 更新时间:2023-12-04 12:18:38 28 4
gpt4 key购买 nike

我需要一些建议来构建一个好的模型来使用 Collaborative Filtering 进行推荐。的 Spark 。 official website中有示例代码.我还通过了以下内容:

from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating

# Load and parse the data
data = sc.textFile("data/mllib/als/test.data")
ratings = data.map(lambda l: l.split(','))\
.map(lambda l: Rating(int(l[0]), int(l[1]), float(l[2])))

# Build the recommendation model using Alternating Least Squares
rank = 10
numIterations = 10
model = ALS.train(ratings, rank, numIterations)

# Evaluate the model on training data
testdata = ratings.map(lambda p: (p[0], p[1]))
predictions = model.predictAll(testdata).map(lambda r: ((r[0], r[1]), r[2]))
ratesAndPreds = ratings.map(lambda r: ((r[0], r[1]), r[2])).join(predictions)
RMSE = ratesAndPreds.map(lambda r: ((r[1][0] - r[1][1])**2).mean())**.5)
print("Root Mean Squared Error = " + str(RMSE))
一个好的模型需要尽可能小的 RMSE。

Is that because I do not set proper parameter to ALS.train method, such as rand numIterations and so on?

Or is that because my dataset is small to make RMSE big?


那么任何人都可以帮我弄清楚是什么导致 RMSE 很大以及如何解决它。
添加:
正如@eliasah 所说,我需要添加一些细节来缩小答案集的范围。让我们考虑一下这种特殊情况:
现在,如果我想建立一个推荐系统来向我的客户推荐音乐。我有他们的轨道、专辑、艺术家和流派的历史记录率。显然,这4个类构建了一个层次结构。轨道直接属于专辑,专辑直接属于艺术家,艺术家可能属于多个 different流派。最后,我想使用所有这些信息来选择一些推荐给客户的轨道。
那么,为这些情况建立一个好的模型并确保使 RMSE 尽可能小以进行预测的最佳实践是什么。

最佳答案

正如你上面提到的,给定相同的数据集,随着 rank 和 numIterations 的增加,RMSE 减小。 然而,随着数据集的增长,RMSE 增加 .

现在,为降低 RMSE 和其他一些类似措施所做的一种做法是 标准化评级中的值 .根据我的经验,当您事先知道最小和最大评级值时,这非常有效。

此外,您还应该考虑使用 RMSE 以外的其他度量。在进行矩阵分解时,我发现有用的是 计算 Frobenius Norm of ratings - 预测然后除以 Frobenius Norm of ratings。 通过这样做,您将获得相对于原始评级的预测的相对误差。

这是此方法的 spark 代码:

# Evaluate the model on training data
testdata = ratings.map(lambda p: (p[0], p[1]))
predictions = model.predictAll(testdata).map(lambda r: ((r[0], r[1]), r[2]))

ratesAndPreds = ratings.map(lambda r: ((r[0], r[1]), r[2])).join(predictions)

abs_frobenius_error = sqrt(ratesAndPreds.map(lambda r: ((r[1][0] - r[1][1])**2).sum())))

# frobenius error of original ratings
frob_error_orig = sqrt(ratings.map(lambda r: r[2]**2).sum())

# finally, the relative error
rel_error = abs_frobenius_error/frob_error_orig

print("Relative Error = " + str(rel_error))

在这个误差度量中,误差越接近于零,你的模型就越好。

我希望这有帮助。

关于apache-spark - 使用spark的ALS时如何使RMSE(均方根误差)变小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36575214/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com