当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python pyspark ALS用法及代码示例


本文简要介绍 pyspark.ml.recommendation.ALS 的用法。

用法:

class pyspark.ml.recommendation.ALS(*, rank=10, maxIter=10, regParam=0.1, numUserBlocks=10, numItemBlocks=10, implicitPrefs=False, alpha=1.0, userCol='user', itemCol='item', seed=None, ratingCol='rating', nonnegative=False, checkpointInterval=10, intermediateStorageLevel='MEMORY_AND_DISK', finalStorageLevel='MEMORY_AND_DISK', coldStartStrategy='nan', blockSize=4096)

交替最小二乘 (ALS) 矩阵分解。

ALS 尝试将评级矩阵 R 估计为两个 lower-rank 矩阵 XY 的乘积,即 X * Yt = R 。通常,这些近似值称为‘factor’ 矩阵。一般的方法是迭代的。在每次迭代期间,因子矩阵中的一个保持不变,而另一个使用最小二乘法求解。 newly-solved 因子矩阵在求解另一个因子矩阵时保持不变。

这是 ALS 分解算法的分块实现,它将两组因子(称为 “users” 和 “products”)分组为块,并通过在每次迭代时仅将每个用户向量的一个副本发送到每个产品块来减少通信,并且仅适用于需要该用户特征向量的产品块。这是通过预先计算有关评级矩阵的一些信息来确定每个用户的“out-links”(它将为哪些产品块做出贡献)和每个产品的“in-link”信息(它从每个产品接收哪些特征向量)来实现的。它将依赖于用户块)。这允许我们在每个用户块和产品块之间仅发送一组特征向量,并让产品块查找用户的评分并根据这些消息更新产品。

对于隐式偏好数据,使用的算法基于“隐式反馈数据集的协同过滤”,,适用于此处使用的阻塞方法。

本质上,这不是找到评级矩阵 R 的低秩近似,而是找到偏好矩阵 P 的近似,其中,如果 r > 0,则 P 的元素为 1;如果 r <= 0,则 P 的元素为 0。然后,评级充当与指示的用户偏好强度相关的‘confidence’值,而不是对项目给出的明确评级。

1.4.0 版中的新函数。

注意

ALS 实施的输入评级 DataFrame 应该是确定性的。非确定性数据可能会导致拟合 ALS 模型失败。例如,像重新分区后采样这样的 order-sensitive 操作会使数据帧输出不确定,例如 df.repartition(2).sample(False, 0.5, 1618) 。检查点采样数据帧或在采样前添加排序可以帮助使数据帧具有确定性。

例子

>>> df = spark.createDataFrame(
...     [(0, 0, 4.0), (0, 1, 2.0), (1, 1, 3.0), (1, 2, 4.0), (2, 1, 1.0), (2, 2, 5.0)],
...     ["user", "item", "rating"])
>>> als = ALS(rank=10, seed=0)
>>> als.setMaxIter(5)
ALS...
>>> als.getMaxIter()
5
>>> als.setRegParam(0.1)
ALS...
>>> als.getRegParam()
0.1
>>> als.clear(als.regParam)
>>> model = als.fit(df)
>>> model.getBlockSize()
4096
>>> model.getUserCol()
'user'
>>> model.setUserCol("user")
ALSModel...
>>> model.getItemCol()
'item'
>>> model.setPredictionCol("newPrediction")
ALS...
>>> model.rank
10
>>> model.userFactors.orderBy("id").collect()
[Row(id=0, features=[...]), Row(id=1, ...), Row(id=2, ...)]
>>> test = spark.createDataFrame([(0, 2), (1, 0), (2, 0)], ["user", "item"])
>>> predictions = sorted(model.transform(test).collect(), key=lambda r: r[0])
>>> predictions[0]
Row(user=0, item=2, newPrediction=0.69291...)
>>> predictions[1]
Row(user=1, item=0, newPrediction=3.47356...)
>>> predictions[2]
Row(user=2, item=0, newPrediction=-0.899198...)
>>> user_recs = model.recommendForAllUsers(3)
>>> user_recs.where(user_recs.user == 0)        .select("recommendations.item", "recommendations.rating").collect()
[Row(item=[0, 1, 2], rating=[3.910..., 1.997..., 0.692...])]
>>> item_recs = model.recommendForAllItems(3)
>>> item_recs.where(item_recs.item == 2)        .select("recommendations.user", "recommendations.rating").collect()
[Row(user=[2, 1, 0], rating=[4.892..., 3.991..., 0.692...])]
>>> user_subset = df.where(df.user == 2)
>>> user_subset_recs = model.recommendForUserSubset(user_subset, 3)
>>> user_subset_recs.select("recommendations.item", "recommendations.rating").first()
Row(item=[2, 1, 0], rating=[4.892..., 1.076..., -0.899...])
>>> item_subset = df.where(df.item == 0)
>>> item_subset_recs = model.recommendForItemSubset(item_subset, 3)
>>> item_subset_recs.select("recommendations.user", "recommendations.rating").first()
Row(user=[0, 1, 2], rating=[3.910..., 3.473..., -0.899...])
>>> als_path = temp_path + "/als"
>>> als.save(als_path)
>>> als2 = ALS.load(als_path)
>>> als.getMaxIter()
5
>>> model_path = temp_path + "/als_model"
>>> model.save(model_path)
>>> model2 = ALSModel.load(model_path)
>>> model.rank == model2.rank
True
>>> sorted(model.userFactors.collect()) == sorted(model2.userFactors.collect())
True
>>> sorted(model.itemFactors.collect()) == sorted(model2.itemFactors.collect())
True
>>> model.transform(test).take(1) == model2.transform(test).take(1)
True

相关用法


注:本文由纯净天空筛选整理自spark.apache.org大神的英文原创作品 pyspark.ml.recommendation.ALS。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。