如何在使用火花ALS时使RMSE(均方根误差)很小?

我需要一些建议来建立一个好的模型,通过使用Collaborative Filtering spark来进行推荐。 在官方网站有一个示例代码。 我也通过它:

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。

那是因为我没有为ALS.train方法设置适当的参数,例如rand numteterations等等?

或者是因为我的数据集很小以使RMSE很大?

那么谁能帮我弄清楚什么原因导致RMSE很大,以及如何解决这个问题。

加成:

就像@eliasah说的,我需要添加一些细节来缩小答案集。 让我们考虑一下这种特殊情况:

现在,如果我想建立一个推荐系统向我的客户推荐音乐。 我有他们的曲目,专辑,艺术家和流派的历史。 显然,这四个类构建了一个层次结构。 曲目直接属于专辑,专辑直接属于艺术家,艺术家可能属于几种different流派。 最后,我想使用所有这些信息来选择一些曲目以推荐给客户。

那么,建立一个适合这些情况的良好模型并确保RMSE尽可能小以进行预测的最佳做法是什么?


如上所述, 随着等级和编号的增加,给定相同数据集的RMSE会减小。 但是, 随着数据集的增长,RMSE会增加

现在,减少RMSE和其他类似措施的一种做法是对评分值进行标准化 。 根据我的经验,当您事先知道最小和最大额定值时,这种方法非常有效。

另外,您还应该考虑使用RMSE以外的其他措施。 在做矩阵分解时,我发现有用的是计算评级的Frobenius标准 - 预测然后除以评级的Frobenius标准。 通过这样做,你会得到你的预测相对于原始评分的相对误差。

以下是此方法的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))

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

我希望这有帮助。


我对它做了一些研究,下面是结论:

当rand和迭代增长时,RMSE将减小。 然而,当数据集的规模增长时,RMSE将会增加。从上面的结果可以看出,随机数的大小会更显着地改变RMSE值。

我知道这不足以获得一个好的模型。 希望更多的想法!


在pyspark中使用这个来找到均方根误差(rmse)

from pyspark.mllib.recommendation import ALS
from math import sqrt
from operator import add


# rank is the number of latent factors in the model.
# iterations is the number of iterations to run.
# lambda specifies the regularization parameter in ALS
rank = 8
num_iterations = 8
lmbda = 0.1

# Train model with training data and configured rank and iterations
model = ALS.train(training, rank, num_iterations, lmbda)


def compute_rmse(model, data, n):
    """
    Compute RMSE (Root Mean Squared Error), or square root of the average value
        of (actual rating - predicted rating)^2
    """
    predictions = model.predictAll(data.map(lambda x: (x[0], x[1])))
    predictions_ratings = predictions.map(lambda x: ((x[0], x[1]), x[2])) 
      .join(data.map(lambda x: ((x[0], x[1]), x[2]))) 
      .values()
    return sqrt(predictions_ratings.map(lambda x: (x[0] - x[1]) ** 2).reduce(add) / float(n))

print "The model was trained with rank = %d, lambda = %.1f, and %d iterations.n" % 
        (rank, lmbda, num_iterations)
# Print RMSE of model
validation_rmse = compute_rmse(model, validation, num_validation)
print "Its RMSE on the validation set is %f.n" % validation_rmse
链接地址: http://www.djcxy.com/p/91279.html

上一篇: how to make RMSE(root mean square error) small when use ALS of spark?

下一篇: Lets Encrypt Error "urn:acme:error:unauthorized"