추천 알고리즘을 이용한 유저별 맞춤 영화 목록을 조회합니다.
-
URL
/recommendation/:shortId
-
Method
GET
-
URL Params
Required:
shortId=[String]
-
Data Params
None
-
Success Response
-
Code: 200
-
Content:
{ "recommendList": [ { "movieId": 9909, "star": 4.7 }, { "movieId": 11360, "star": 4.3 }, { "movieId": 819, "star": 4.1 } ] }
-
-
Error Response
-
Code: 404 NOT FOUND
-
Content:
{ "fail": "추천 영화 목록 조회에 실패했습니다." }
-
평가할 영화 정보를 랜덤으로 조회합니다.
-
URL
/eval/:movieCount
-
Method
GET
-
URL Params
Required:
movieCount=[Integer]
-
Data Params
None
-
Success Response
-
Code: 200
-
Content:
{ "movieNum": 3, "result": [ { "movieId": 5418 }, { "movieId": 1307 }, { "movieId": 1221 } ] }
-
-
Error Response
-
Code: 404 NOT FOUND
-
Content:
{ "fail": "평가 영화 정보 조회에 실패했습니다." }
-
평가한 영화 정보를 등록합니다.
-
URL
/eval
-
Method
POST
-
URL Params
None
-
Data Params
Required:
shortId=[String]
movieId=[Integer]
star=[Double]
-
Success Response
-
Code: 200
-
Content:
{ "shortId": "123abc", "result": [ { "movieId": 37550, "star": 2 }, { "movieId": 862, "star": 3.5 }, { "movieId": 3525, "star": 0.5 } ] }
-
-
Error Response
-
Code: 401 UNAUTHORIZED
-
Content:
{ "fail": "유저 정보를 찾을 수 없습니다." }
-
1. 데이터 수집 및 전처리
1. 데이터 수집 및 전처리
-
270,000명의 사용자가 45,000개의 영화에 남긴 26,000,000개의 평가와 750,000개의 태그로 구성
행렬 분해를 손쉽게 하기 위해
유저 - 아이템
평점 데이터를유저
,영화
,평점
컬럼별로 정리하였으며, TMDB API 서비스를 사용하기 쉽게 모든 영화 데이터를 TMDB영화 ID
에 맞게 변환하였습니다.
2. 모델 구현
추천 알고리즘은 크게 두 가지로 볼 수 있습니다.
콘텐츠 기반 필터링(Content Based Filtering)과 협업 필터링(Collaborative Filtering)입니다.
콘텐츠 기반 필터링은 특정 컨텐츠를 기준으로 비슷한 컨텐츠를 추천해줍니다.
예를 들어, 유저
가 특정 영화
를 좋아한다면 그것과 비슷한 영화
를 추천해주는 방식입니다.
이 방식은 몇 가지 단점이 존재하는데, 유저
가 좋아하는 특정 영화
와 유사한 영화
만 추천해줄 수 있습니다.
즉, 유저
의 취향을 고려하지 않은, 영화
장르 전반에 걸친 추천이 아닌 획일화된 추천을 할 우려가 있습니다.
따라서, 우리 팀은 유저
의 취향을 고려하여 추천해줄 수 있는 협업 필터링 방식을 사용하기로 했으며 그 중 잠재 요인 협업 필터링을 채택했습니다.
협업 필터링 방식은 다른 유저
의 데이터를 기반으로 추천을 해주는 방식입니다.
협업 필터링 방식은 최근접 이웃과 잠재요인으로 나뉘는데, 최근접 이웃 방식은 유저
를 기준으로 유저
간 선호도를 바탕으로 추천해주는 방식과 아이템
을 기준으로 아이템
간의 연관성을 측정하여 추천해주는 방식이 있습니다.
잠재요인 방식은 유저
와 아이템
에 대한 평점
행렬에 숨겨져 있는 잠재적 요인을 추출하여 추천해주는 방식입니다.
우리는 유저
와 아이템 평점
이라는 대규모 다차원 행렬을 SVD라는 차원 축소 기법으로 행렬 분해하여 잠재 요인을 추출했습니다.
잠재 요인 방법은 하나의 최적화 문제라고 볼 수도 있습니다.
유저
에 대해서 특정 아이템
에 대한 평점
을 얼마나 잘 예측하는지를 봐야하기 때문입니다.
이 때문에, RMSE(Root Mean Square Error)를 통해 정확도를 측정하였습니다.
RMSE가 낮을수록 좋은 성능을 보여주는데, 위 수식에서
유저
와 잠재 요인간의 관계를 나타내고, 아이템
과 잠재 행렬 간의 유사도를 나타냅니다.
이러한 행렬 분해로 추출되는 잠재 요인은 영화가 가지는 장르별 특성 선호드 등이 될 수 있습니다.
SVD는 Utility Matrix에서 잠재 요인을 추출하면서 행렬의 차원을 축소시키고, 유저
와 아이템
각각을
이렇게 유저
와 아이템
을 직접적으로 비교하여 둘의 관계를 예측합니다.