recommenderlab:构建基于R的推荐系统
recommenderlab:構(gòu)建基于R的推薦系統(tǒng)(1)
http://site.douban.com/182577/widget/notes/10567212/note/345073868/
recommenderlab:構(gòu)建基于R的推薦系統(tǒng)(1)
1.推薦系統(tǒng)和recommenderlab包
recommenderlab包提供了一個(gè)可以用評(píng)分?jǐn)?shù)據(jù)和0-1數(shù)據(jù)來(lái)發(fā)展和測(cè)試推薦算法的框架。它提供了幾種基礎(chǔ)算法,并可利用注冊(cè)機(jī)制允許用戶使用自己的算法
recommender包的數(shù)據(jù)類型采用S4類構(gòu)造,使用抽象的raringMatrix為評(píng)分?jǐn)?shù)據(jù)提供接口。raringMatrix采用了很多類似矩陣對(duì)象的操作,如dim(),dimnames(),rowCounts(),colMeans(),rowMeans(),colSums(),rowMeans();也增加了一些特別的操作方法,如sample(),用于從用戶(即,行)中抽樣,image()可以生成像素圖。raringMatrix的兩種具體運(yùn)用是realRatingMatrix和binaryRatingMatrix,分別對(duì)應(yīng)評(píng)分矩陣的不同情況。其中realRatingMatrix使用的是真實(shí)值的評(píng)分矩陣,存儲(chǔ)在由Matrix包定義的稀疏矩陣(spare matrix)格式中;binaryRatingMatrix使用的是0-1評(píng)分矩陣,存儲(chǔ)在由arule包定義的itemMatrix中。
類Recommender使用數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)推薦模型。創(chuàng)建方法是:
Rencommender(data=ratingMatrix,method,parameter=NULL)
返回一個(gè)Rencommender對(duì)象object,可以用來(lái)做top-N推薦的預(yù)測(cè):
predict(object,newdata,n,type=c('topNlist,ratings'),…)
使用者可以利用registry包提供的注冊(cè)機(jī)制自定義自己的推薦算法。注冊(cè)機(jī)制調(diào)用recommenderRegistry并存貯推薦算法的名字和簡(jiǎn)短描述。
為評(píng)價(jià)推薦算法的表現(xiàn),recommender包提供了evaluationScheme類的對(duì)象用于創(chuàng)建并保存評(píng)價(jià)計(jì)劃。創(chuàng)建函數(shù)如下: evaluatiomScheme(data,method,train,k,given) 這里的方法可以采用簡(jiǎn)單劃分、自助法抽樣、k-折交叉驗(yàn)證等。接下來(lái)可以使用函數(shù)evalute()使用評(píng)價(jià)計(jì)劃的多個(gè)評(píng)價(jià)算法的表現(xiàn)。
下面用一個(gè)簡(jiǎn)單的人工例子來(lái)說(shuō)明recommender包的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作
m <- matrix(sample(c(as.numeric(0:5), NA), 30, replace = TRUE, prob = c(rep(0.5/6,?
????6), 0.5)), ncol = 6, dimnames = list(user = paste("u", 1:5, sep = ""), item = paste("i",?
????1:6, sep = "")))
m
## item
## user i1 i2 i3 i4 i5 i6
## u1 2 2 NA 0 NA NA
## u2 3 3 3 NA NA NA
## u3 NA 1 0 NA 0 1
## u4 NA 2 0 2 NA NA
## u5 NA NA NA NA 1 0
在這里所有沒(méi)評(píng)分的值都是NA
把m轉(zhuǎn)化為realRatingMatrix
library(recommenderlab)
m.real <- as(m, "realRatingMatrix")
m.real
## 5 x 6 rating matrix of class 'realRatingMatrix' with 15 ratings.
str(m.real)
## Formal class 'realRatingMatrix' [package "recommenderlab"] with 2 slots
## ..@ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
## .. .. ..@ i : int [1:15] 0 1 0 1 2 3 1 2 3 0 ...
## .. .. ..@ p : int [1:7] 0 2 6 9 11 13 15
## .. .. ..@ Dim : int [1:2] 5 6
## .. .. ..@ Dimnames:List of 2
## .. .. .. ..$ user: chr [1:5] "u1" "u2" "u3" "u4" ...
## .. .. .. ..$ item: chr [1:6] "i1" "i2" "i3" "i4" ...
## .. .. ..@ x : num [1:15] 2 3 2 3 1 2 3 0 0 0 ...
## .. .. ..@ factors : list()
## ..@ normalize: NULL
(rating <- m.real@data)
## 5 x 6 sparse Matrix of class "dgCMatrix"
## item
## i1 i2 i3 i4 i5 i6
## u1 2 2 . 0 . .
## u2 3 3 3 . . .
## u3 . 1 0 . 0 1
## u4 . 2 0 2 . .
## u5 . . . . 1 0
# 和下面的命令是等價(jià)的
dropNA(m)
## 5 x 6 sparse Matrix of class "dgCMatrix"
## item
## i1 i2 i3 i4 i5 i6
## u1 2 2 . 0 . .
## u2 3 3 3 . . .
## u3 . 1 0 . 0 1
## u4 . 2 0 2 . .
## u5 . . . . 1 0
identical(rating, dropNA(m))
## [1] TRUE
# 轉(zhuǎn)換回矩陣
as.matrix(rating)
## item
## user i1 i2 i3 i4 i5 i6
## u1 2 2 0 0 0 0
## u2 3 3 3 0 0 0
## u3 0 1 0 0 0 1
## u4 0 2 0 2 0 0
## u5 0 0 0 0 1 0
# NA沒(méi)有了,這種轉(zhuǎn)換是不合適的。需要這樣做
as(m.real, "matrix")
## item
## user i1 i2 i3 i4 i5 i6
## u1 2 2 NA 0 NA NA
## u2 3 3 3 NA NA NA
## u3 NA 1 0 NA 0 1
## u4 NA 2 0 2 NA NA
## u5 NA NA NA NA 1 0
數(shù)據(jù)操作:
# 轉(zhuǎn)化為列表
as(m.real, "list")
## $u1
## i1 i2 i4?
## 2 2 0?
##?
## $u2
## i1 i2 i3?
## 3 3 3?
##?
## $u3
## i2 i3 i5 i6?
## 1 0 0 1?
##?
## $u4
## i2 i3 i4?
## 2 0 2?
##?
## $u5
## i5 i6?
## 1 0
# 轉(zhuǎn)化為數(shù)據(jù)框
head(as(m.real, "data.frame"))
## user item rating
## 1 u1 i1 2
## 3 u1 i2 2
## 10 u1 i4 0
## 2 u2 i1 3
## 4 u2 i2 3
## 7 u2 i3 3
# 標(biāo)準(zhǔn)化
n.real <- normalize(m.real)
# 標(biāo)準(zhǔn)化前后的比較,像素圖
image(m.real, main = "Raw rating")
| ? |
image(n.real, main = "Normalized rating")
| ? |
2.協(xié)同過(guò)濾(Collaborative Flitering)方法
(1) 數(shù)據(jù)探索
協(xié)同過(guò)濾的基本思想是如果用戶在過(guò)去有相同的偏好,那么在未來(lái)也會(huì)有相似的偏好,所以可以利用已知的用戶過(guò)去的行為或評(píng)分對(duì)當(dāng)前用戶的喜好進(jìn)行預(yù)測(cè)。 協(xié)同推薦技術(shù)一般分為基于記憶的和基于模型的。基于記憶的模型根據(jù)保存在內(nèi)存中的原始評(píng)分?jǐn)?shù)據(jù)直接生成推薦,常用的如基于物品的推薦(IBCF)和基于用戶的推薦(UBCF)。
下面利用recommender包自帶的數(shù)據(jù)集MovieLense,討論基本的協(xié)同過(guò)濾推薦方法的使用。這個(gè)數(shù)據(jù)集收集了網(wǎng)站MovieLens(movielens.umn.edu)從1997年9月19日到1998年4月22日的數(shù)據(jù),包括943名用戶對(duì)1664部電影的評(píng)分。
首先利用可視化了解數(shù)據(jù)集的情況。
data(MovieLense)
# 可視化原始數(shù)據(jù)
image(MovieLense)
| ? |
# 獲取評(píng)分
ratings.movie <- data.frame(ratings = getRatings(MovieLense))
summary(ratings.movie$ratings)
## Min. 1st Qu. Median Mean 3rd Qu. Max.?
## 1.00 3.00 4.00 3.53 4.00 5.00
library(ggplot2)
ggplot(ratings.movie, aes(x = ratings)) + geom_histogram(fill = "beige", color = "black",?
????binwidth = 1, alpha = 0.7) + xlab("rating") + ylab("count")
| ? |
# 標(biāo)準(zhǔn)化
ratings.movie1 <- data.frame(ratings = getRatings(normalize(MovieLense, method = "Z-score")))
summary(ratings.movie1$ratings)
## Min. 1st Qu. Median Mean 3rd Qu. Max.?
## -4.850 -0.647 0.108 0.000 0.751 4.130
ggplot(ratings.movie1, aes(x = ratings)) + geom_histogram(fill = "beige", color = "black",?
????alpha = 0.7) + xlab("rating") + ylab("count")
| ? |
標(biāo)準(zhǔn)化的目的是為了去除用戶評(píng)分的偏差
# 用戶的電影點(diǎn)評(píng)數(shù)
movie.count <- data.frame(count = rowCounts(MovieLense))
ggplot(movie.count, aes(x = count)) + geom_histogram(fill = "beige", color = "black",?
????alpha = 0.7) + xlab("counts of users") + ylab("counts of movies rated")
| ? |
用戶存在長(zhǎng)尾
# 電影的平均評(píng)分
rating.mean <- data.frame(rating = colMeans(MovieLense))
ggplot(rating.mean, aes(x = rating)) + geom_histogram(fill = "beige", color = "black",?
????alpha = 0.7) + xlab("rating") + ylab("counts of movies ")
| ? |
(2)預(yù)測(cè)推薦
# 先看可以使用的方法
recommenderRegistry$get_entries(dataType = "realRatingMatrix")
## $IBCF_realRatingMatrix
## Recommender method: IBCF
## Description: Recommender based on item-based collaborative filtering (real data).
## Parameters:
## k method normalize normalize_sim_matrix alpha na_as_zero minRating
## 1 30 Cosine center FALSE 0.5 FALSE NA
##?
## $PCA_realRatingMatrix
## Recommender method: PCA
## Description: Recommender based on PCA approximation (real data).
## Parameters:
## categories method normalize normalize_sim_matrix alpha na_as_zero
## 1 20 Cosine center FALSE 0.5 FALSE
## minRating
## 1 NA
##?
## $POPULAR_realRatingMatrix
## Recommender method: POPULAR
## Description: Recommender based on item popularity (real data).
## Parameters: None
##?
## $RANDOM_realRatingMatrix
## Recommender method: RANDOM
## Description: Produce random recommendations (real ratings).
## Parameters: None
##?
## $SVD_realRatingMatrix
## Recommender method: SVD
## Description: Recommender based on SVD approximation (real data).
## Parameters:
## categories method normalize normalize_sim_matrix alpha treat_na
## 1 50 Cosine center FALSE 0.5 median
## minRating
## 1 NA
##?
## $UBCF_realRatingMatrix
## Recommender method: UBCF
## Description: Recommender based on user-based collaborative filtering (real data).
## Parameters:
## method nn sample normalize minRating
## 1 cosine 25 FALSE center NA
對(duì)于realRatingMatrix有六種方法:IBCF(基于物品的推薦)、UBCF(基于用戶的推薦)、SVD(矩陣因子化)、PCA(主成分分析)、 RANDOM(隨機(jī)推薦)、POPULAR(基于流行度的推薦)
利用前940位用戶建立推薦模型
m.recomm <- Recommender(MovieLense[1:940], method = "IBCF")
m.recomm
## Recommender of type 'IBCF' for 'realRatingMatrix'?
## learned using 940 users.
對(duì)后三位用戶進(jìn)行推薦預(yù)測(cè),使用predict()函數(shù),默認(rèn)是topN推薦,這里取n=3。預(yù)測(cè)后得到的一個(gè)topNList對(duì)象,可以把它轉(zhuǎn)化為列表,看預(yù)測(cè)結(jié)果。
(ml.predict <- predict(m.recomm, MovieLense[941:943], n = 3))
## Recommendations as 'topNList' with n = 3 for 3 users.
str(ml.predict)
## Formal class 'topNList' [package "recommenderlab"] with 3 slots
## ..@ items :List of 3
## .. ..$ : int [1:3] 10 14 19
## .. ..$ : int [1:3] 3 39 47
## .. ..$ : int [1:3] 13 128 206
## ..@ itemLabels: chr [1:1664] "Toy Story (1995)" "GoldenEye (1995)" "Four Rooms (1995)" "Get Shorty (1995)" ...
## ..@ n : int 3
as(ml.predict, "list")#預(yù)測(cè)結(jié)果
## [1]
## [1] "Richard III (1995)" "Postino, Il (1994)" "Antonia's Line (1995)"
##?
## [2]
## [1] "Four Rooms (1995)" "Strange Days (1995)" "Ed Wood (1994)"?
##?
## [3]
## [1] "Mighty Aphrodite (1995)" "Supercop (1992)"?
## [3] "Akira (1988)"
recommenderlab:構(gòu)建基于R的推薦系統(tǒng)(2)
3.評(píng)價(jià)推薦系統(tǒng)的表現(xiàn)
recommenderlab 包提供了函數(shù) evaluationScheme()建立評(píng)價(jià)方案,能夠使用簡(jiǎn)單劃分、k折交叉驗(yàn)證、自助法進(jìn)行模型的評(píng)價(jià)。下面采用簡(jiǎn)單劃分的方法(split),即將數(shù)據(jù)集簡(jiǎn)單分為訓(xùn)練集和測(cè)試集,在訓(xùn)練集訓(xùn)練模型,然后在測(cè)試集上評(píng)價(jià)。 evaluationScheme()的主要參數(shù):method,評(píng)估方法;train,劃分為訓(xùn)練集的數(shù)據(jù)比例;k運(yùn)行評(píng)估的折數(shù)或倍數(shù)(split的默認(rèn)值為1);given表示用來(lái)進(jìn)行模型評(píng)價(jià)的items的數(shù)量。
library(recommenderlab)
data(MovieLense)
scheme <- evaluationScheme(MovieLense, method = "split", train = 0.9, k = 1,?
????given = 10, goodRating = 4)
algorithms <- list(popular = list(name = "POPULAR", param = list(normalize = "Z-score")),?
????ubcf = list(name = "UBCF", param = list(normalize = "Z-score", method = "Cosine",?
????????nn = 25, minRating = 3)), ibcf = list(name = "IBCF", param = list(normalize = "Z-score")))
results <- evaluate(scheme, algorithms, n = c(1, 3, 5, 10, 15, 20))
## POPULAR run?
## 1 [0.08sec/0.16sec]?
## UBCF run?
## 1 [0.09sec/4.96sec]?
## IBCF run?
## 1 [114.8sec/0.84sec]
recomenderlab包也提供了繪制表現(xiàn)圖的方法,可以繪制ROC曲線和 precision-recall曲線
plot(results, annotate = 1:3, legend = "topleft") #ROC
| ? |
plot(results, "prec/rec", annotate = 3)#precision-recall
| ? |
用calcPredictionError()函數(shù)可以計(jì)算由用戶精確評(píng)分給出的預(yù)測(cè)評(píng)分的MAE,MSE和RMSE這三種誤差
# 按照評(píng)價(jià)方案建立推薦模型
model.popular <- Recommender(getData(scheme, "train"), method = "POPULAR")
model.ibcf <- Recommender(getData(scheme, "train"), method = "IBCF")
model.ubcf <- Recommender(getData(scheme, "train"), method = "UBCF")
# 對(duì)推薦模型進(jìn)行預(yù)測(cè)
predict.popular <- predict(model.popular, getData(scheme, "known"), type = "ratings")
predict.ibcf <- predict(model.ibcf, getData(scheme, "known"), type = "ratings")
predict.ubcf <- predict(model.ubcf, getData(scheme, "known"), type = "ratings")
# 做誤差的計(jì)算
predict.err <- rbind(calcPredictionError(predict.popular, getData(scheme, "unknown")),?
????calcPredictionError(predict.ubcf, getData(scheme, "unknown")), calcPredictionError(predict.ibcf,?
????????getData(scheme, "unknown")))
rownames(predict.err) <- c("POPULAR, "UBCF", "IBCF")
predict.err
## MAE MSE RMSE
##POPULAR 3.5402 13.489 3.673
## UBCF 0.8051 1.062 1.030
## IBCF 0.8414 1.333 1.154
calcPredictionError()的參數(shù)“know”和“unknow”表示對(duì)測(cè)試集的進(jìn)一步劃分:“know”表示用戶已經(jīng)評(píng)分的,要用來(lái)預(yù)測(cè)的items;“unknow”表示用戶已經(jīng)評(píng)分,要被預(yù)測(cè)以便于進(jìn)行模型評(píng)價(jià)的items。
總結(jié)
以上是生活随笔為你收集整理的recommenderlab:构建基于R的推荐系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。