본문 바로가기

R/R로 만드는 추천 시스템

추천 시스템의 평가 - 01

반응형

이전 장에서는 추천 시스템들을 어떻게 만드는지 알아봤따. 몇 가지 선택 사항에 따라, 그중 일부는 recommenderlab 패키지를 사용해 개발할 수 있따. 또한 각 추천 기법에는 약간의 매개변수의 설정도 필요하다. 추천 모델들을 만든 후에는 어떤 모델을 사용할것인지 어떻게 결정할 수 있을까? 매개변수는 어떻게 결정할 수 있을까? 모델 중 일부나 매개변수 설정에 따른 추천 성능을 먼저 테스트해, 그중에서 가장 좋은 성능을 가지는 모델과 매개변수를 고를 수 있다.

지금부터는 어떻게 모델을 평가하고 모델의 성능을 비교하며 가장 적합한 모델을 고르는지 알아본다. 이 장에서는 다음 주제들을 다룬다.

  • 모델을 평가하기 위한 데이터 준비
  • 몇몇 모델들에 대한 성능 평가
  • 가장 좋은 성능을 가지는 모델의 선택
  • 모델의 매개변수 최적화

모델 평가를 위한 데이터 준비

모델을 평가하려면 데이터 중 일부로 모델을 만들고 나머지로 테스트해야 한다. 여기에서는 데이터의 두 가지 세트를 어떻게 준비하는지 알아본다. recommenderlab 패키지에는 이러한 작업을 수행하는 데 도움이 되는 도구들이 포함돼 있다.

다음과 같은 두 개의 데이터 세트를 정의하는 것이 목표다.

  • 트레이닝 세트 : 모델을 만들기 위한 데이터 세트다.
  • 테스트 세트 : 만들어진 모델을 테스트하기 위한 데이터 세트다.

모델을 평가하려면 모델의 추천 결과와 사용자 선호도(평점)를 비교해얗 한다. 이를 위해서는 테스트 세트의 사용자 선호도를 모르는 상태에서 추천 기법을 통해 예측할 수 있는지 확인해야 한다. 즉, 테스트 세트의 사용자별 데이터는 무시하고 트레이닝 세트의 데이터를 기반으로 추천 결과를 만들어야 한다. 먼저 필요한 패키지를 불러온다.

set.seed(1)
library(recommenderlab)
library(ggplot2)

여기서는 MovieLense라는 데이터 세트를 사용한다. 이 데이터 세트에서 출현 빈도가 높은 사용자 및 영화만 포함하는 데이터 세트인 ratings_movies를 정의한다.

data(MovieLense)
ratings_movies <- MovieLense[rowCounts(MovieLense) > 50,
                             colCounts(MovieLense) > 100]
ratings_movies
560 x 332 rating matrix of class ‘realRatingMatrix’ with 55298 ratings.

이제 평가를 위한 데이터가 준비됐다.

 

데이터 분할

트레이닝 및 테스트 세틀르 만드는 가장 쉬운 방법은 데이터를 두 부분으로 나누는 것이다. 먼저, 각 부분에 사용자를 얼마만큼 넣을지를 결정해야 한다. 예를 들어, 사용자의 80%를 트레이닝 세트로 지정할 수 있다. 다음과 같이 트레이닝 세트의 비율을 지정해 percentage_training을 정의할 수 있다.

percentage_training <- 0.8

다음으로 테스트 세트의 사용자별로 추천 결과를 만들 때 사용할 아이템 수를 정의해야 한다. 나머지 아이템들은 모델의 정확도를 테스트하는 데 사용될 것이다. 이 매개변수는 모델을 테스트할 아이템이 없는 사용자가 없도록 사용자가 구매한 아이템 수의 최솟값보다 적은 것이 좋다.

min(rowCounts(ratings_movies))
[1] 18

예를 들어 아이템 수를 15개 밑으로 유지한다.

items_to_keep <- 15

