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

  1. books.csv의 book_title컬럼이 해당 row의 language값과 동일한 언어로 구성되어있다는 것을 확인
    • e.g. Harry Potter -> English / 토지 -> Korean
  2. book_title의 값에서 20개의 언어 속성에 대한 feature를 추출
  3. PCA(95%)를 통해 20의 속성 중 주요 속성을 추출
  4. 추출된 주성분 feature를 활용해 Random Forest Classifier에 학습(약 99%의 정확도) 후 추론

Language Classifier

3. Category

Category의 경우에는 Language와 달리, 다른 Feature를 직접적으로 활용해서 결측치를 채울 수 없음

IDEA

'Category도 다른 feature들을 직,간접적으로 활용해서 결측치를 채울 수 있지 않을까?'

  1. Category 외의 다른 feature들을 numerical encoding(integer)
  2. Embedding Table을 형성해 벡터화
  3. 각 feature를 input으로, category 값을 output으로 하는 MLP Layer(3 Layers) 구성
  4. Train(약 55% acc) & Inference

Category Classifier

Conclusion

  • 위의 3개의 feature에 대한 결측치를 채운 데이터를 Baseline 모델의 수정없이 그대로 사용하였을 때, Significant한 성능의 향상을 보임