當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。