ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RecSys Project] 고객 맞춤 상품 추천 시스템 만들기
    프로그래밍/Project 2025. 1. 11. 00:08

    Commerce Purchase Behavior Prediction (커머스 상품 구매 예측) 경진대회

    Github Link

    개요

     

    온라인 쇼핑이 생활화된 세상에서 수많은 상품들이 쏟아져 나오고, 소비자들은 그 수많은 상품들 중에서 원하는 상품이 각자 다르다.

    물론 소비자가 직접 수많은 상품들을 직접 찾아보고 비교하며 본인이 원하는 상품들을 골라서 구매할 수도 있지만, 소비자에게 맞는 상품을 추천해 주는 것만큼 편한 것은 없을 것이다.

    실제로 수많은 이커머스에서는 추천시스템을 구축해서 소비자들에게 맞는 상품들을 추천해주고 있다.

    이번 프로젝트에서는 이 추천시스템을 직접 구축해보고자 한다.

     

    데이터 구성

    학습 데이터는 아래 항목들로 구성되어있다.

     

    유저 ID(user_id)

    아이템 ID(item_id)

    사용자의 세션 ID(user_session) : 사용자가 오랜 시간이 지난 후 온라인 스토어로 돌아올 때마다 변경됨.

    해당 이벤트가 일어난 시각(event_time)

    아이템의 카테고리(category_code)

    아이템의 브랜드(brand)

    아이템의 가격(price)

    이벤트의 종류(event_type) : view(조회), cart(담기), purchase(구매) 3가지 항목으로 구성됨.

     

    모델

     

    모델은 기존에 베이스라인 코드로 제공된 ALS와 SASRec 두 가지를 테스트해본 결과, 두 모델 사이의 성능 차이가 NDCG@10 기준 0.02 정도로 크지 않았고, 추가되는 데이터가 없다는 점을 고려해서 딥러닝 기반 모델이라서 학습에 시간이 더 오래 걸리는 SASRec 대신 ALS를 선택했다.

     

    특성 공학 (Feature Engineering)

     

    모델 간의 성능 차이가 크지 않았기 때문에 특성 공학으로 기존에 있던 특성들끼리 조합해서 새로운 특성을 만드는 방식으로 성능을 끌어올려보고자 했다.

     

    우선 event_time에 있는 날짜와 시간을 분리해서 날짜는 요일로 변환하고, 시간은 시간대별로 분리했다.

    요일이나 시간대별로 구매하는 품목들이 어느 정도 정해져 있는 것 같았고 시간대를 오전 오후 로만 분리했을 때보다, 아침 오전 점심 오후 저녁 같이 세세하게 분리했을 때 모델의 성능도 더 좋아지는 것을 확인했다.

     

    사용자가 많이 구매한 카테고리의 상품이라면 다시 구매할 가능성이 크다고 생각해서 사용자별로 구매한 상품의 카테고리를 확인해서 카테고리 선호도를 계산해 새로운 변수를 만들었다.

     

    사람마다 경제적 상황이 다르고, 그에 따라서 같은 카테고리의 상품이더라도 구매하는 상품의 가격대가 다른 것 같아 사용자별로 선호하는 가격대를 계산한 변수를 만들었다.

     

    최근에 확인했던 상품의 경우 구매를 고려하고 있을 가능성이 크기 때문에 그런 상품들에 대해서 가중치를 부여했다.

     

    학습 데이터에는 여러 사용자들의 데이터가 있고, 같은 사용자라고 하더라도 모든 데이터가 같은 날에 생성된 것이 아닐 수 있고, 그럴 경우 그때그때 원하는 상품이 다를 수 있기 때문에 세션 ID를 기준으로 각 세션별로 구매여부, 발생 이벤트 수, 상품을 구매한 경우 상품의 가격 등을 반영한 세션을 평가하는 변수도 만들어 보았다.

    이 부분은 이전에 다른 변수들 만으로는 성능이 어느 선 이상으로 올라오지 않는 것을 해결해 보고자 좀 더 여러 개를 조합해서 만들어본 것인데 이 변수의 영향으로 모델의 성능이 단순히 좋아졌다기보단 안정성이 올라간 것 같았다.

    물론 안정성을 평가한 기준은 대회가 끝난 후 점수를 보고 판단한 것인데, 세션 ID를 활용한 변수가 없는 모델은 최종 점수가 오히려 떨어졌는데 해당 변수가 있는 모델은 최종 점수가 올라가서 좀 더 안정적인 것이라고 판단했다.

     

    결과

     

    세션 ID 활용 변수 미 적용 모델 (최종 제출)
    세션 ID 활용 변수 적용 모델

     

    중간 점수 기준으로 첫 번째 이미지의 모델의 점수가 더 높아서 제출했는데 최종 점수가 나온 걸 보니 오히려 더 낮게 나와서 왜 그럴까 고민을 해봤는데 아무리 생각해도 세션 ID를 활용하는 게 맞았던 것 같다.

     

    베이스라인 코드에서 0.02 정도 상승했는데 사실 이런저런 시도를 해보면서 오히려 점수가 많이 떨어지는 경험을 해서 베이스라인 코드보다 성능을 끌어올리는 데 성공해서 다행인 것 같다.

     

    느낀 점

     

    이번 프로젝트는 많은 팀원들이 개인 사정으로 참여하지 않아서 사실상 개인 프로젝트로 진행했다.

    그러다 보니 실험해보지 못한 것들이 많았고, 그래서 성능 개선도 좀 더 할 수 있었는데 그러지 못한 게 아닐까라는 생각이 들어 많이 아쉬웠다.

    당장 세션 ID를 활용하는 것도 거의 막바지에 시도해 본 것이라서 시간이 좀 더 있었으면 결과물을 직접 확인해 보고 좀 더 효과적으로 적용할 수 있지 않았을까 하는 아쉬움이 있다.

     

    특성 공학을 활용하는 것이 제대로 된 방향이었다는 것을 확인한 점은 만족스러웠다.

    단일 특성만으로는 크게 의미있는 지표가 되지 못했던 것도 세션 ID 같은 다른 특성과 조합했을 때 모델 성능에 주는 영향이 크게 증가하는 모습이 인상적이었다.

     

    이런 추천 시스템들이 일상생활에서 많은 곳에서 사용되는데 실제로 현업에서 사용되는 것들과는 다를 수 있지만 대략적으로 어떤 구조로 만들어지는지 확인할 수 있는 소중한 경험이었다.

Designed by Tistory.