추천 알고리즘을 이용한 유저별 맞춤 영화 목록을 조회합니다.
-
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에서 잠재 요인을 추출하면서 행렬의 차원을 축소시키고, 유저와 아이템 각각을
이렇게 유저와 아이템을 직접적으로 비교하여 둘의 관계를 예측합니다.



