취업완성 - Recsys 경진대회 정리

Nary Kim·2024년 11월 6일
0

Upstage AI lab 3기

목록 보기
17/17
post-thumbnail

1. Competiton Info

Overview

'Commerce Behavior Purchase Prediction' 대회는 사용자의 쇼핑 패턴을 분석하여 향후 1주일 동안 구매할 상품을 추천하는 것을 목표로 한다. 추천 시스템은 개인의 쇼핑 습관과 과거 구매 이력을 분석해 맞춤형 상품을 제안함으로써, 사용자의 경험을 개선하고 기업의 매출을 증가시킨다. 이커머스 추천 시스템 구축 과정은 데이터 전처리부터 모델 선택, PyTorch와 라이브러리 활용, Feature Engineering 및 예측 수행을 포함한다. 대회에서는 평가 지표에 최적화된 파이프라인을 개발하는 것이 중요하다. 또한, 현업에서는 어려울 수 있는 복잡한 구조나 다중 모델 앙상블도 높은 점수를 위해 고려할 수 있다.

Timeline

  • 2024년 10월 02일 : 대회시작
  • 2024년 10월 08일 : 개별적으로 강의수강, EDA 진행
  • 2024년 10월 10일 ~ 10월 23일 : 여러 모델 선정 및 파인 튜닝
  • 2024년 10월 24일, 25일 : 결과 앙상블
  • 2024년 10월 25일 : 대회 종료

2. Data descrption

Dataset overview

  • 학습데이터 : train.parquet

    • 19년 11월 1일부터 20년 2월 29일까지 4개월간의 데이터
    • 8,350,311개의 행으로 이루어져 있다.
    • user_id : 유저 id
    • item_id : 아이템 id
    • user_session : 사용자의 세션 ID. 사용자가 오랜 일시 중지 후 온라인 스토어로 돌아올 때마다 변경된다.
    • event_time : 이벤트가 일어난 시각(UTC기준)
    • category_code : 아이템의 카테고리 분류입니다.
    • brand : 아이템의 brand
    • price : 아이템의 가격
    • event_type : 이벤트의 종류
  • 평가데이터

    • 20년 3월 1일부터 20년 3월 7일까지 일주일 간의 데이터.
    • 해당 기간 동안 유저가 구입한(event_type = 'purchase') 아이템 이력에 대한 데이터로 user_id와 item_id로 구성된다.
    • 평가데이터는 무작위 (50:50 random split)로 public, private dataset으로 나뉨.
    • public dataset
    • 대회 기간중 리더보드 점수 계산에 활용되는 정답 데이터.
  • private dataset

    • 대회 종료후 최종 점수 계산에 활용되는 정답 데이터.
    • 평가 데이터에는 학습데이터에 포함된 유저와 아이템으로만 이뤄져 있다.

Data Processing

  • 중복 데이터 18개 존재하여 제거.

3. Modeling

사용 모델

  • XGBoostRanker
  • CatboostRanker
  • ALS
  • GRU4Rec
  • SASRec

Boost 모델을 위한 Feature engineering

  • 핵심적인 생각
    • 한 유저가 한 아이템을 어떻게 생각하는지 수치화 해보자.
    • event_type을 아이템별로 묶을 수 있도록 각각 값에 가중치를 부여한 후 합하여, 이 값을 타겟으로 삼아 공략.
  • event_weight :
    • view, cart, purchase를 전체의 갯수 대비 비율의 역수로 하여 각각의 weight를 다르게 부여함.
    • 한 유저가 view만 많이 했다면, 가중치를 적게 받고 한번이라고 구매를 했다면 높은 가중치를 받게된다.
    • 구매를 하지 않고 view나 cart만 있는 사용자들은 event_weight가 높은 3개의 아이템만을 두고 나머지는 삭제.
    • 결과적으로 좋은 점 중 하나는 데이터의 수가 줄어든다는 것임. (약 800만개 -> 약 160만개)
  • date_weight :
    • event_type을 수치화하면서 시간과 아이템과의 관계를 정립할 필요가 생김.
    • event_time으로 정렬 후, 2월에 상호작용이 일어난 것에 대해 weight를 주는 열인 date_weight를 설정함.
    • date_weight를 설정할 때, view, cart는 5점을, purchase는 50달러 이상이면 2점, 50달러 미만이면 5점을 부여. - 재구매에 대한 가능성.
  • 위가 item에 관한 정보라면 아래는 user에 관한 정보.
  • monetary : 각각의 user_id가 구매한 총 금액.
  • frequency : 각각의 user_id가 상호작용한 횟수 (type과 item에 상관없이 셈.)
  • cluseter : monetary, frequency를 이용하여 k-mean clustering 하여 0,1,2 이렇게 3그룹으로 나누고, 이상치들은 묶어서 3을 부여함.
  • brand


