tests/testthat/test-recom.R

library("testthat")
library("recommenderlab")

data("MovieLense")

### test all real rating recommenders
context("Test real rating algorithms")
methods <- unique(sapply(
  recommenderRegistry$get_entries(dataType = "realRatingMatrix"),
  "[[",
  "method"
))

if (interactive())
  cat("Available methods for realRatingMatrix:",
    paste(methods, collapse = ", "))

MovieLense100 <- MovieLense[rowCounts(MovieLense) > 100,]
MovieLense100 <- MovieLense[, colCounts(MovieLense100) > 100]
train <- MovieLense100[1:20]
test1 <- MovieLense100[101]
test3 <- MovieLense100[101:103]

for (m in methods) {
  ### skip hybrid recommender
  if (m == "HYBRID")
    next

  if (interactive())
    cat("Algorithm:", m)

  if (m == "SVD")
    tm <- system.time(suppressWarnings(rec <- Recommender(train, method = m)))
  else
    tm <- system.time(rec <- Recommender(train, method = m))

  rec

  if (interactive())
    cat("\t [ train ", formatC(tm[3], digits = 4), "s / ")

  ### default is top-N list
  tm <- system.time(pre <- predict(rec, test1, n = 10))
  if (interactive())
    cat("pred ", formatC(tm[3], digits = 4), "s]\n")

  pre
  l <- as(pre, "list")
  expect_identical(length(l), 1L)
  expect_identical(length(l[[1]]), 10L)

  ### default is ton-N list
  pre <- predict(rec, test3, n = 10)
  pre
  l <- as(pre, "list")
  expect_identical(length(l), 3L)
  expect_equal(as.integer(sapply(l, length)), c(10L, 10L, 10L))

  ### contains NAs for known ratings
  pre <- predict(rec, test1, n = 10, type = "ratings")
  pre
  expect_gt(sum(is.na(as(pre, "matrix"))), 0L)

  ### full rating matrix
  ### RERECOMMEND cannot do it
  if (m != "RERECOMMEND") {
    pre <- predict(rec, test1, n = 10, type = "ratingMatrix")
    pre
    ### there can be NAs
    #expect_equal(sum(is.na(as(pre, "matrix"))), 0L)
  }

  pre <- predict(rec, test3, n = 10, type = "ratings")
  pre
  expect_gt(sum(is.na(as(pre, "matrix"))), 0L)

  ### RERECOMMEND cannot do it
  if (m != "RERECOMMEND") {
    pre <- predict(rec, test3, n = 10, type = "ratingMatrix")
    pre
  }
  ### there can be NAs
  #expect_equal(sum(is.na(as(pre, "matrix"))), 0L)
}

### Test HybridRecommender (just check if it fails)
recom <- HybridRecommender(
  Recommender(train, method = "POPULAR"),
  Recommender(train, method = "RANDOM"),
  Recommender(train, method = "RERECOMMEND"),
  weights = c(.6, .1, .3)
)
#recom
#getModel(recom)

predict(recom, test1)
predict(recom, test3)
predict(recom, test1, type = "ratings")
predict(recom, test3, type = "ratings")

### test all binary recommenders
context("Test binary algorithms")

methods <- unique(sapply(
  recommenderRegistry$get_entries(dataType = "binaryRatingMatrix"),
  "[[",
  "method"
))

if (interactive())
  cat("Available methods for binaryRatingMatrix:",
    paste(methods, collapse = ", "))

MovieLense100_bin <- binarize(MovieLense100, minRating = 3)
train <- MovieLense100_bin[1:50]
test1 <- MovieLense100_bin[101]
test3 <- MovieLense100_bin[101:103]

for (m in methods) {
  ### skip hybrid recommender
  if (m == "HYBRID")
    next


  if (interactive())
    cat("Algorithm:", m, "\n")
  rec <- Recommender(train, method = m)
  rec

  ### default is top-N list
  pre <- predict(rec, test1, n = 10)
  pre
  l <- as(pre, "list")
  expect_identical(length(l), 1L)
  expect_identical(length(l[[1]]), 10L)

  pre <- predict(rec, test3, n = 10)
  pre
  l <- as(pre, "list")
  expect_identical(length(l), 3L)
  expect_equal(as.integer(sapply(l, length)), c(10L, 10L, 10L))

  ## do I get errors?
  pre <- predict(rec, test1, n = 10, type = "ratings")

  if (interactive()) {
    cat("Prediction range (should be [0,1]):\n")
    print(summary(as.vector(as(pre, "matrix"))))
  }

  if (m != "RERECOMMEND") {
    pre <- predict(rec, test1, n = 10, type = "ratingMatrix")
  }

}

### Test HybridRecommender (just check if it fails)
recom <- HybridRecommender(
  Recommender(train, method = "POPULAR"),
  Recommender(train, method = "RANDOM"),
  Recommender(train, method = "AR"),
  Recommender(train, method = "RERECOMMEND"),
  ### not implemented for binary data
  weights = c(.25, .25, .25, .25)
)
#recom
#getModel(recom)

predict(recom, test1)
predict(recom, test3)
predict(recom, test1, type = "ratings")
predict(recom, test3, type = "ratings")

Try the recommenderlab package in your browser

Any scripts or data that you put into this service are public.

recommenderlab documentation built on Sept. 20, 2023, 9:06 a.m.