https://github.com/boostcampaitech7/level2-recsys-movierecommendation-recsys-06-lv3
프로젝트 기간 : 2024/11/13 ~ 2024/11/28
프로젝트 평가 기준 : 10개의 영화 추천에 대한 Recall@K
데이터 : MovieLens 데이터를 가공한 대회 제공 데이터(아래 설명 O)
프로젝트 개요
upstage의 Movie Recommendation 대회 참가를 위한 프로젝트
사용자의 영화 시청 이력 데이터를 바탕으로 사용자가 다음에 시청할 영화 및 좋아할 영화 10개 예측
Boostcamp AI Tech 7th RecSys-06
.fillna
Team
이름 | 역할 |
---|---|
김건율 | 팀장, AutoEncoder 계열 모델링, 앙상블 |
백우성 | ADMMSLIM, LightGCN, S3Rec, BERT4Rec 모델링 및 앙상블 |
유대선 | Sequential 계열 모델링, 데이터 정제, Github 프로젝트 구조 설계 |
이제준 | Static 계열 모델링, EDA, 데이터 정제, 피처 엔지니어링 |
김성윤 | EDA & BPR, AutoInt, GRU4RecF 모델링 |
박승우 | EDA & GRU4Rec, Notion 협업 환경 구축, Github 프로젝트 구조 설계 |
팀원 6인 모두 개별적으로 EDA 진행 후 모여서 결과 공유 및 토론
MovieLens 데이터셋을 기반으로 하며, 총 7개의 주요 파일로 구성
파일명 | 행 수 | 주요 내용 |
---|---|---|
train_ratings.csv | 5,154,471 | 사용자 시청 이력 (user id, item id, timestamp) |
titles.tsv | 6,807 | 영화 제목 정보 (item id, title) |
years.tsv | 6,799 | 영화 개봉 연도 (item id, year) |
directors.tsv | 5,905 | 영화 감독 정보 (item id, directors) |
writers.tsv | 11,307 | 영화 작가 정보 (item id, writers) |
genres.tsv | 15,934 | 영화 장르 정보 (일부 아이템 다중 장르 포함) |
Ml_item2attributes.json | - | 아이템-속성 매핑 데이터 |
2.2.1 상호작용 이력 데이터 (train_ratings.csv)
2.2.2 메타데이터
2.3.1 구성 비율
2.3.2 주요 특징
2.4.1 기존 MovieLens와 차이
2.4.2 도전 과제
시간적 순서와 컨텐츠 기반 추천을 모두 고려해야 하는 복합적인 상황
데이터 자체가 Explicit feedback이 아닌 Implicit feedback으로,
아이템에 대한 유저의 단순 상호작용 여부 만을 파악해야하는 문제
2.5.1 시간에 따른 유저의 아이템 평가
유저별 상호작용한 아이템의 개수 그래프
335개 미만의 아이템을 평가한 유저
랜덤한 유저 10명의 일별 리뷰 개수 분포
2.5.2 월별 아이템 평가 패턴
2.6.1. Genre Co-occurrence Matrix
주요 출현 패턴 (Co-occurrence)
Drama
중심 결합: Romance(792), Comedy
(763), Thriller
(702)Comedy
-Romance
결합: 654회Documentary
: 타 장르와 낮은 결합 빈도2.6.2. Genre Correlation Matrix
핵심 상관관계 (Correlation)
Animation
-Children
(0.84)Crime
-Thriller
(0.51), Action
-Adventure
(0.49)Documentary
(대부분 음의 상관)요약
Drama
)Animation
-Children
, Crime
-Thriller
)Documentary
, Western
)2.6.3. Genre Network
중심부 클러스터
Drama
-Comedy
-Romance
삼각형이 네트워크의 핵심을 형성 2.6.4. Genre Popularity Trends
장기 트렌드 관점
Drama
의 지속적인 장르 지배력Comedy
의 점진적 인기도 감소Action
장르의 꾸준한 성장2.6.5. User Genre Preference Patterns
장르 클러스터링 (Dendrogram
)
Drama
, Romance
가 가장 가까운 거리에서 클러스터링Adventure
, Action
이 유사한 패턴을 보임Animation
, Children
이 하나의 그룹 형성Crime
, Thriller
가 유사한 패턴사용자 선호도 패턴 (Heatmap
)
Drama
에 대한 전반적으로 높은 선호도 (짙은 붉은색)Action
, Adventure
장르의 일관된 선호도Documentary
, Film-Noir
, Western
등은 매우 낮은 선호도Musical
, War
장르도 상대적으로 낮은 선호도Drama
선호 그룹Action
/Adventure
선호 그룹Comedy
/Romance
선호 그룹의 뚜렷한 구분2.6.6. Genre Preference Evolution for “User 11”
특정 사용자(example_user_id
즉, 본 실험에서는 0번째 행에 위치한 user 11
):
해당 시간대
에 시청한 전체 영화
중 각 장르가 차지하는 비율(%)
전반적인 트렌드:
Action
, Adventure
는 전 기간에 걸쳐 꾸준히 높은 선호도 유지Sci-Fi
는 Period 2-3
에서 특히 높은 선호도를 보이다가 변동Drama
는 시간이 갈수록 증가하는 경향Documentary
, Musical
, Western
등은 전체적으로 매우 낮은 선호도2.6.7 평가 패턴 및 장르 분포 분석
세션 길이 분포 (Session Length Distribution)와 평가 시간 간격 (Rating Time Intervals)- 상단
→ 이는 사용자들이 '벌크 평가
'(한 번에 여러 영화 평가)와 '산발적 평가
' 패턴을 모두 보이고 있음
벌크 평가의 장르 분포 (Genre Distribution in Bulk Ratings)
Drama
(17.5%), Comedy
(12%), Action
(10%) 순으로 높은 비중을 차지Documentary
, Western
, Film-Noir
는 가장 낮은 비중(각각 1% 미만)전체 장르 분포 (Overall Genre Distribution)
Drama
가 약 22%로 가장 높은 비중을 차지하며, Comedy
(15%), Thriller
(9%) 순Western
, Musical
, Film-Noir
등 특수 장르는 전체 평가에서도 낮은 비중을 유지가정 : 유저가 아이템과 상호작용하는 방식의 차이로 이런 경향이 생기는 것은 아닐까?
MovieLens의 메인화면
item 0
title 0
director 1304
writer 1159
dtype: int64
Team : Static Model / Sequential Model
팀별 역할군 : EDA, Feature Engineering(after Modeling), Modeling
BaseLine
과 과제 코드를 기반으로 실험 후 직접 코드를 짜서 모델 구현 시도Side Information
을 포함한 데이터 셋 정제 문제, 학습 후 추론 관련 차원 문제로 인해 소요되는 시간이 길어짐RecBole
라이브러리를 사용해 아래의 모델을 사용하는 방향으로 전환모델명 | valid score | public score | 특이사항 |
---|---|---|---|
RecVae | x | 0.1380 | hidden_dimension: 600 / latent_dimension: 200 |
RaCT | 0.1433 | 0.1265 | side information 반영 |
MultiVAE | 0.1443 | 0.1278 | learning_rate: 0.001, train_batch_size: 256,embedding_size: 64 |
GRU4Rec | 0.0776 | x | embedding & hidden_size: 64, num_layers: 1, dropout_prob: 0.1 |
BERT4Rec | 0.1299 | 0.0937 | RecBole 기본 세팅 |
LightGCN | 0.1383 | x | train-valid-test (1.0:0.0:0.0) |
DeepFM | x | 0.0310 | 상호작용된 아이템이 추천되어 보수 작업 진행 중 제외 |
FM | 0.1269 | 0.0075 | 상호작용된 아이템이 추천되어 보수 작업 진행 중 제외 |
SASRecF | 0.058 | x | Genres One-HotCoding & Neg-Sample dist(popularity) |
BPR | 0.1229 | 0.1068 | RecBole 기본 세팅 |
ADMMSLIM | x | 0.1577 | train-valid-test (1.0:0.0:0.0) |
EASE | x | 0.1594 | train-valid-test (1.0:0.0:0.0) |
GRU4RecF | 0.1666 | 0.1011 | embedding_size: 64, hidden_size: 128, interaction + genre, title |
AutoInt | 0.1246 | x | interaction + genre, title, director, writer |
SASRecF | 0.0952 | x | Genres One-HotCoding, negative-sampling-number : 5 |
S3Rec | x | 0.0876 | title, year, genre, director, writer |
EASE(E), RecVAE(R), BERT4Rec(B), LightGCN(L), ADMMSLIM(S), Autoint(A), BPR(P), GRU4Rec(G)
실험 했던 모델 중 앙상블은 위의 모델 사용. (괄호 안은 약자)
각 모델에서 유저 한 명 당 영화 Top 20을 뽑아서 Voting하는 방식으로 앙상블 진행
Hard Voting은 1위는 1점, 20위는 0.05점 식으로 순위 별 차등 포인트를 줘서 합산하는 방식
Soft Voting은 각 모델에서 랭킹을 뽑는 데 사용한 score를 표준화해서 합산하는 방식
앙상블 실험 결과(주요 실험 일부만 정리)
사용한 모델 | 방식 | public score | private score |
---|---|---|---|
ERBLSAP | Hard Voting | 0.1585 | 0.1567 |
ES | Soft Voting | 0.1584 | 0.1578 |
ESG | Soft Voting | 0.1647 | 0.1544 |
ESGB | Soft Voting | 0.1628 | 0.1509 |
ESG | Hard Voting | 0.1698 | 0.1654 |
ESGR | Hard Voting | 0.1710 | 0.1679 |
ESGRABPL | Hard Voting(A4BL은 포인트 50% 적용) | 0.1649 | 0.1623 |
ESGR | Hard Voting(1~10위는 1점, 11~20위는 0.5점) | 0.1675 | 0.1654 |
ESGR3 | Hard Voting | 0.1703 | 0.1671 |