基於Spark ALS算法的個性化推薦


今天來使用spark中的ALS算法做一個小推薦。需要數據的話可以點擊查看初識sparklyr—電影數據分析,在文末點擊閱讀原文即可獲取。

其實在R中還有一個包可以做推薦,那就是recommenderlab。如果數據量不大的時候可以使用recommenderlab包,之前也用該包做過電影評分預測模型。如果數據量較大還是推薦使用spark來進行計算。

在spark中包含了許多機器學習算法,其中就有一個推薦算法,即ALS。

ALS算法也就是協同過濾算法,它是基於矩陣分解的協同過濾,何為矩陣分解?就是把一個評分矩陣A分解為兩個矩陣B,C。B*C=A。為什么要進行分解?那是因為矩陣A是一個稀疏矩陣,分解之后的B,C矩陣相對能稠密一點。使用該算法可以很方便的做一個推薦系統,核心代碼只有三行。

一.讀取數據

數據可以在初識sparklyr—電影數據分析文末點擊閱讀原文即可獲取。

moviedata<-read.table("u.data",header = FALSE,sep = "\t")

這四列數據分別表示:用戶id,電影id,評分,時間戳
head(moviedata)#
  V1  V2 V3        V4
1 196 242  3 881250949
2 186 302  3 891717742
3  22 377  1 878887116
4 244  51  2 880606923
5 166 346  1 886397596
6 298 474  4 884182806
刪除第四列
moviedata<-moviedata[,-4]
重命名列
colnames(moviedata)<-c("userid","itemid","rating")
連接到spark

library(sparklyr)
library(dplyr)
sc <- spark_connect(master = "local")
二. 推薦

前面那些都是准備工作,現在就來實現推薦部分,真的只需三行代碼。

1 保存到spark中

moviedataSpark<-copy_to(sc,moviedata,overwrite = TRUE )

2 建立模型

moviedata_model<-ml_als_factorization(moviedataSpark,rating_col="rating",
                                    user_col="userid",item_col="itemid")
summary(moviedata_model)#此句是查看模型屬性#每個用戶推薦2個

3 生成推薦結果

movie_recommend<-ml_recommend(moviedata_model,type = c("items"),n=2)

movie_recommend
Source:   table<sparklyr_tmp_9fd405a6463> [?? x 4]# Database: spark_connection
  userid recommendations itemid rating
               
1     12 <list [2]>        1450   5.32
2     12 <list [2]>         113   5.17
3     13 <list [2]>        1643   5.59
4     13 <list [2]>         814   4.87
5     14 <list [2]>        1367   5.18
6     14 <list [2]>        1463   5.17
7     18 <list [2]>        1449   4.86
8     18 <list [2]>        1642   4.78
9     25 <list [2]>        1643   4.80
10     25 <list [2]>        1449   4.70
... with more rows
是不是三句代碼就搞定了。沒騙人吧。從結果可以看到給用戶id為12的用戶推薦的是1450和113.在這里ALS算法其他參數給的都是默認值,可以通過不斷調整參數來優化我們的模型。

三.模型評估

模型生成之后需要對模型進行評估,我們可以使用RMSE方法進行模型計算評估,它的計算公式如下:

不過要在之前我們需要知道用戶對電影的預測評分,然后根據預測評分和實際評分來計算出RMSE結果。獲取預測評分可以使用transform方法,如果你想要更多的了解transform方法,可以打開:http://spark.apache.org/docs/latest/ml-collaborative-filtering.html進行查看官方文檔說明。

評分預測

invoke用於調用java對象方法
movie_prediction<-moviedata_model$.jobj%>%invoke("transform",spark_dataframe(moviedataSpark))%>%collect()

movie_prediction

預測結果

A tibble: 100,000 x 4
  userid itemid rating prediction
              1     13     12      5       3.83
2     14     12      5       4.47
3     18     12      5       4.21
4     73     12      5       4.28
5    109     12      4       3.70
6    110     12      4       3.40
7    115     12      5       4.57
8    130     12      4       4.85
9    135     12      4       4.21
10    177     12      5       4.32
... with 99,990 more rows#模型評估

model_RMSE<-sqrt(mean((movie_prediction$rating-movie_prediction$prediction)^2))
在計算模型時,參數給的都是默認值,此時model_RMSE=0.7725977。該值越小,說明該模型越好。
現在修改參數,當把參數調整為:reg_param=0.05,max_iter = 20L,alpha=2

model_RMSE等於0.7123907.比默認時的值小了0.06,就這樣通過不斷優化調整參數來使得模型最優。

轉載請注明:

作者:王亨

公眾號:數據志

原文鏈接:http://blog.csdn.net/wzgl__wh


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM