데이터 준비
이 절에서는 추천 모델에서 사용되는 데이터를 준비하는 방법을 설명한다. 다음 단계를 수행한다.
- 관련 데이터 선택
- 데이터 표준화
가장 적절한 데이터 선택하기
데이터를 살펴보면 다음과 같은 사실에 주목하게 된다.
- 시청 횟수가 적은 영화는 정보 부족으로 평점에 편향이 있을 수 있다.
- 거의 평점을 매기지 않는 사용자는 등급에 편향이 있을 수 있다.
영화당 최소 시청 횟수를 지정할 필요가 있으며 그 반대도 마찬가지다. 가장 적절한 데이터를 선택하기 위해서는 데이터 준비, 추천 모델 구현, 유효성 검사라는 전체 과정이 반복돼 이뤄진다. 우리는 처음 모델을 구현하므로 경험적 방법을 사용 가능하지만 이후에는 오류를 줄이기 위해 데이터 준비부터 다시 돌아가서 수정할 수 있다.
ratings_movies에 다음의 조건을 반영해 우리가 사용할 매트릭스를 생성하자.
- 영화를 50편 이상 평가한 사용자
- 적어도 100번 이상 시청된 영화
다음 코드로 구현할 수 있다.
ratings_movies <- MovieLense[rowCounts(MovieLense)>50,
colCounts(MovieLense)>100]
ratings_movies
560 x 332 rating matrix of class ‘realRatingMatrix’ with 55298 ratings.
ratings_movies 객체의 경우 MovieLense와 비교하면 약 절반의 사용자와 20% 정도의 영화가 포함된다.
가장 적절한 데이터 탐색
이전 절에서 했던 것과 같은 방식으로 새로운 매트릭스에서 사용자와 영화의 상위 2%를 시각화해본다.
#상위 조건 반영
min_movies <- quantile(rowCounts(ratings_movies), 0.98)
min_users <- quantile(colCounts(ratings_movies), 0.98)
히트맵을 만들어보자.
image(ratings_movies[rowCounts(ratings_movies) > min_movies,
colCounts(ratings_movies) > min_users],
main = "Heatmap of the top users and movies")
다음 그림은 상위권 사용자와 영화의 히트맵을 나타낸다.
이미 인지하고 있듯이 일부 행은 다른 행보다 어둡다. 이는 일부 사용자가 모든 영화에 더 높은 평점을 부여할 수 있음을 의미한다. 그러나 우리는 상위의 영화만을 시각화한다. 모든 사용자의 개략적 내용을 보기 위해 사용자별 평균 평점 분포를 살펴본다.
average_ratings_per_user <- rowMeans(ratings_movies)
분포를 시각화해본다.
qplot(average_ratings_per_user) +
stat_bin(binwidth = 0.1) +
ggtitle("Distribution of the average rating per user")
다음 그림은 사용자당 평균 평점 분포를 보여준다.
예상한 대로 평균 평점은 여러 사용자마다 크게 다르다.
데이터 정규화
모든 영화에 높은(또는 낮은) 평점을 부여하는 사용자는 결과를 왜곡시킬 수 있다. 각 사용자의 평균 평점이 0이 되도록 데이터를 정규화해 이 문제를 제거할 수 있다. normalize 함수는 이 과정을 자동으로 수행한다.
ratings_movies_norm <- normalize(ratings_movies)
사용자의 평균 평점을 살펴본다.
sum(rowMeans(ratings_movies_norm) > 0.00001)
[1] 0
예상대로 각 사용자의 평균 평점은 0이다(근삿값 오차 제외). image를 사용해 새 매트릭스를 시각화할 수 있다. 히트맵을 만들어본다.
#정규화된 매트릭스를 시각화
image(ratings_movies_norm[rowCounts(ratings_movies_norm) > min_movies,
colCounts(ratings_movies_norm) > min_users],
main = "Heatmap of the top users and movies")
다음 그림은 상위 사용자 및 영화의 히트맵을 보여준다.
이전과의 가장 큰 차이점으로 연속적인 데이터를 나타내기 위한 색상이 있다. 이전에 등급이 1에서 5사이의 정수였다면, 정규화 후의 등급은 -5에서 5 사이에 있는 임의의 수가 될 수 있다.
좀 더 파랗거나 빨간 일부가 여전히 존재한다. 이는 상위권의 영화만을 시각화했기 때문이다. 우리는 이미 각 사용자의 평균 평점이 0인 것을 확인했다.
데이터 이진화
일부 추천 모델은 바이너리 데이터에서 작동하므로 데이터를 이진화해야 할 수도 있다. 0은 누락된 값 또는 나쁜 평점으로 간주한다.
이 경우 다음 중 하나의 방법이 선택될 수 있다.
- 사용자가 영화에 평점을 매기면 1, 그렇지 않으면 0인 매트릭스를 정의한다. 이 경우 상세 평점에 대한 정보가 손실된다.
- 평점이 일정한 기준값 이상인 경우 1을, 그렇지 않은 경우 0인 매트릭스를 정의한다. 이는 나쁜 평점이 부여된 영화를 평가에서 제외하는 효과가 있다.
상황에 따라 더 적절한 방법을 선택할 수 있다.
데이터 이진화 명령은 binarize며 이를 데이터에 적용해보자. 먼저 영화가 시청된 경우, 즉 평점이 1 이상인 경우 매트릭스를 1로 정의한다.
ratings_movies_watched <- binarize(ratings_movies, minRating = 1)
결과를 살펴본다. 이 경우 사용자와 영화의 더 많은 부분을 시각화할 수 있도록 흑백 도표를 사용한다. 예를 들어 상위 5%를 나타내기 위해 quantile을 사용해 5%를 지정한다. 행과 열의 개수는 원래의 매트릭스와 같으므로 rating_movies에 rowCounts와 colCounts를 여전히 적용할 수 있다.
min_movies_binary <- quantile(rowCounts(ratings_movies), 0.95)
min_users_binary <- quantile(colCounts(ratings_movies), 0.95)
히트맵을 만들어 본다.
image(ratings_movies_watched[rowCounts(ratings_movies) > min_movies_binary,
colCounts(ratings_movies) > min_users_binary],
main = "Heatmap of the top users and movies")
다음 그림은 상위 사용자와 영화의 히트맵을 보여준다.
몇 개의 셀에만 시청되지 않은 영화가 포함돼 있다. 이는 최상위 사용자와 영화를 선택했기 때문이다.
다른 형태의 이진 매트릭스를 계산하고 시각화하기 위해 같은 접근법을 사용한다. 이번에는 기준값보다 큰 평점의 셀은 1과 같은 값을 가지며 다른 셀은 0이다.
ratings_movies_good <- binarize(ratings_movies, minRating = 3)
히트맵을 만들어 본다.
image(ratings_movies_good[rowCounts(ratings_movies) > min_movies_binary,
colCounts(ratings_movies) > min_users_binary],
main = "Heatmpa of the top users and movies")
다음 그림은 상위 사용자와 영화의 히트맵을 보여준다.
예상대로 더 많은 하얀점들이 보인다. 추천 모델에 따라 평점 매트릭스를 그대로 사용하거나 정규화/이진화를 수행한 후 사용할 수도 있다.
이 절에서는 추천을 수행하기 위한 데이터를 준비했다. 다음 절에서는 협업 필터링 모델을 알아본다.
'R > R로 만드는 추천 시스템' 카테고리의 다른 글
추천 시스템 - 05 (0) | 2020.03.20 |
---|---|
추천 시스템 - 04 (0) | 2020.03.19 |
추천 시스템 - 02 (0) | 2020.03.17 |
추천 시스템 - 01 (0) | 2020.03.17 |
추천 시스템에서 사용되는 데이터 마이닝 기법-03 (0) | 2020.03.16 |