Spark 2.2.0 文档中文版 Collaborative Filtering 协同过滤 JAVA推荐系统
協(xié)同過(guò)濾常用于推薦系統(tǒng),這項(xiàng)技術(shù)旨在填補(bǔ) 丟失的user-item關(guān)聯(lián)矩陣 的條目,spark.ml目前支持基于模型的協(xié)同過(guò)濾(用一些丟失條目的潛在因素在描述用戶和產(chǎn)品)。spark.ml使用ALS(交替最小二乘法)去學(xué)習(xí)這些潛在因素。在spark.ml中的實(shí)現(xiàn)有以下參數(shù):
numBlocks:塊的數(shù)量,user和item將被分成多少塊,以并行計(jì)算。(默認(rèn)10)
ranK:模型隱含因素的個(gè)數(shù)。(默認(rèn)10)
maxIter:模型的最大迭代次數(shù)。(默認(rèn)10)
regParam?:ALS的正則化參數(shù)。(默認(rèn)1.0)
implicitPrefs?:使用顯式反饋還是隱式反饋。(默認(rèn)false,即顯式反饋)
alpha:信心權(quán)重所應(yīng)達(dá)到的基準(zhǔn)線。(默認(rèn)1.0)
nonnegative?:是否使用非負(fù)數(shù)的約束。(默認(rèn)false)
注意:基于dataFrame - API的ALS目前只支持整數(shù)型的userID和itemID,其他數(shù)字類型也支持,但是取值范圍必須在整數(shù)之內(nèi)。
顯式反饋VS隱式反饋
標(biāo)準(zhǔn)的基于矩陣分解的協(xié)同過(guò)濾方法對(duì)待user-item矩陣的條目項(xiàng) 是顯式地給出user對(duì)item的偏好,例如,用戶給電影評(píng)級(jí)。
而現(xiàn)實(shí)生活中常見(jiàn)案例是只能有隱式反饋(例如:視圖,點(diǎn)擊鼠標(biāo),購(gòu)買,喜歡,分享……)。在spark.ml中使用的方法是:對(duì)隱式反饋數(shù)據(jù)集的協(xié)同過(guò)濾。實(shí)際上,這種方法不是直接對(duì)數(shù)據(jù)矩陣進(jìn)行建模,而是將數(shù)據(jù)視為代表用戶行為意愿強(qiáng)度的數(shù)字(例如點(diǎn)擊的次數(shù)或某人累積觀看電影的時(shí)間)。然后,這些數(shù)字與觀察到的用戶偏好的置信水平相關(guān),而不是給予項(xiàng)目的明確評(píng)級(jí)。 然后,該模型嘗試找到可用于預(yù)測(cè)用戶對(duì)項(xiàng)目的預(yù)期偏好的潛在因素。
Scaling of the regularization parameter(正則化參數(shù)的換算)
我們通過(guò)用戶在更新用戶因素中產(chǎn)生的評(píng)分,或產(chǎn)品在更新產(chǎn)品因素中收到的評(píng)分來(lái)求解每個(gè)最小二乘問(wèn)題的規(guī)則化參數(shù)?regParam?。 這種方法被命名為“?ALS-WR?”(加權(quán)正則化交替最小二乘法),并在論文“?Large-Scale Parallel Collaborative Filtering for the Netflix Prize?”中進(jìn)行了討論。 它使?regParam?對(duì)數(shù)據(jù)集的規(guī)模依賴較少,因此我們可以將從采樣子集學(xué)到的最佳參數(shù)應(yīng)用于完整數(shù)據(jù)集,并期望能有相似的表現(xiàn)。
冷啟動(dòng)策略
在進(jìn)行預(yù)測(cè)時(shí)使用ALSModel,通常遇到這樣一種情況,訓(xùn)練模型的時(shí)候,user、item在測(cè)試數(shù)據(jù)集沒(méi)有出現(xiàn)。這種情況通常發(fā)生在兩個(gè)場(chǎng)景:
默認(rèn)情況下,當(dāng)user、item不在模型之中,spark在ALSModel.transform分配NaN預(yù)測(cè),這在預(yù)測(cè)系統(tǒng)中非常的有用,因?yàn)樗砻髁艘粋€(gè)新的user、item,系統(tǒng)可以做一個(gè)后備性的預(yù)測(cè)。
然而在交叉驗(yàn)證中這是不可取的,因?yàn)槿魏我粋€(gè)NaN預(yù)測(cè)會(huì)導(dǎo)致評(píng)估度量的NaN結(jié)果(例如當(dāng)使用RegressionEvaluator時(shí))這使得模型選擇是不可能的。
spark允許用戶設(shè)置coldStartStrategy參數(shù)為“drop”,以便刪除包含NaN值的預(yù)測(cè)的DataFrame中的任何行。 然后,將根據(jù)非NaN數(shù)據(jù)計(jì)算評(píng)估度量,并將有效。 以下示例說(shuō)明了此參數(shù)的用法。
注意:目前支持的冷啟動(dòng)策略是“nan”(上面提到的默認(rèn)行為)和“drop”。 未來(lái)可能會(huì)支持進(jìn)一步的策略。
例子
在以下示例中,我們從MovieLens數(shù)據(jù)集加載評(píng)級(jí)數(shù)據(jù),每行由用戶,電影,評(píng)級(jí)和時(shí)間戳組成。 然后,假設(shè)我們訓(xùn)練一個(gè)ALS模型,默認(rèn)情況下假定評(píng)級(jí)是明確的(implicitPrefs是false)。 我們通過(guò)測(cè)量評(píng)級(jí)預(yù)測(cè)的均方根誤差來(lái)評(píng)估推薦模型。
有關(guān)API的更多詳細(xì)信息,請(qǐng)參閱ALS Java文檔。
import java.io.Serializable;import org.apache.spark.api.java.JavaRDD; import org.apache.spark.ml.evaluation.RegressionEvaluator; import org.apache.spark.ml.recommendation.ALS; import org.apache.spark.ml.recommendation.ALSModel;public static class Rating implements Serializable {private int userId;private int movieId;private float rating;private long timestamp;public Rating() {}public Rating(int userId, int movieId, float rating, long timestamp) {this.userId = userId;this.movieId = movieId;this.rating = rating;this.timestamp = timestamp;}public int getUserId() {return userId;}public int getMovieId() {return movieId;}public float getRating() {return rating;}public long getTimestamp() {return timestamp;}public static Rating parseRating(String str) {String[] fields = str.split("::");if (fields.length != 4) {throw new IllegalArgumentException("Each line must contain 4 fields");}int userId = Integer.parseInt(fields[0]);int movieId = Integer.parseInt(fields[1]);float rating = Float.parseFloat(fields[2]);long timestamp = Long.parseLong(fields[3]);return new Rating(userId, movieId, rating, timestamp);} }JavaRDD<Rating> ratingsRDD = spark.read().textFile("data/mllib/als/sample_movielens_ratings.txt").javaRDD().map(Rating::parseRating); Dataset<Row> ratings = spark.createDataFrame(ratingsRDD, Rating.class); Dataset<Row>[] splits = ratings.randomSplit(new double[]{0.8, 0.2}); Dataset<Row> training = splits[0]; Dataset<Row> test = splits[1];// Build the recommendation model using ALS on the training data ALS als = new ALS().setMaxIter(5).setRegParam(0.01).setUserCol("userId").setItemCol("movieId").setRatingCol("rating"); ALSModel 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"); Dataset<Row> predictions = model.transform(test);RegressionEvaluator evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction"); Double rmse = evaluator.evaluate(predictions); System.out.println("Root-mean-square error = " + rmse);// Generate top 10 movie recommendations for each user Dataset<Row> userRecs = model.recommendForAllUsers(10); // Generate top 10 user recommendations for each movie Dataset<Row> movieRecs = model.recommendForAllItems(10);
在Spark repo中的“examples / src / main / java / org / apache / spark / examples / ml / JavaALSExample.java”中查找完整示例代碼。
如果評(píng)級(jí)矩陣是從另一個(gè)信息來(lái)源導(dǎo)出的(即從其他信號(hào)推斷出來(lái)),您可以將implicitPrefs設(shè)置為true以獲得更好的結(jié)果:
?
? ?轉(zhuǎn)載于:https://www.cnblogs.com/taoshiqian/p/7206380.html
總結(jié)
以上是生活随笔為你收集整理的Spark 2.2.0 文档中文版 Collaborative Filtering 协同过滤 JAVA推荐系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡提前还款有利于提额吗?提前还款后可
- 下一篇: 基于Flask实现后台权限管理系统 -