Spark機器學習之協同過濾

協作過濾通常用於推薦系統。 這些技術旨在填補用戶項目關聯矩陣的缺失條目。 spark.ml目前支持基於模型的協同過濾,其中用戶和產品由一小組潛在因素描述,可用於預測缺失的條目。 spark.ml使用交替最小二乘法(ALS)算法來學習這些潛在因素。 spark.ml中的實現具有以下參數:

1、 numBlocks是用戶和項目將被分區以便並行化計算的塊數(默認值爲10)。
2、rank是模型中潛在因素的數量(默認爲10)。
3、maxIter是要運行的最大迭代次數(默認爲10)。
4、regParam指定ALS中的正則化參數(默認爲1.0)。
5、implicitPrefs指定是使用顯式反饋ALS變體還是適用於隱式反饋數據(默認值爲false,這意味着使用顯式反饋)。
6、alpha是適用於ALS的隱式反饋變體的參數,用於控制偏好觀察值的基線置信度(默認爲1.0)。
7、nonnegative是否對最小二乘使用非負約束(默認爲false)。

注意:用於ALS的基於DataFrame的API目前僅支持用戶和項目ID的整數。 用戶和項目id列支持其他數字類型,但是ids必須在整數值範圍內。

1 顯式與暗示反饋
基於矩陣分解的協同過濾的標準方法將用戶項目矩陣中的條目視爲用戶給出的項目的顯式偏好,例如給予電影評級的用戶。
在許多現實世界的用例中,通常只能訪問隱含的反饋(例如視圖,點擊,購買,喜歡,分享等)。在spark.ml中使用的處理這些數據的方法來自隱式反饋數據集的協同過濾。從本質上講,這種方法不是直接對數據矩陣進行建模,而是將數據視爲代表用戶操作觀察強度的數字(例如點擊次數或觀看電影的累積持續時間)。然後,這些數字與觀察到的用戶偏好的置信水平相關,而不是給予項目的明確評級。然後,該模型嘗試找到可用於預測用戶對項目的預期偏好的潛在因素。

2 正則化參數的縮放
我們通過用戶在更新用戶因素中產生的評分數量,或產品在更新產品因素中收到的評分數量來解決每個最小二乘問題的規則化參數regParam。 這種方法被命名爲“ALS-WR”,並在“大型並行協同過濾Netflix獎”的論文中進行了討論。 它使regParam對數據集的規模較少依賴,因此我們可以將從採樣子集學到的最佳參數應用於完整數據集,並期望類似的性能。


Examples

from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.recommendation import ALS
from pyspark.sql import Row

lines = spark.read.text("data/mllib/als/sample_movielens_ratings.txt").rdd
parts = lines.map(lambda row: row.value.split("::"))
ratingsRDD = parts.map(lambda p: Row(userId=int(p[0]), movieId=int(p[1]),
                                     rating=float(p[2]), timestamp=long(p[3])))
ratings = spark.createDataFrame(ratingsRDD)
(training, test) = ratings.randomSplit([0.8, 0.2])

# Build the recommendation model using ALS on the training data
als = ALS(maxIter=5, regParam=0.01, userCol="userId", itemCol="movieId", ratingCol="rating")
model = als.fit(training)

# Evaluate the model by computing the RMSE on the test data
predictions = model.transform(test)
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",
                                predictionCol="prediction")
rmse = evaluator.evaluate(predictions)
print("Root-mean-square error = " + str(rmse))
如果評級矩陣是從另一個信息來源(即從其他信號推斷出來的),您可以將implicitPrefs設置爲True以獲得更好的結果:

als = ALS(maxIter=5, regParam=0.01, implicitPrefs=True,
          userCol="userId", itemCol="movieId", ratingCol="rating")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章