MovieLens 데이터를 전처리하여 competition 용도로 재구성한 데이터를 활용한다. sequence를 바탕으로 마지막 item만을 예측하는 sequential recommendation 시나리오와 비교하여, 보다 복잡하며 실제와 비슷한 상황을 가정한다.
- Objective : 사용자의 영화 시청 이력 데이터를 바탕으로 사용자가 다음에 시청할 영화 및 좋아할 영화를 예측
- 평가 지표 : (normalized) Recall@K
강성택 | 김다빈 | 김윤경 | 김희수 | 노근서 | 박영균 |
---|---|---|---|---|---|
{level2-recsys-movierecommendation-recsys-03-lv3}
│
├── 📁 config
│ └── config_baseline.yaml
│
├── 📂 docs
│ └── Movie Recommendation_RecSys_팀리포트(03조).pdf
│
├── 📂 RecBole
│ ├── 📂 config
│ │ └──recbole_config.yaml
│ │
│ ├── recbole_inference.py
│ └── recbole_main.py
│
├── 📂 EDA
│ ├── davin_EDA.ipynb
│ ├── gs_EDA.ipynb
│ ├── hs_EDA.ipynb
│ ├── tarosin_EDA.ipynb
│ ├── yoon_EDA.ipynb
│ └── zv_EDA.ipynb
│
├── 📂 src
│ ├── 📂 model
│ │ ├── __init__.py
│ │ ├── DeepFM.py
│ │ ├── EASE.py
│ │ ├── EASER.py
│ │ └── MultiVAE.py
│ │
│ ├── loader.py
│ ├── preprocessing.py
│ ├── trainer.py
│ └── utils.py
│
├── .gitignore
├── ensemble.py
├── inference.py
├── main.py
├── requirements.txt
├── run_catboost.py
└── README.md
-
Package install
pip install -r requirements.txt
-
Model training
# main.py 실행 python main.py --m DeepFM --e 100 --r baseline --d cuda python main.py --m EASE --e 100 --r baseline --d cpu python main.py --m EASER --e 100 --r baseline --d cpu python main.py --m MultiVAE --e 100 --r baseline --d cuda # run_catboost.py 실행 (inference 포함) python run_catboost.py
-
Inference & Ensemble
# inference.py 실행 python inference.py --m DeepFM --r baseline --d cuda python inference.py --m EASE --r baseline --d cpu python inference.py --m EASER --r baseline --d cpu python inference.py --m MultiVAE --r baseline --d cuda # ensemble.py 실행 python ensemble.py --m EASER CatBoost MultiVAE --w 7 2 1 --o output/
-
main branch는 배포이력을 관리하기 위해 사용,
movie branch는 기능 개발을 위한 branch들을 병합(merge)하기 위해 사용
-
모든 기능이 추가되고 버그가 수정되어 배포 가능한 안정적인 상태라면 movie branch에 병합(merge)
-
작업을 할 때에는 개인의 branch를 통해 작업
-
EDA
branch명 형식은 “EDA-name” 으로 작성 ex) EDA-TaroSin
파일명 형식은 “name_EDA” 으로 작성 ex) TaroSin_EDA
-
데이터 전처리팀 branch 관리 규칙
movie └── data ├── data-loader # 데이터셋 로드, 데이터 로더 개발 └── data-preprocessing # 전처리 및 피쳐 엔지니어링 개발
-
모델팀 branch 관리 규칙
movie └── model ├── model-DeepFM # 모델 개발 branch ├── model-general # CF, 트리 모델 개발 branch ├── ... └── model-ensemble # 앙상블 개발 branch
-
master(main) branch에 Pull request를 하는 것이 아닌,
data branch 또는 model branch에 Pull request 요청
-
commit message는 아래와 같이 구분해서 작성 (한글)
ex) git commit -m “docs: {내용} 문서 작성”
ex) git commit -m “feat: {내용} 추가”
ex) git commit -m “fix: {내용} 수정”
ex) git commit -m “test: {내용} 테스트”
-
Pull request merge 담당자 : data - 근서 / model - 성택 / 최종 - 영균
나머지는 movie branch 건드리지 말 것!
merge commit message는 아래와 같이 작성
ex) “merge: {내용} 병합“
-
Issues, Pull request는 Template에 맞추어 작성 (커스텀 Labels 사용)
Issues → 작업 → PR 순으로 진행
PEP-8을 기반으로 일부 수정해서 사용
-
문자열을 처리할 때는 작은 따옴표를 사용하도록 합니다.
-
클래스명은
카멜케이스(CamelCase)
로 작성합니다.
함수명, 변수명은스네이크케이스(snake_case)
로 작성합니다. -
객체의 이름은 해당 객체의 기능을 잘 설명하는 것으로 정합니다.
# bad a = ~~~ # good lgbm_pred_y = ~~~
-
상수는 대문자와 밑줄(
_
)로 작성하여, 변수와 구분되도록합니다.MAX_CONNECTIONS = 100 DEFAULT_TIMEOUT = 60
-
가독성을 위해 한 줄에 하나의 문장만 작성합니다.
-
들여쓰기는 4 Space 대신 Tab을 사용합시다.
-
주석은 설명하려는 구문에 맞춰 들여쓰기, 코드 위에 작성합니다.
# good def some_function(): ... # statement에 관한 주석 statements
-
키워드 인수를 나타낼 때나 주석이 없는 함수 매개변수의 기본값을 나타낼 때 기호 주위에 공백을 사용하지 마세요.
# bad def complex(real, imag = 0.0): return magic(r = real, i = imag) # good def complex(real, imag=0.0): return magic(r=real, i=imag)
-
연산자 사이에는 공백을 추가하여 가독성을 높입니다.
a+b+c+d # bad a + b + c + d # good
-
(
_
), (:
), (;
) 등 구분자 다음에 값이 올 경우 공백을 추가하여 가독성을 높입니다.arr = [1,2,3,4] # bad arr = [1, 2, 3, 4] # good
-
한 줄의 코드가 너무 길어질 경우, 괄호를 사용하여 줄을 나누어 작성합니다.
# 괄호를 사용한 예 long_variable = ( var_one + var_two - var_three )
-
클래스와 최상위 함수 정의 사이에는 빈 줄 2개를 사용합니다. 클래스 내부의 메서드들 사이에는 빈 줄 1개를 사용하여 가독성을 높입니다.
# 최상위 함수와 클래스 사이에 빈 줄 2개 def example_function(): pass class MyClass: def first_method(self): pass def second_method(self): pass
-
딕셔너리 항목의 경우, 항목을 줄마다 하나씩 나열하고 마지막 항목 뒤에 쉼표를 추가합니다.
my_dict = { "name": "Alice", "age": 30, "city": "New York", }
-
예외를 처리할 때는 메시지를 통해 어떤 예외가 발생했는지 알 수 있도록 합니다.
try: result = 10 / 0 except ZeroDivisionError as e: print(f"Error occurred: {e}")
-
조건문에서 싱글톤 객체 (예:
None
,True
,False
) 를 비교할 때는==
대신is
를 사용합니다.if my_var is None: print("my_var is None")
-
프라이빗(private) 변수나 메서드는 이름 앞에 밑줄 하나를 붙여 표현
class MyClass: def __init__(self): self._private_variable = 42 def _private_method(self): pass
-
임포트는 항상 파일 상단에 위치시키고, 표준 라이브러리, 서드 파티 라이브러리, 로컬 모듈 순서로 정리합니다. 한 줄에 하나의 라이브러리만 임포트하며, 여러 모듈을 한 줄에 나열하지 않습니다.
import os import sys import numpy as np from my_local_module import my_function
-
사용하지 않는 변수를 남기지 않고 제거하여 코드의 깔끔함을 유지합니다.