当我发现ALS中的因子矩阵首先被随机初始化时,需要创建Pyspark ALS推荐系统的一点点集合,因此不同的运行会给出略微不同的结果,并且使用它们的平均值可以得到更准确的结果。所以我训练模型2次 - >它给了我不同的模型ALS对象,但是当使用recommendForAllUsers()
方法给出不同模型时,相同的推荐输出。这里有什么问题,为什么需要重新启动脚本以获得不同的输出甚至具有不同的预测ALS模型?
P.S 伪随机的种子参数不存在。
def __train_model(ratings):
"""Train the ALS model with the current dataset
"""
logger.info("Training the ALS model...")
als = ALS(rank=rank, maxIter=iterations, implicitPrefs=True, regParam=regularization_parameter,
userCol="order_id", itemCol="product_id", ratingCol="count")
model = als.fit(ratings)
logger.info("ALS model built!")
return model
model1 = __train_model(ratings_DF)
print(model1)
sim_table_1 = model1.recommendForAllUsers(100).toPandas()
model2 = __train_model(ratings_DF)
print(model2)
sim_table_2 = model2.recommendForAllUsers(100).toPandas()
print('Equality of objects:', model1 == model2)
输出:
INFO:__main__:Training the ALS model...
INFO:__main__:ALS model built!
ALS_444a9e62eb6938248b4c
INFO:__main__:Training the ALS model...
INFO:__main__:ALS model built!
ALS_465c95728272696c6c67
Equality of objects: False
答案 0 :(得分:4)
如果在实例化ALS实例时没有为seed参数提供值,则每次都会默认为相同的值,因为它是字符串的散列(“ALS”)。这就是为什么你的推荐总是一样的。
设置种子默认值的代码:
self._setDefault(seed=hash(type(self).__name__))
示例:
from pyspark.ml.recommendation import ALS
als1 = ALS(rank=10, maxIter=5)
als2 = ALS(rank=10, maxIter=5)
als1.getSeed() == als2.getSeed() == hash("ALS")
>>> True
如果您希望每次都获得不同的模型,可以使用类似numpy.random.randint的内容为种子生成随机整数。