R語言:recommenderlab包的總結與應用案例
1. 推薦系統:recommenderlab包整體思路
recommenderlab包提供了一個可以用評分數據和0-1數據來發展和測試推薦算法的框架。
它提供了幾種基礎算法,並可利用注冊機制允許用戶使用自己的算法
recommender包的數據類型采用S4類構造。
(1)評分矩陣數據接口:使用抽象的raringMatrix為評分數據提供接口。raringMatrix采用了很多類似矩陣對象的操作,如 dim(),dimnames() ,rowCounts() ,colMeans() ,rowMeans(),colSums(),rowMeans();也增加了一些特別的操作方法,如sample(),用於從用戶(即,行)中抽樣,image()可以生成像素圖。raringMatrix的兩種具體運用是realRatingMatrix和binaryRatingMatrix,分別對應評分矩陣的不同情況。其中realRatingMatrix使用的是真實值的評分矩陣,存儲在由Matrix包定義的稀疏矩陣(spare matrix)格式中;binaryRatingMatrix使用的是0-1評分矩陣,存儲在由arule包定義的itemMatrix中。
(2)存儲推薦模型並基於模型進行推薦。類Recommender使用數據結構來存儲推薦模型。創建方法是:Rencommender(data=ratingMatrix,method,parameter=NULL),返回一個Rencommender對象object,可以用來做top-N推薦的預測:
predict(object,newdata,n,type=c('topNlist,ratings'),…)
(3)使用者可以利用registry包提供的注冊機制自定義自己的推薦算法。注冊機制調用recommenderRegistry並存貯推薦算法的名字和簡短描述。
(4)評價推薦算法的表現:recommender包提供了evaluationScheme類的對象用於創建並保存評價計划。創建函數如下: evaluatiomScheme(data,method,train,k,given) 這里的方法可以采用簡單划分、自助法抽樣、k-折交叉驗證等。接下來可以使用函數evalute()使用評價計划的多個評價算法的表現。
2.實例分析
library(recommenderlab)
library(ggplot2)
##數據處理與數據探索性分析
data(MovieLense)
image(MovieLense)
# 獲取評分
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
ggplot(ratings.movie, aes(x = ratings)) + geom_histogram(fill = "beige", color = "black",
binwidth = 1, alpha = 0.7) + xlab("rating") + ylab("count")
# 標准化
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")
# 用戶的電影點評數
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")
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 ")
##推薦算法的情況
# 先看可以使用的方法
recommenderRegistry$get_entries(dataType = "realRatingMatrix")
#對於realRatingMatrix有六種方法:IBCF(基於物品的推薦)、UBCF(基於用戶的推薦)、SVD(矩陣因子化)、PCA(主成分分析)、 RANDOM(隨機推薦)、POPULAR(基於流行度的推薦)
#利用前940位用戶建立推薦模型
m.recomm <- Recommender(MovieLense[1:940], method = "IBCF")
m.recomm
#對后三位用戶進行推薦預測,使用predict()函數,默認是topN推薦,這里取n=3。預測后得到的一個topNList對象,可以把它轉化為列表,看預測結果。
(ml.predict <- predict(m.recomm, MovieLense[941:943], n = 3))
str(ml.predict)
as(ml.predict, "list")#預測結果
#代碼示例
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))
plot(results, annotate = 1:3, legend = "topleft") #ROC
plot(results, "prec/rec", annotate = 3)#precision-recall
# 按照評價方案建立推薦模型
model.popular <- Recommender(getData(scheme, "train"), method = "POPULAR")
model.ibcf <- Recommender(getData(scheme, "train"), method = "IBCF")
model.ubcf <- Recommender(getData(scheme, "train"), method = "UBCF")
# 對推薦模型進行預測
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")
# 做誤差的計算
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
#calcPredictionError()的參數“know”和“unknow”表示對測試集的進一步划分:“know”表示用戶已經評分的,要用來預測的items;“unknow”表示用戶已經評分,要被預測以便於進行模型評價的items。
recommenderlab包提供了一個可以用評分數據和0-1數據來發展和測試推薦算法的框架。
它提供了幾種基礎算法,並可利用注冊機制允許用戶使用自己的算法
recommender包的數據類型采用S4類構造。
(1)評分矩陣數據接口:使用抽象的raringMatrix為評分數據提供接口。raringMatrix采用了很多類似矩陣對象的操作,如 dim(),dimnames() ,rowCounts() ,colMeans() ,rowMeans(),colSums(),rowMeans();也增加了一些特別的操作方法,如sample(),用於從用戶(即,行)中抽樣,image()可以生成像素圖。raringMatrix的兩種具體運用是realRatingMatrix和binaryRatingMatrix,分別對應評分矩陣的不同情況。其中realRatingMatrix使用的是真實值的評分矩陣,存儲在由Matrix包定義的稀疏矩陣(spare matrix)格式中;binaryRatingMatrix使用的是0-1評分矩陣,存儲在由arule包定義的itemMatrix中。
(2)存儲推薦模型並基於模型進行推薦。類Recommender使用數據結構來存儲推薦模型。創建方法是:Rencommender(data=ratingMatrix,method,parameter=NULL),返回一個Rencommender對象object,可以用來做top-N推薦的預測:
predict(object,newdata,n,type=c('topNlist,ratings'),…)
(3)使用者可以利用registry包提供的注冊機制自定義自己的推薦算法。注冊機制調用recommenderRegistry並存貯推薦算法的名字和簡短描述。
(4)評價推薦算法的表現:recommender包提供了evaluationScheme類的對象用於創建並保存評價計划。創建函數如下: evaluatiomScheme(data,method,train,k,given) 這里的方法可以采用簡單划分、自助法抽樣、k-折交叉驗證等。接下來可以使用函數evalute()使用評價計划的多個評價算法的表現。
2.實例分析
library(recommenderlab)
library(ggplot2)
##數據處理與數據探索性分析
data(MovieLense)
image(MovieLense)
# 獲取評分
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
ggplot(ratings.movie, aes(x = ratings)) + geom_histogram(fill = "beige", color = "black",
binwidth = 1, alpha = 0.7) + xlab("rating") + ylab("count")
# 標准化
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")
# 用戶的電影點評數
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")
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 ")
##推薦算法的情況
# 先看可以使用的方法
recommenderRegistry$get_entries(dataType = "realRatingMatrix")
#對於realRatingMatrix有六種方法:IBCF(基於物品的推薦)、UBCF(基於用戶的推薦)、SVD(矩陣因子化)、PCA(主成分分析)、 RANDOM(隨機推薦)、POPULAR(基於流行度的推薦)
#利用前940位用戶建立推薦模型
m.recomm <- Recommender(MovieLense[1:940], method = "IBCF")
m.recomm
#對后三位用戶進行推薦預測,使用predict()函數,默認是topN推薦,這里取n=3。預測后得到的一個topNList對象,可以把它轉化為列表,看預測結果。
(ml.predict <- predict(m.recomm, MovieLense[941:943], n = 3))
str(ml.predict)
as(ml.predict, "list")#預測結果
#代碼示例
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))
plot(results, annotate = 1:3, legend = "topleft") #ROC
plot(results, "prec/rec", annotate = 3)#precision-recall
# 按照評價方案建立推薦模型
model.popular <- Recommender(getData(scheme, "train"), method = "POPULAR")
model.ibcf <- Recommender(getData(scheme, "train"), method = "IBCF")
model.ubcf <- Recommender(getData(scheme, "train"), method = "UBCF")
# 對推薦模型進行預測
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")
# 做誤差的計算
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
#calcPredictionError()的參數“know”和“unknow”表示對測試集的進一步划分:“know”表示用戶已經評分的,要用來預測的items;“unknow”表示用戶已經評分,要被預測以便於進行模型評價的items。