codestates / ds-blog

blog sharing for data science bootcamp course
2 stars 4 forks source link

[김지연]solo project 04 #277

Open jiyeon-kim-ds opened 3 years ago

jiyeon-kim-ds commented 3 years ago

이 글은 카카오 아레나의 ‘ Melon Playlist Continuation - kakao arena ’의 데이터를 이용한 내용을 담고 있습니다.

많은 이들의 삶에서 음악은 빼놓을 수 없는 부분이다. 어떤 사람은 음악은 언제나 출퇴근길에 함께하는 위로해주는 존재일수도 있고 어떤 사람에게 음악은 그가 운영하는 가게의 분위기를 책임지는 도구일 수도 있다.

이렇듯 많은 사람들의 인생엔 음악이 함께 하고 있다. 스마트폰의 보급과 음악 스트리밍 서비스의 활성화 같은 요인으로 우리가 음악을 소비하는 방식은 많이 변화했다. LP나 카세트 테이프, CD로 음악을 주로 들을 땐 앨범의 전곡을 소비하는 방식이었다. 하지만 음악 스트리밍 서비스로는 앨범을 모두 듣기 보단 좋아하는 곡들 위주로 소비하는 방식으로 바뀌었다.

하지만 매일매일 새로운 노래들이 쏟아져 나오고 이용자들은 그 노래들을 모두 듣고 좋아할 만한 곡을 찾을 시간이 없다. 그렇기 때문에 음악 스트리밍 서비스들은 이용자가 좋아할 만한 곡을 추천을 한다.음악 스트리밍 서비스가 얼마나 나은 추천을 하느냐는 이용자들이 서비스를 결정하는 요인이기도 하다.

음악 추천은 컨텐츠 기반 필터링, 협업 필터링 등을 이용해 이루어진다. 협업 필터링은 주로 다른 사람들이 들었던 곡을 바탕으로 이루어진다. 예를 들면 이용자 A가 노래 x를 좋아요 눌렀으니 이용자 A와 비슷한 이용자 B에게 노래 x를 추천하는 식이다.

문제제기

하지만 협업 필터링은 먼저 한 이용자가 노래를 재생목록에 추가하는 등 소비가 이뤄져야(사용 데이터가 만들어져야) 한 음악이 다른 사람들에게 추천 될 수 있다. 그래서 사용데이터가 없는 새로운 노래나 인기가 없는 노래의 경우 이용자에게 덜 추천될 것이다. 이러한 문제를 해소하기 위해 노래의 특징을 이용해 추천을 하는 컨텐츠 기반 필터링 방식도 적용해야 한다.

가설

"CNN 모델로 Mel Spectrogram 기반의 장르 예측을 통해 비슷한 곡을 추천할 수 있을까?"

컨텐츠 기반 필터링으로 새로운 노래를 추천하면 사용 데이터가 없던 새로운 곡도 이용자에게 더 많이 노출될 것이다. 하지만 짧은 시간 내에 추천 모델을 만들고 많은 데이터를 학습시키는 것은 힘들 것이라고 판단하여 CNN 모델을 이용해 장르를 예측해보는 모델을 만들었다. 장르를 예측해 본 이유는 같은 장르의 곡이라면 어느 정도 유사성이 있을 것이라고 판단하여 모델이 장르를 잘 예측할 수 있는지를 보고 나중에는 비슷한 곡을 찾아내는데 쓰일 수 있을 것이라고 생각했기 때문이다.

이 글에서 사용한 데이터는 카카오 아레나에서 진행한 ‘ Melon Playlist Continuation - kakao arena ’에서 제공한 데이터이다. 이 데이터는 노래에 대한 정보를 담은 데이터와 장르 데이터, 사용자가 직접 만든 재생목록과 재생목록 태그 데이터 그리고 노래의 Mel Spectrogram 데이터로 이루어져 있다.

Screen Shot 2021-01-12 at 7 24 45 [노래 정보가 담긴 데이터]

Screen Shot 2021-01-12 at 7 24 59 [재생목록 정보가 담긴 데이터]

많은 소비가 이뤄지지 않은 노래의 경우 사용자의 재생목록에도 포함될 확률이 적기 때문에 그러한 곡들을 분석하고 장르 예측을 하기 위해 노래의 Mel Spectrogram과 장르를 포함한 노래의 정보가 담겨있는 데이터를 이용했다.

카카오 아레나 대회에서 제공한 깔끔한 데이터이기 때문에 데이터는 전처리 할 것이 거의 없었다. 장르 예측을 위해서 장르를 타겟으로 이용하였는데 원본 데이터의 경우 30개의 장르로 분류되어 있다. 하지만 메모리 제한으로 인해 보다 적은 데이터를 이용하기 위해 5개의 장르만을 이용했다.

또한, Mel Spectrogram의 파일명이 노래의 id이기 때문에 Mel Spectrogram과 장르 라벨로 Numpy array를 만들고 모델에 입력값으로 넣기 위해 Mel Spectrogram을 numpy array로 불러왔을 때 array의 모습(48, 1876, 8) 이 다른 곡들을 제외했다.

모델

노래의 장르 예측을 위해 CNN (Convolutional Neural Network)모델을 사용하였는데 모델의 구조는 아래와 같다.

Screen Shot 2021-01-12 at 7 27 54

Convolutional layer를 사용하고 max pooling으로 다운 샘플링을 했다. 오버피팅을 막기 위해 Dropout을 사용했다. 한정적 자원으로 인해 epoch을 20으로 적게 학습했고 학습 결과는 아래와 같다.

Screen Shot 2021-01-12 at 7 28 02

validation set으로 예측한 결과 loss: 1.4803, accuracy: 0.3797 으로 학습한 것과 비슷한 결과가 나왔다. 데이터 셋에서 01번 장르(발라드)의 비율이 0.391206이기 때문에 하나로만 찍어도 0.39는 나와야 하는데 그보다 낮은 수치가 나왔기 때문에 높은 성능의 모델이라고 하기는 어렵다.

느낀 점

데이터 불러오기부터 전처리 과정까지 애를 먹었고 모델의 성능은 기대한 만큼 나오지 않았다. 하지만 몰랐던 부분이나 막혔던 부분을 찾아가며 많은 걸 배울 수 있었고 음악 추천이나 MIR(music information retrieval)와 관련된 논문을 읽으며 흥미로운 분야가 정말 많다는 것을 느낀 좋은 프로젝트였다.