天天看點

R語言:recommenderlab包的總結與應用案例

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)

## -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")#預測結果

#代碼示例

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。

A man must be on his own!