codestates / codestates/ds-blog

[송지] Project 4 - Music genre classification

Open
#278 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
No language data
Stars
2
Forks
4
PR merge metrics
No merged PRs in 30d

Description

코로나가 유행하기 전부터 음악 및 영상 스트리밍 서비스는 지속적으로 성장해왔다.
멜론, 벅스 같은 음악 어플은 예전부터 사용했고, 동영상을 편하게 보려고 유투브 프리미엄 기능도 사용하고, 넷플릭스 한국 상륙만을 기다렸던게 엊그제같은데 그 사이 수많은 영상 스트리밍 서비스가 생겼다.
그 중에서 음원 스트리밍 서비스의 '맞춤형 플레이리스트' 기능이 그닥 만족스럽지 않다고 느낀다.
현재는 유투브 뮤직과 벅스 뮤직을 사용하고 있는데, 둘다 지나치게 같은 아티스트의 음악 혹은 그 아티스트가 피처링한 음악만을 추천하고, 그 플레이리스트대로 듣다 보면 금새 질린다.
차라리 취향 맞는 유저들이 직접 올리는 플레이리스트를 찾아듣는게 훨씬 만족스러웠다.
스트리밍 서비스사의 맞춤형 알고리즘은 카페나 편집샵같은 공공장소에서 틀어놓기는 편하겠지만,
각 유저의 성향까지 세밀하게 파악하지 못한다고 느낀다.
이런 생각을 나만하는건 아닐 것 같다. 사용자의 취향을 귀신같이 분석하고, 그 유저가 좋아할 것 같은 새로운 음악을 추천하는 서비스를 만들려면, 먼저 음악 분류의 세밀함이 선행되어야 한다.
사실 공식적인 음원 발매 외에도 'Soundcloud'같은 곳에 엄청나게 다양한 장르의 음악이 있다. 딱 처음 들었을 바로 기존의 장르에 끼워맞추기 힘든 새로운 스타일의 음악도 많다.

이번 프로젝트에서는 음원 스트리밍 서비스 회사의 데이터 분석가로 일한다고 가정했다.
음악 장르를 구분하는 예측 모델을 만들어 새로운 음원 파일을 넣었을 때도 적절히 분류할 수 있도록 작업했다.
머신러닝과 딥러닝 모델을 사용하여 '정확도'로 성능을 비교했다.
본 데이터셋의 label이 될 'genre'는 총 15개의 클래스를 가진 다중 분류모델이다. 이 경우 딥러닝의 성능이 훨씬 좋을 것이라 생각한다.

개인적으로 벅스 뮤직의 데이터셋으로 작업하고 싶어서 예전부터 찾아봤으나 공식적인 음원 데이터셋은 제공하지 않는것으로 보인다.
대신 세계 최대의 음원 스트리밍 서비스사인 Spotify에서 audio features track 데이터셋을 제공하는데, Kaggle에서 genre가 들어간 데이터를 찾아 사용했다.
4만개 이상의 음원 정보가 들어간 데이터이며,
user_id, track_uri 같이 음원 특성 정보가 담겨있지 않은 컬럼을 제거하는 전처리 작업 후, 레이블은 genre, 나머지는 특성으로 사용하는 데이터 프레임을 만들었다.

데이터셋는 각 음원을 구분하는 여러가지 특성 정보가 담겨있다.
danceability : 춤추기에 적합한 음악인지 판단. 템포, 리듬 안정성, 비트 강도 등이 전체적으로 일정한지 조합하여 정해진다.
energy : 에너지가 클수록 빠르고 크고 시끄러운 음악
instrumentalness : 트랙에 보컬이 없는지 여부 예측. 랩도 보컬에 포함된다. 1.0에 가까울수록 트랙에 보컬 콘텐츠가 포함되지 않을 가능성이 큼.
valence : 밝고 긍정적인 느낌의 정도

레이블인 genre를 살펴보면, 클래스는 총 15개이고 각 클래스 당 1~13% 사이의 비율로 분포되어 있다.
과도하게 치우치진 않았지만 균형적이라 볼 수는 없어서 모델 평가 시
각각 비율이 다른 클래스의 비율을 유지하면서 훈련과 테스트 세트를 분류stratifiedkfold를 사용해 교차검증을 해 주었다.

특성들을 살펴보면, 각 특성마다 값의 범위가 다르고, outlier가 있는 특성이 많아서 이에 민감한 MinMaxScaler를 사용하여 피쳐 스케일링을 수행하여 모든 특성값을 0~1사이에 있도록 만들어 주었다.

머신러닝 모델로 RandomForest Classification 을 사용했다.
레이블의 클래스가 다양하고 불균형한 편이라 stratifiedkfold를 통해 데이터를 5개로 나누어 교차검증 해보니 0.60이 나왔다.
최종적으로 test 데이터의 정확도 스코어는 0.58이 나왔다.

신경망 모델을 만들어 역시 stratifiedkfold로 교차검증 해보니 train데이터의 정확도가 0.639 에 달한다. 머신러닝 모델의 train데이터 성능에 비해 약 4% 정도 올랐다. 따라서 이 교차검증한 모델을 test데이터에 학습시키면 성능이 더 오를 것 같다.
최종적으로 test 데이터의 정확도 스코어는 0.63이 나왔다. 머신러닝 모델에 비해 정확도가 4.6% 정도 증가한 것이다.

많은 데이터를 사용하는 다중 분류 모델에서는 머신러닝보다 딥러닝 모델이 훨씬 성능이 좋을 것이라는 가설이 틀리지 않았다.
그러나 예상보다 눈에 띄게 성능이 좋아지지도 않았고, 마무리 단계에서는 다스베이더 광선검으로 케이크를 자르는 이미지가 떠올랐다.
음악 데이터를 사용한 딥러닝 모델 레퍼런스를 찾다가 '소프트맥스를 이용한 딥러닝 음악장르 자동구분 투표 시스템'이라는 흥미로운 논문을 발견했다.
음악 주파수의 스팩트로그램(파동을 시각화 한 것) 데이터를 CNN 모델에 넣어 장르 구분기를 만드는 작업인데 사실 내가 하고싶었던 프로젝트는 이런게 아니었나 생각했다.
이미 정제되어 나온 숫자형 데이터가 아니라, 음성데이터를 활용한 프로젝트를 해보고 싶다.

이번 프로젝트를 베이스라인 삼아, 음성데이터를 활용한 딥러닝 모델을 계속 공부하고 싶다는 목표가 생겼다.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.