R을 사용한 추천 알고리즘 만들기 2/3

지난 포스트를 통해 협업 필터링(Collaborative filtering)을 사용한 추천 원리에 대해 설명 드렸죠?

이번 포스트에서는 R을 사용해서 추천 알고리즘을 만드는 실습을 해 보도록 하겠습니다. Recommenderlab 를 사용하면 어렵지 않게 추천 알고리즘을 만들 수 있습니다.

Algorithms-Programming-Humour
추천 알고리즘, 어렵지 않아요.

1. 데이터셋 로드 & 탐색적 데이터 분석 (Exploratory Data Analysis)

우선 recommenderlab패키지를 불러오고, 내장되어 있는 Jester5K라는 데이터 셋을 불러 옵니다. Jester5K는 5000명의 사용자가 100개의 농담을 -10점부터 10점 사이의 평점으로 평가한 데이터 입니다.

Jester5k의 Class는 realRatingMatrix네요. realRatingMatrix는 recommenderlab패키지에서 사용하는 객체입니다. data.frame으로 class를 변형시켜 보니 총 36만 2106개의 rating 정보를 담고 있는 데이터 셋이네요.

realRatingMatrix 객체는 아래 as 함수를 사용하면 간단하게 만들 수 있습니다.

객체이름 <- as(데이터셋, “realRatingMatrix”)

점수 분포를 한번 살펴 볼까요? 아래 히스토그램을 보면 흥미로운 점이 눈에 띄네요. 0점 이하의 점수대는 빈도가 일정한 것에 비해 +점수대는 4점에서 Peak를 찍다가 점점 내려가는 모양이네요.

recommenderlab-histogram
Jester5K : Rating Histogram

사람들은 각자 점수를 매기는 편향이 다르기 때문에, 추천 알고리즘에 데이터를 입력하기 전에 점수를 평준화 하는 것이 중요하다고 말씀드렸죠? 아래 두 그래프는 각각 row centering 방식(=사용자 별 평준화, 좌측), Z-score 방식(우측)으로 점수를 평준화 한 그래프 입니다.

recommenderlab - normalized histogram
Jester5K : Normalized Rating Histogram

 

2. 추천 모델(Recommendation Algorithm) 만들기

Recommender 함수에 사용자 별 평가 점수 데이터셋을 입력하면 추천 알고리즘을 만들 수 있습니다. (주의: 데이터 셋은 “realRatingMatrix” 클라스여야 합니다.)

알고리즘을 만든 후에는 성능 평가를 해야하기 떄문에, Jester5k에서 랜덤으로 training 데이터셋을 추출합니다. 아래 코드를 사용해 1000명의 사용자를 샘플링 하고, Popular 방식으로 Recommendation algorithm을 만들어 보겠습니다.

위 코드를 통해 r이라는 recommendation 객체가 만들어 졌습니다. 이제 이 r이라는 객체를 사용해 다른 사용자에게 추천해 줄 상위 20개의 농담을 확인해 보겠습니다. 추천해 줄 농담을 추출하기 위해서는 predict 함수를 사용합니다.

“POPULAR” 방식으로 추천 알고리즘을 만들 경우, 예측 결과로 아이템의 “순위”가 반환됩니다.

또 다른 방식으로는 “ratings” 방식이 있는데요, 이 방식으로 추천 알고리즘을 만들 경우 반환되는 결과는 아이템 별 “예측 점수” 입니다. 아래 코드와 같이 1001번, 1002번 사용자에 대한 농담 별 예상 점수를 구할 수도 있습니다.

 

3. 모델 평가하기

데이터 분석가가 자주 하는 실수들에 관한 예전 포스팅에서도 말씀드렸지만, 모델을 세우고 나서 모델의 정확성을 평가하는 것은 매우 중요합니다.

기껏 모델을 만들었는데, 예측력이 높지 않다면 실망스럽기도 하겠지만, 비즈니스 임팩트도 크지 않겠죠. 다음 포스팅에서는 Recommenderlab을 사용해서 만든 추천 알고리즘의 성능을 평가하는 방법에 대해서 알아보도록 하겠습니다.

 

 

참고 자료

1) Michael Hahsler, recommenderlab: A Framework for Developing and Testing Recommendation Algorithms

2) Inside-R, normalize {recommenderlab}