소비자들의 책 구매 결정에 대한 도움을 주기 위한 개인화된 상품 추천 대회, 책과 관련된 정보와 소비자의 정보, 그리고 소비자가 실제로 부여한 평점, 총 3가지의 데이터 셋을 활용하여 각 사용자가 주어진 책에 대해 얼마나 평점을 부여할지 예측한다.
- Objective : 사용자가 그동안 읽은 책에 부여한 평점 데이터를 사용해서 새로운 책을 추천했을 때 어느 정도의 평점을 부여할지 예측
- 평가 지표 : RMSE (Root Mean Squared Error)
강성택 | 김다빈 | 김윤경 | 김희수 | 노근서 | 박영균 |
---|---|---|---|---|---|
{level2-bookratingprediction-recsys-03}
|
├── 📁 EDA
| ├── davin_EDA.ipynb
| ├── gs_EDA.ipynb
| ├── hs_EDA.ipynb
| ├── tarosin_EDA.ipynb
| └── yoon_EDA.ipynb
|
├── 📁 config
| └── config_baseline.yaml
|
├── 📂 docs
| ├── Book Rating Prediction_RecSys_팀리포트(03조).pdf
| └── 발표 PPT.pdf
|
├── 📂 etc
| └── catboost.ipynb
|
├── 📂 src
| ├── 📂 data
| │ ├── __init__.py
| │ ├── basic_data.py
| │ ├── context_data.py
| │ ├── image_data.py
| │ └── text_data.py
| |
| ├── 📂 ensemble
| │ └── ensembles.py
| |
| ├── 📂 loss
| │ ├── __init__.py
| │ └── loss.py
| |
| ├── 📂 models
| │ ├── __init__.py
| │ ├── _helper.py
| │ ├── image_FM.py
| │ └── text_FM.py
| |
| ├── 📂 train
| │ ├── __init__.py
| │ └── trainer.py
| |
| ├── __init__.py
| ├── utils.py
| └── README.md
|
├── .gitignore
├── ensemble.py
├── main.py
├── optuna_study.py
├── requirements.txt
├── run_baseline.sh
└── README.md
-
Package install
pip install -r requirements.txt
-
Model training
# main.py 실행 python main.py -c config/config_baseline.yaml -m Image_DeepFM -w True -r Image_DeepFM_baseline python main.py -c config/config_baseline.yaml -m Text_DeepFM -w True -r Text_DeepFM_baseline python main.py -c config/config_baseline.yaml -m CatBoost -w True -r CatBoost # optuna_study.py 실행(트리 모델만 가능) python optuna_study.py -c config/config_baseline.yaml -m XGBoost -w True -r XGBoost # ensemble.py 실행 python ensemble.py --ensemble_model 'XGBoost','CatBoost' --ensemble_strategy weighted --ensemble_weight 6,4
Stratified K-Fold와 Optuna를 적용하여 CatBoost를 학습시켰습니다. → 1등!
CatBoost와 베이스라인 코드로 주어진 Image DeepFM, Text DeepFM을 각각 8 : 1 : 1의 비율로 하여 Weighted Ensemble을 적용하였습니다.
-
main branch는 배포이력을 관리하기 위해 사용,
book branch는 기능 개발을 위한 branch들을 병합(merge)하기 위해 사용
-
모든 기능이 추가되고 버그가 수정되어 배포 가능한 안정적인 상태라면 book branch에 병합(merge)
-
작업을 할 때에는 개인의 branch를 통해 작업
-
EDA
branch명 형식은 “EDA-name” 으로 작성 ex) EDA-TaroSin
파일명 형식은 “name_EDA” 으로 작성 ex) TaroSin_EDA
-
데이터 전처리팀 branch 관리 규칙
book └── data
-
모델팀 branch 관리 규칙
book └── model ├── model-modularization # model 개발 및 모듈화 작업 ├── model-stratifiedkfold # stratifiedkfold 로직 개발 ├── model-optuna # optuna 로직 개발 └── model-experiment # 모델 실험
-
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 - 윤경 / 최종 - 영균
나머지는 book branch 건드리지 말 것!
merge commit message는 아래와 같이 작성
ex) “merge: {내용} 병합“
-
Issues, Pull request는 Template에 맞추어 작성 (커스텀 Labels 사용)
Issues → 작업 → PR 순으로 진행
-
문자열을 처리할 때는 작은 따옴표를 사용하도록 합니다.
-
클래스명은
카멜케이스(CamelCase)
로 작성합니다.
함수명, 변수명은스네이크케이스(snake_case)
로 작성합니다. -
객체의 이름은 해당 객체의 기능을 잘 설명하는 것으로 정합니다.
# bad a = ~~~ # good lgbm_pred_y = ~~~
-
가독성을 위해 한 줄에 하나의 문장만 작성합니다.
-
들여쓰기는 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