한양대학교 인공지능 동아리 HAI 추천팀 소속으로 카카오 아레나에서 진행한 Melon Playlist Continuation 대회를 위해 개발한 추천 시스템입니다.
최종 스코어 0.289624(곡nDCG: 0.269720, 태그nDCG: 0.402414)로 2021 4월 29일 기준 플레이그라운드 리더보드 기준으로 1위, 실제 대회 리더보드 기준으로는 21위에 위치하였습니다.
플레이리스트에 수록된 곡과 태그의 절반 또는 전부가 숨겨져 있을 때, 주어지지 않은 곡들과 태그를 예측하는 것을 목표로 하는 대회입니다. 만약 플레이리스트에 들어있는 곡들의 절반을 보여주고, 나머지 숨겨진 절반을 예측할 수 있는 모델을 만든다면, 플레이리스트에 들어있는 곡이 전부 주어졌을 때 이 모델이 해당 플레이리스트와 어울리는 곡들을 추천해 줄 것이라고 기대할 수 있을 것입니다.
대회에서 제공하는 데이터는 아래와 같습니다.
- 플레이리스트 메타데이터
- 플레이리스트 제목
- 플레이리스트에 수록된 곡
- 플레이리스트에 달려있는 태그 목록
- 플레이리스트 좋아요 수
- 플레이리스트가 최종 수정된 시각
- 곡 메타데이터
- 곡 제목
- 앨범 제목
- 아티스트명
- 장르
- 발매일
- 곡에 대한 Mel-spectrogram
이 모델은 Efficient K-NN for Playlist Continuation (RecSys'18 Challenge) 논문을 기반으로 개발하였습니다. 다만 제공되는 데이터가 다르다는 점, 채점 기준이 다르다는 점을 참고하여 모델을 대회 목표에 알맞게 수정하였습니다.
이모델은 K개의 유사한 플레이리스트를 구하고 그 플레이리스트에 수록된 곡에 점수를 부여하여, 가장 점수가 높은 100개의 곡을 추천하는 모델입니다.
플레이리스트간의 유사도는 코사인 유사도를 이용하여 구하였습니다. 코사인 유사도는 내적공간의 두 벡터간 각도의 코사인값을 이용하여 측정된 벡터간의 유사한 정도를 의미하며, -1에서 1의 값을 가집니다. 1에 가까울 수록 유사하다고 판단할 수 있습니다.
따라서, 두 플레이리스트간의 유사도는 다음과 같이 구할 수 있습니다.
이대로 가장 점수가 높은 플레이리스트들을 구할 수 있겠지만, 정확도를 높이기 위해 다음과 같은 작업을 하였습니다.
일반적으로 유명한 곡들은 여러 플레이리스트에 자주 등장합니다. 이러한 곡들은 두 플레이리스트간의 유사도를 예측하는데에 그리 큰 도움이 되지 않습니다. 반대로 등장 빈도수가 낮은 곡이 두 플레이리스트에 모두 등장한다면, 이는 이 두 플레이리스트가 유사하다고 예측하는데에 많은 도움을 줍니다. 그래서 곡에다가 빈도수를 이용하여 weight을 주고, 이를 두 플레이리스트간의 유사도를 구할때 곱해줍니다.
플레이리스트간의 유사도를 구한 후, 유사도 점수를 증폭시키는 작업을 하였습니다. 이는 더 유사한 플레이리스트들의 중요도를 더 강조하고 더 정확한 곡들을 추천하기 위한 작업이었습니다.
이 두가지 작업을 한 후, 정확도가 눈에 띄게 상승하는 것을 확인 할 수 있었습니다.
이제, 플레이리스트간의 유사도를 사용하여 곡들과 태그를 추천하였습니다. 우선 최종적으로 유사도가 가장 높은 1500개의 플레이리스트를 구하고, 각 플레이리스트에 등장하는 곡들에게 점수(그 곡의 속한 플레이리스트의 유사도 점수)를 부여하였습니다.
그후, 최종적으로 점수가 가장 높은 100개의 곡을 추천하였습니다.
res 폴더 안에 데이터들을 넣어 놓고 진행합니다.
컴퓨터 성능에 따라 소요 시간이 다릅니다만 저는 약 2시간 정도 걸렸습니다.
진행이 완료되면 res 폴더에 answer.json 파일이 생성됩니다.
$> pip install -r requirements.txt
$> python knn-recommendation.py