Spark机器学习实战 (十二) - 推荐系统实战
0 相關(guān)源碼
將結(jié)合前述知識進(jìn)行綜合實(shí)戰(zhàn),以達(dá)到所學(xué)即所用。在推薦系統(tǒng)項(xiàng)目中,講解了推薦系統(tǒng)基本原理以及實(shí)現(xiàn)推薦系統(tǒng)的架構(gòu)思路,有其他相關(guān)研發(fā)經(jīng)驗(yàn)基礎(chǔ)的同學(xué)可以結(jié)合以往的經(jīng)驗(yàn),實(shí)現(xiàn)自己的推薦系統(tǒng)。
1 推薦系統(tǒng)簡介
1.1 什么是推薦系統(tǒng)
1.2 推薦系統(tǒng)的作用
1.2.1 幫助顧客快速定位需求,節(jié)省時(shí)間
1.2.2 大幅度提高銷售量
1.3 推薦系統(tǒng)的技術(shù)思想
1.3.1 推薦系統(tǒng)是一種機(jī)器學(xué)習(xí)的工程應(yīng)用
1.3.2 推薦系統(tǒng)基于知識發(fā)現(xiàn)原理
1.4 推薦系統(tǒng)的工業(yè)化實(shí)現(xiàn)
-
Apache Spark
-
Apache Mahout
-
SVDFeature(C++)
- LibMF(C+ +,Lin Chih-Jen)
2 推薦系統(tǒng)原理
可能是推薦系統(tǒng)最詳細(xì)且簡單的入門教程
官方文檔指南
協(xié)同過濾
協(xié)同過濾通常用于推薦系統(tǒng)。這些技術(shù)旨在填寫用戶項(xiàng)關(guān)聯(lián)矩陣的缺失條目。
spark.ml目前支持基于模型的協(xié)同過濾,其中用戶和產(chǎn)品由一小組可用于預(yù)測缺失條目的潛在因素描述。
spark.ml使用交替最小二乘(ALS)算法來學(xué)習(xí)這些潛在因素。 spark.ml中的實(shí)現(xiàn)具有以下參數(shù):
-
numBlocks
用戶和項(xiàng)目將被分區(qū)為多個(gè)塊的數(shù)量,以便并行化計(jì)算(默認(rèn)為10)。 -
rank
模型中潛在因子的數(shù)量(默認(rèn)為10)。 -
maxIter
要運(yùn)行的最大迭代次數(shù)(默認(rèn)為10)。 -
regParam
指定ALS中的正則化參數(shù)(默認(rèn)為1.0)。 -
implicitPrefs
指定是使用顯式反饋ALS變體還是使用適用于隱式反饋數(shù)據(jù)的變量(默認(rèn)為false,這意味著使用顯式反饋)。 - alpha
適用于ALS的隱式反饋?zhàn)兞康膮?shù),其控制偏好觀察中的基線置信度(默認(rèn)為1.0)。
nonnegative指定是否對最小二乘使用非負(fù)約束(默認(rèn)為false)。
注意:基于DataFrame的ALS API目前僅支持用戶和項(xiàng)ID的整數(shù)。 user和item id列支持其他數(shù)字類型,但id必須在整數(shù)值范圍內(nèi)。
顯性與隱性反饋
基于矩陣分解的協(xié)同過濾的標(biāo)準(zhǔn)方法將用戶項(xiàng)矩陣中的條目視為用戶對項(xiàng)目給出的顯式偏好,例如,給予電影評級的用戶。
在許多現(xiàn)實(shí)世界的用例中,通常只能訪問隱式反饋(例如,觀看,點(diǎn)擊,購買,喜歡,分享等)。
spark.ml中用于處理此類數(shù)據(jù)的方法取自Collaborative Filtering for Implicit Feedback Datasets。本質(zhì)上,這種方法不是試圖直接對評級矩陣進(jìn)行建模,而是將數(shù)據(jù)視為表示用戶操作觀察強(qiáng)度的數(shù)字(例如點(diǎn)擊次數(shù)或某人花在觀看電影上的累積持續(xù)時(shí)間)。然后,這些數(shù)字與觀察到的用戶偏好的置信水平相關(guān),而不是與項(xiàng)目的明確評級相關(guān)。然后,該模型試圖找到可用于預(yù)測用戶對項(xiàng)目的預(yù)期偏好的潛在因素。
縮放正則化參數(shù)
我們通過用戶在更新用戶因素時(shí)產(chǎn)生的評級數(shù)或在更新產(chǎn)品因子時(shí)收到的產(chǎn)品評級數(shù)來縮小正則化參數(shù)regParam以解決每個(gè)最小二乘問題。 這種方法被命名為“ALS-WR”,并在“Netflix獎(jiǎng)的大規(guī)模并行協(xié)同過濾”一文中進(jìn)行了討論。 它使regParam較少依賴于數(shù)據(jù)集的規(guī)模,因此我們可以將從采樣子集中學(xué)習(xí)的最佳參數(shù)應(yīng)用于完整數(shù)據(jù)集,并期望獲得類似的性能。
冷啟動(dòng)策略
在使用ALS模型進(jìn)行預(yù)測時(shí),通常會(huì)遇到測試數(shù)據(jù)集中的用戶和/或項(xiàng)目,這些用戶和/或項(xiàng)目在訓(xùn)練模型期間不存在。這通常發(fā)生在兩種情況中:
- 在生產(chǎn)中,對于沒有評級歷史且未對模型進(jìn)行過訓(xùn)練的新用戶或項(xiàng)目(這是“冷啟動(dòng)問題”)。
- 在交叉驗(yàn)證期間,數(shù)據(jù)在訓(xùn)練和評估集之間分割。當(dāng)使用Spark的CrossValidator或TrainValidationSplit中的簡單隨機(jī)分割時(shí),實(shí)際上很常見的是在評估集中遇到不在訓(xùn)練集中的用戶和/或項(xiàng)目
默認(rèn)情況下,當(dāng)模型中不存在用戶和/或項(xiàng)目因子時(shí),Spark會(huì)在ALSModel.transform期間分配NaN預(yù)測。這在生產(chǎn)系統(tǒng)中很有用,因?yàn)樗硎拘掠脩艋蝽?xiàng)目,因此系統(tǒng)可以決定使用某些后備作為預(yù)測。
但是,這在交叉驗(yàn)證期間是不合需要的,因?yàn)槿魏蜰aN預(yù)測值都將導(dǎo)致評估指標(biāo)的NaN結(jié)果(例如,使用RegressionEvaluator時(shí))。這使得模型選擇不可能。
Spark允許用戶將coldStartStrategy參數(shù)設(shè)置為“drop”,以便刪除包含NaN值的預(yù)測的DataFrame中的任何行。然后將根據(jù)非NaN數(shù)據(jù)計(jì)算評估度量并且該評估度量將是有效的。以下示例說明了此參數(shù)的用法。
注意:目前支持的冷啟動(dòng)策略是“nan”(上面提到的默認(rèn)行為)和“drop”。將來可能會(huì)支持進(jìn)一步的戰(zhàn)略。
在以下示例中,我們從MovieLens數(shù)據(jù)集加載評級數(shù)據(jù),每行包含用戶,電影,評級和時(shí)間戳。 然后,我們訓(xùn)練一個(gè)ALS模型,默認(rèn)情況下,該模型假設(shè)評級是顯式的(implicitPrefs為false)。 我們通過測量評級預(yù)測的均方根誤差來評估推薦模型。
import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.recommendation.ALScase class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long) def parseRating(str: String): Rating = {val fields = str.split("::")assert(fields.size == 4)Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong) }val ratings = spark.read.textFile("data/mllib/als/sample_movielens_ratings.txt").map(parseRating).toDF() val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))// Build the recommendation model using ALS on the training data val als = new ALS().setMaxIter(5).setRegParam(0.01).setUserCol("userId").setItemCol("movieId").setRatingCol("rating") val model = als.fit(training)// Evaluate the model by computing the RMSE on the test data // Note we set cold start strategy to 'drop' to ensure we don't get NaN evaluation metrics model.setColdStartStrategy("drop") val predictions = model.transform(test)val evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction") val rmse = evaluator.evaluate(predictions) println(s"Root-mean-square error = $rmse")// Generate top 10 movie recommendations for each user val userRecs = model.recommendForAllUsers(10) // Generate top 10 user recommendations for each movie val movieRecs = model.recommendForAllItems(10)// Generate top 10 movie recommendations for a specified set of users val users = ratings.select(als.getUserCol).distinct().limit(3) val userSubsetRecs = model.recommendForUserSubset(users, 10) // Generate top 10 user recommendations for a specified set of movies val movies = ratings.select(als.getItemCol).distinct().limit(3) val movieSubSetRecs = model.recommendForItemSubset(movies, 10)如果評級矩陣是從另一個(gè)信息源派生的(即從其他信號推斷出來),您可以將implicitPrefs設(shè)置為true以獲得更好的結(jié)果:
val als = new ALS().setMaxIter(5).setRegParam(0.01).setImplicitPrefs(true).setUserCol("userId").setItemCol("movieId").setRatingCol("rating")3 推薦系統(tǒng)實(shí)戰(zhàn)coding
3.1 分割數(shù)據(jù)集
-
數(shù)據(jù)集 tab分割
-
代碼分割數(shù)據(jù)集
- 分割結(jié)果
3.2 預(yù)測評分
- 預(yù)測代碼
- 預(yù)測結(jié)果
3.3 MovieLens數(shù)據(jù)集推薦
-
數(shù)據(jù)集推薦代碼
MovieLens數(shù)據(jù)集由GroupLens研究組在 University of Minnesota — 明尼蘇達(dá)大學(xué)(與我們使用數(shù)據(jù)集無關(guān))中組織的。 MovieLens是電影評分的集合,有各種大小。 數(shù)據(jù)集命名為1M,10M和20M,是因?yàn)樗鼈儼?,10和20萬個(gè)評分。 最大的數(shù)據(jù)集使用約14萬用戶的數(shù)據(jù),并覆蓋27,000部電影。 除了評分之外,MovieLens數(shù)據(jù)還包含類似“Western”的流派信息和用戶應(yīng)用的標(biāo)簽,如“over the top”和“Arnold Schwarzenegger”。 這些流派標(biāo)記和標(biāo)簽在構(gòu)建內(nèi)容向量方面是有用的。內(nèi)容向量對項(xiàng)目的信息進(jìn)行編碼,例如顏色,形狀,流派或真正的任何其他屬性 - 可以是用于基于內(nèi)容的推薦算法的任何形式。
MovieLens的數(shù)據(jù)在過去20年中已經(jīng)由大學(xué)的學(xué)生以及互聯(lián)網(wǎng)上的人們進(jìn)行收集了。 MovieLens有一個(gè)網(wǎng)站,您可以注冊,貢獻(xiàn)自己的評分,并接收由GroupLens組實(shí)施的幾個(gè)推薦者算法這里之一的推薦內(nèi)容。
-
用戶ID
- 所推電影
Spark機(jī)器學(xué)習(xí)實(shí)踐系列
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (一) - 初識機(jī)器學(xué)習(xí)
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (二) - 初識MLlib
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (三) - 實(shí)戰(zhàn)環(huán)境搭建
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (四) - 數(shù)據(jù)可視化
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (六) - 基礎(chǔ)統(tǒng)計(jì)模塊
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (七) - 回歸算法
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (八) - 分類算法
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (九) - 聚類算法
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (十) - 降維算法
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐(十一) - 文本情感分類項(xiàng)目實(shí)戰(zhàn)
- 基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (十二) - 推薦系統(tǒng)實(shí)戰(zhàn)
X 交流學(xué)習(xí)
Java交流群
博客
知乎
Github
轉(zhuǎn)載于:https://blog.51cto.com/13601128/2382216
總結(jié)
以上是生活随笔為你收集整理的Spark机器学习实战 (十二) - 推荐系统实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 58本地版怎么招人
- 下一篇: Chrome 74 稳定版发布,Wind