모델은 사용자의 평점을 알 수 없는 아이템들에 대해 추천 결과와 비교하는 것으로 평가된다. 평점은 1에서 5 사이며, 좋고 나쁜 평점을 정의해야 한다. 이를 위해 좋음으로 간주하는 평점의 임계 값(threshold)을 정의한다.

rating_threshold <- 3

또한 평가를 몇 번이나 실행할지를 정의하는 추가적ㅇ니 매개변수가 있다. 여기서는 임시로 1로 설정한다.

n_eval <- 1

이제 데이터를 나눌 준비가 됐다. 이 작업의 수행을 지원하는 recommenderlab 패키지의 함수는 evaluationScheme이며 다음과 같은 매개변수를 지정할 수 있다.

  • data :  초기 데이터 세트다.
  • method : 데이터를 나누는 방법을 정한다. 이 경우에는 split이다.
  • train : 트레이닝 세트로 할당할 비율이다.
  • given : 유지할 아이템의 수다.
  • goodRating : 평점의 임계 값이다.
  • k : 평가를 실행할 반복 횟수다.

이제 나눠진 데이터 세트를 포함한 eval_sets를 만들어본다.

eval_sets <- evaluationScheme(data = ratings_movies, method = "split",
                              train = percentage_training, given = items_to_keep,
                              goodRating = rating_threshold, k = n_eval)
                              
eval_sets
Evaluation scheme with 15 items given
Method: ‘split’ with 1 run(s).
Training set proportion: 0.800
Good ratings: >=3.000000
Data set: 560 x 332 rating matrix of class ‘realRatingMatrix’ with 55298 ratings.

 

getData 함수를 사용해 다음과 같이 세 가지로 나뉜 데이터 세트를 확인할 수 있다.

  • train : 트레이닝 세트다.
  • known : 추천 결과를 만들기 위해 사용된 아이템들을 가진 테스트 세트다.
  • unknown : 추천 결과를 테스트하기 위해 사용되는 아이템들을 가진 데이터 세트다.

먼저, 트레이닝 세트를 살펴본다.

getData(eval_sets, "train")
448 x 332 rating matrix of class ‘realRatingMatrix’ with 43921 ratings.

getData 함수의 실행 결과는 realRatingMatrix 유형으로 nrow나 rowCounts와 같은 함수를 사용할 수 있다.

nrow(getData(eval_sets, "train")) / nrow(ratings_movies)
[1] 0.8

예상대로 약 80%의 사용자가 트레이닝 세트에 포함돼 있다. 다음으로 두 가지의 테스트 세트를 살펴본다.

getData(eval_sets, "known")
112 x 332 rating matrix of class ‘realRatingMatrix’ with 1680 ratings.

getData(eval_sets, "unknown")
112 x 332 rating matrix of class ‘realRatingMatrix’ with 9697 ratings.

둘 다 같은 수의 사용자를 가지고 있다. 또한 테스트 세트에는 약 20%의 데이터가 포함돼 있어야 한다.

nrow(getData(eval_sets, "known")) / nrow(ratings_movies)
[1] 0.2

모두 예상대로다. 다음으로 known 세트의 사용자별로 얼마만큼의 아이템을 가졌는지 살펴본다. 이 값은 items_to_keep과 같은 15다.

unique(rowCounts(getData(eval_sets, "known")))

unknown 세트는 사용자별로 구매한 횟수에 따라 달라지므로 가지고 있는 아이템의 수는 사용자마다 다르다.

qplot(rowCounts(getData(eval_sets, "unknown"))) +
  geom_histogram(binwidth = 10) +
  ggtitle("unknown items by the users")

다음의 도표는 사용자별 unknown 아이템들을 보여준다.

예상대로 사용자들이 가지고 있는 아이템의 수는 다양하다.

반응형

'R > R로 만드는 추천 시스템' 카테고리의 다른 글

추천 시스템의 평가 - 03  (0) 2020.03.24
추천 시스템의 평가 - 02  (0) 2020.03.24
추천 시스템 - 05  (0) 2020.03.20
추천 시스템 - 04  (0) 2020.03.19
추천 시스템 - 03  (0) 2020.03.19