특이사항?

  • XGBoostRanker와 CatboostRanker
    • event_weight값을 타겟으로 할 경우 한 아이디당 10개미만의 아이템들과 상호작용하는 경우가 많이 있어서, 이럴 경우 결과값이 아이디당 딱 10개로 떨어지지 않음.
    • 10개를 채우기 위해서는 앙상블이 불가피함. - 초반에는 베이스코드에서 제공해준 als를 이용, 대회가 진행되면서 리더보드의 점수가 좋은 output으로 대체.
    • 연산시간이 16시간정도로 오래걸려, 하이퍼파라미터 튜닝시에는 valid data를 2월 27, 28, 29일의 구매자 아이디로만 구성하여 빠르게 테스트.
  • recbole을 이용하여 GRU4Rec과 SASRec을 손쉽게 다룰수 있었음.
  • GRU4Rec
    • 세션 기반 추천 시스템에 자주 사용되는 모델임. GRU(게이트 순환 유닛)를 사용해 순차적인 사용자 행동을 학습하고, 세션 내의 사용자 아이템 상호작용을 기반으로 다음에 추천할 아이템을 예측함. 즉, 세션 안에서 시간 순서대로 발생하는 행동들을 고려해 다음에 사용자가 클릭할 아이템을 예측하는 방식임.
    • 그래서 위의 피쳐들을 사용하지 않고, user_id, item_id, event_time, event_session을 이용하여 연산함.
  • SASRec은 베이스코드와 다르게 Feature engineering에서 소개한 feature들을 사용하여 연산해봄.

결과 (실험한 시간순으로 정리)

  • als (base code) : 0.0846 (0.0853)

  • XGBRanker + als : 0.1211 (0.1210)

  • XGBRanker(params tune) + als : 0.1221 (0.1214)

  • CatRanker(params tune) + als : 0.1208 (0.1200)

  • als(params tune) : 0.1059 (0.1058)

  • CatRanker(params tune) + als(params tune) : 0.1219 (0.1205)

  • XGBRanker(params tune) + als(params tune) : 0.1232 (0.1219)

  • GRU4Rec + populer top10 : 0.0980 (0.0980)

  • GRU4Rec + als(params tune) : 0.0929 (0.0929)

  • SASRec + populer top10 : 0.0870 (0.0876)

  • LMF(params v1) :0.0944 (0.0925)

  • LMF(params v2) :0.1141 (0.1132)

  • LMF(params v3) : 0.1214 (0.1213)

  • CatRanker + LMF : 0.1313 (0.1304)

  • XGBRanker + LMF : 0.1325 (0.1318) BEST!

  • XGBRanker_als + CatRanker_als + LMF using ranking : 0.1324 (0.1317)

4. Result

Leader Board

  • 1등 : 0.1325 (0.1318)

시도한 점

  • 처음부터 우리조의 목표가 최대한 많은 모델을 돌려보자였기 때문에 많이 돌려보려고 노력하였고, 모두 각자의 모델을 잘 돌려서 좋은 결과가 나왔던것 같다.

아쉬운 점

  • Boost 계열이 시간이 오래걸려서 개인적으로는 CF, MF 모델들에 대한 여러 실험을 못해봤는 데, 해보고 싶다.
  • 마지막에 피드백을 받을 때, date_weight 피쳐에 대해, 합리적인 이유없이 나의 임의로 가중치값을 정했다는 것을 지적해주셨다. 내가 왜 그랬을까 하고 돌아보니, 임의로 넣은 가중치값을 이용하여 얻은 결과가 생각보다 너무 좋아서였다고 생각한다. 만약에 같이 대회에 참여한 다른조에서 좋은 결과들을 내놓았다면 아마 이것을 수정해보지 않았을까.
  • 다른 조들도 좀더 열심히 해줬다면, 많은 인사이트를 얻어갈 수 있었을 텐데 그 점이 많이 아쉽다.
profile
나는 무엇이 될것인가!!

0개의 댓글