Competitions
Book Rating Prediction
BKM
2023. 2. 28. 21:58
네이버 부스트캠프에서 진행했던 첫번째 내부 대회인 'Book Rating Prediction'에 대해 정리해 보려고 합니다.
목차는 'EDA', 'Feature Engineering 및 Modeling' 순으로 구성됩니다.
[EDA]
Datasets
- train_ratings.csv
- 유저들이 평가한 책에 대한 평점
user_id, isbn, rating
- 대략 300k의 interaction존재 (-> 306795)
- 유저들이 평가한 책에 대한 평점
- users.csv
- 유저 정보
user_id, location, age
- 유저 정보
- books.csv
- 책(아이템) 정보
isbn(unique id), book title, author, year of publication, publisher, img_url, language, category, summary, img_path
- 책(아이템) 정보
Users
- Number of Rows : 68092
age
age
에 대한 결측치 존재 : 27833- 약 41%
- baseline에서는 age를 10의 배수로 binning후, 해당 결측치를 mean값으로 imputation
- outlier가 significant 하지 않기 때문에 mean값으로 imputation해도 큰 문제는 없어 보임
- 하지만, 해당 분포에 맞춰 random하게 age를 pick하도록 전처리
location
- 결측치 None
location
의 경우 국가별, 지역별 편차가 너무 크고 존재하지 않거나 같은 지역을 다르게 표기한 경우가 많아 Feature로서 사용하기 어려움
Books
- Number of Rows : 149570
- Null값이 있는 Feature들
- language(67,227 : 약 45%)
- category(68,857: 약 46%)
- summary(67,227 : 약 45%)
- img_path
Category
- 책의 카테고리 간의 편차가 다소 큰 것을 확인 가능
- 하지만, 카테고리별 rating의 평균과 편차의 차이는 적음
Language
- 총 26개의 unique 값이 존재
Cold Start User
- 8266명 : 전체 유저의 10.78%
Insight
- 개별 feature의 rating에 대한 영향력은 크지 않다고 판단
- 그렇다고 해서 무의미한 feature가 있다고 판단되지 않음
- 따라서, 몇가지의 feature만을 가지고 모델링을 하기 보다는 사용가능한 feature를 최대한 활용
- 이를 위해서, Imputation과정에 집중
[Preprocessing]
EDA에서 얻은 인사이트를 바탕으로 결측치 처리를 우선적으로 진행
현재, 결측치가 존재하는 컬럼
users.csv
- age(27,833 : 약 41%)
books.csv
- language(67,227 : 약 45%)
- category(68,857: 약 46%)
- summary(67,227 : 약 45%)
- img_path
summary, img_path의 경우에는 각각 책의 요약 내용과 책의 커버 이미지이기 때문에 결측치를 채우는 것이 불가능하고 판단되어 그대로 사용
1. Age
- age 컬럼의 경우, baseline에서는 10년 단위로 age를 Binning한 뒤, 그 Mean값으로 대체
- Age의 분포가 정규 분포와 비슷한 형태를 띄기 때문에위 방법도 가능하고 합리적임 (EDA 참고)
- 우리 팀에서는 Age의 확률분포에 맞게 Random Choice하는 방식으로 결측치를 채움
- 위 방식이 원본 데이터의 특징을 가장 잘 유지할 수 있는 방법이라고 생각
2. Language
- books.csv의 book_title컬럼이 해당 row의 language값과 동일한 언어로 구성되어있다는 것을 확인
- e.g. Harry Potter -> English / 토지 -> Korean
- book_title의 값에서 20개의 언어 속성에 대한 feature를 추출
- PCA(95%)를 통해 20의 속성 중 주요 속성을 추출
- 추출된 주성분 feature를 활용해 Random Forest Classifier에 학습(약 99%의 정확도) 후 추론
3. Category
Category의 경우에는 Language와 달리, 다른 Feature를 직접적으로 활용해서 결측치를 채울 수 없음
IDEA
'Category도 다른 feature들을 직,간접적으로 활용해서 결측치를 채울 수 있지 않을까?'
Category
외의 다른 feature들을 numerical encoding(integer)- Embedding Table을 형성해 벡터화
- 각 feature를 input으로, category 값을 output으로 하는 MLP Layer(3 Layers) 구성
- Train(약 55% acc) & Inference
Conclusion
- 위의 3개의 feature에 대한 결측치를 채운 데이터를 Baseline 모델의 수정없이 그대로 사용하였을 때, Significant한 성능의 향상을 보임