下麵是章節協同過濾的目錄(其他內容參見全文目錄)
協同過濾
協同過濾(Collaborative filtering)是推薦係統的一個常用算法。這個技術的目的在於填充user-item矩陣中的缺失項。MLlib當前支持基於模型的協同過濾,在這種方法中,用戶和產品通過一個小的潛在因素(latent factors)集合來描述,這個潛在因素集合可以預測缺失項。MLlib使用交替最小二乘法alternating least squares (ALS) 來學習這些潛在因素。MLlib的實現有下列參數:
- numBlocks 並行計算的塊數量。(默認值為-1,表示自動配置)
- rank 模型中潛在因素的數量。
- iterations 迭代次數。
- lambda ALS中的正則化參數。
- implicitPrefs 製定是否使用顯示反饋ALS變體(或者說是對隱式反饋數據的一種適應)
- alpha 應用於隱式數據的ALS變體,它控製的是觀察到偏好的基本置信度。
顯式反饋 VS隱式反饋
基於矩陣分解的協同過濾,其標準做法是將user-time矩陣中的條目看做用戶對該條目的顯式偏好。
在現實世界中,通常隻能使用隱式的反饋(例如,查看、點擊、購買、喜歡、分享等等)。MLlib中處理這種數據的方法來自 Collaborative Filtering for Implicit Feedback Datasets(針對隱式反饋的協同過濾)。這種方法將數據作為是否偏好及對應的置信度的組合來使用,而不是對評分矩陣直接建模。也就是說評分跟觀察到的用戶的偏好置信度相關,而不是作為對條目的顯式評分。然後嘗試找到潛在因素從而預測用戶對某個條目的喜好。
正則化參數的擴展
從版本1.1開始,MLlib中對每個解決最小二乘問題的正則化參數lambda做了擴展:一個是在更新用戶因素時用戶產生的評分數量;另一個是在更新產品因素時產品被評分的數量。這個方法叫做ALS-WR(alternating-least-squares with weighted-λ -regularization),這篇論文有詳細的介紹:Large-Scale Parallel Collaborative Filtering for the Netflix Prize。該算法減小了參數lambda對數據集規模的依賴。所以我們可以把一個從抽樣子集上學習到的最好的參數應用到全部數據集上,並能預計得到一樣好的效果。
示例
下麵的例子中我們導入了評分數據(每行由用戶、產品、評分構成)。並使用ALS.train()方法進行訓練,該方法默認假設評分是顯式的。最後通過評分預測的均方誤差評估推薦效果。
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 = 20
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)
MSE = ratesAndPreds.map(lambda r: (r[1][0] - r[1][1])**2).reduce(lambda x, y: x + y) / ratesAndPreds.count()
print("Mean Squared Error = " + str(MSE))
# Save and load model
model.save(sc, "myModelPath")
sameModel = MatrixFactorizationModel.load(sc, "myModelPath")
如果評分矩陣來源於其他信息源(例如,推斷自其他信號),我們可以使用ALS.trainImplicit()方法來獲得更好的結果。
# Build the recommendation model using Alternating Least Squares based on implicit ratings
model = ALS.trainImplicit(ratings, rank, numIterations, alpha=0.01)
為了運行上麵的程序,參考最新Spark編程指南Python版[spark 1.3.0][譯]。另外要導入依賴的spark-mllib庫。
教程
Spark Summit 2014上的訓練練習包含了一個實踐教程:personalized movie recommendation with MLlib(使用MLlib的個性化電影推薦)。