[추천모델] 이커머스 추천모델링(딥러닝모델) 프로젝트 회고
올 상반기에 진행했던 2가지 추천모델링 프로젝트 중 두번째로 진행했던 [ 이커머스 추천모델링(딥러닝) 프로젝트 ] 회고글입니다.
1. 프로젝트 배경:
- 지난 첫번째 추천모델 프로젝트에서 활용한 CF(Collaborative Filtering)방식의 추천알고리즘 중 높은 성능을 보인다고 알려진 Netflix Prize 에서 우승한 SVD모델의 경우 데이터의 Sparsity 가 적은 즉, 평점 데이터를 비롯한 다른 특성들에 대한 데이터가 매우 빈틈없이 잘 축적되어 있는 경우에 성과가 좋은 것으로 알고 있습니다.
- 그러나 영화 서비스처럼 특성들을 전처리하기 비교적 쉬운 서비스가 아닌, 이커머스의 경우 다양한 카테고리의 상품과 다양한 고객들이 실시간으로 방대한 데이터를 양산하기 때문에 데이터 특성 자체가 매우 많고 결측치도 많으며 카테고리별/아이템별로 중요한 특성을 선별하기에 쉽지 않은 것으로 알고 있습니다. 따라서, 영화 서비스에서 높은 성능을 보인 CF알고리즘/SVD모델과 달리 이커머스에서 더 효과적인 성능을 보일 수 있는 다른 방식의 대안 모델이 더 효과적이지 않을까 하는 인식에서 출발했습니다.
- 이커머스처럼 방대한 크기(scale)의 데이터가 생기며, 계속해서 판매자와 고객의 새로운 데이터가 발생하고(freshness가 높고), 데이터의 결측치도 많은(noise가 높은) 특성을 가지는 유튜브에서 추천 알고리즘의 성능을 높이기 위해 사용한 ‘딥러닝 추천모델’ 방식의 필요성을 떠올리게 되었습니다. 예를 들어, 유튜브의 경우 특정 카테고리 영상(Ex.요리)을 본 다음, 요리영상만 시청하는 것이 아니라, 의식의 흐름대로 엔터테인먼트 영상을 보기도 하며 이러한 패턴은 개인별로 무수히 다양해질 수 있습니다. 커머스 플랫폼에서 쇼핑 할 때도 특정 상품(ex. 화장품) 을 샀다가 키보드를 클릭해서 구경하다가 장바구니에 넣기도 하고, 구매하기도 하는 등 카테고리와 행동방식을 정형화하기 어려운 다양한 패턴의 고객 데이터가 발생합니다.
- 따라서, 특성선택(Feature Engineering)이 결과에 영향을 크게 미칠 수 있는 기존의 머신러닝 추천모델 방식에서 더 나아가 유저 개인의 라이프스타일에 따라, 데이터 정제를 최소화하여 구매 히스토리데이터를 뉴럴네트워크(딥러닝)을 통해 깊이있게 학습하여 추천할 수 있다면 좀 더 개인화된 추천모델링이 가능할 것이라는 기획의도로 본 프로젝트를 시작하게 되었습니다.
- 프로젝트 기간: 2021.3.22–2021.4.12 / 팀(2인) 공동작업
2. 사용한 데이터셋
- Instacart 데이터셋
- 세부 특성 확인 : Instacart data dictionary
인스타카트 데이터셋의 경우 주문데이터셋/상품데이터셋/구역데이터셋(aisles/departments)/주문상품셋(prior/train)으로 데이터 테이블이 나뉘어져있습니다. 따라서, 적절한 데이터 조합이 필요했습니다. 특히, 저희 팀에서 중요하게 생각했던 특성은 크게 3가지 유형이었습니다.
- (1) 유저의 나이/연령/검색어/행동액션(클릭,장바구니여부)과 같은 유저의 다양한 특성
- (2) 상품의 카테고리를 비롯한 상품의 다양한 특성
- (3) 구매/장바구니/찜하기/클릭/검색어/평점과 같은 유저와 상품의 상호데이터(interaction data)
인스타카트 데이터에서 아쉬웠던 부분은 유저의 나이/연령/검색어/행동액션과 같은 저희 팀이 활용해보고 싶었던 다양한 특성이 없었다는 점, 상품의 경우 카테고리 이외 다른 추가적인 특성이 없었다는 점, 마지막으로 평점 데이터가 없었다는 점이었습니다. 최초에 의도했던 ‘다양한 데이터 특성을 활용한 딥러닝 추천모델링’에 다소 맞지 않는 데이터였다고 생각되어 아쉬웠고 기회가 된다면 다음 프로젝트에서는 더 다양한 특성 데이터를 활용해보고 싶습니다.
그럼에도 인스타카트 데이터를 선정한 이유는 인스타카트 외에 아마존 장난감 데이터와 이전 프로젝트에서 사용했던 패션커머스데이터도 검토하였지만 데이터의 크기와 상품 종류의 다양성 측면에서 본 프로젝트 의도와 좀 더 적합하다고 판단했기 때문입니다.
따라서, 유저와 상품의 상호관계를 잘 보여줄 수 있는 평점 데이터의 부재는 ‘재주문 여부’와 ‘주문수량 평균 이상/이하’ 특성으로 대체하였고, ‘재주문 여부’를 넣은 추천모델 1안과 ‘주문수량 평균 이상/이하’특성이 들어간 추천모델 2안의 추천순위 평가지표인 nDCG(Normalized Discounted Cumulative Gain)를 비교함으로써 어떤 특성이 더 추천에 유효한 특성인지 검정하는 것으로 프로젝트 가설을 잡았습니다.
3. 프로젝트 가설
- 인스타카트 유저의 ‘재주문여부(reodered)’를 상품에 대한 평점(rating)으로 활용하여 like, dislike를 구분한 feature를 순위(ranking)모델에 넣어 추출한 추천목록(1안)이 ‘주문회차(order_number)’를 평점(rating)개념으로 활용한 추천방식의 추천목록(2안)보다 추천목록의 평가지표인 nDCG 스코어가 높을 것이다.
4. 분석방법
1) 모델 구축, 평가지표 비교방법
- (1) candidate generation model에서 후보목록을 추출한다.
- (2) 위 (1)의 모델을 활용하여 순위모델(ranking model)을 구축, 추천순위목록을 추출한다.
- (2–1) 추천순위 모델에 평점특성(rating feature)을 아래 2가지 방법으로 나눠서 진행한다.
- 모델1: 해당 상품의 재주문(reordered) 여부 (1이면 like, 0이면 dislike)
- 모델2: 주문회차(order_number) (평균수치인 18번 이상이면 like, 18번 미만이면 dislike)
- (3) 모델 1, 2로 추출된 추천순위목록의 nDCG 점수를 비교한다.
2) 분석환경
- 프로그래밍 언어: Python
- 사용 라이브러리 및 패키지: Tensorflow, scikit-learn library
- 분석환경: 구글 colab
5. 모델 구조
1) 참고 논문의 모델구조
본 프로젝트에서 참고한 Deep Neural Networks for YouTube Recommendations 의 추천모델은 크게 ‘후보모델(Candidate model)’과 ‘순위모델(ranking model)’ 2가지 파트로 나뉩니다.
Figure 2 를 보면, 후보목록(Candidate Generator) 영역에서 딥러닝 모델을 활용해 후보 목록들을 1차로 추려낸 다음, 순위목록(Ranking) 영역에서 딥러닝 모델에 후보목록 결과를 특성으로 추가하고, 기타 영향을 줄 것으로 가설을 잡은 특성들을 추가하여 2차로 추천목록 순위를 추출합니다. 간단히 생각하면, 딥러닝 모델을 2번 돌린 셈인데 후보모델과 순위모델의 딥러닝 모델의 구조는 동일하거나 유사하게 진행하되, 후보목록의 Input features와 순위목록의 Input features를 분석가의 가설에 따라 조정한다는 점이 차이점이라고 할 수 있습니다.
Figure 3 은 후보모델의 상세 구조입니다. 후보모델의 Input Features는 시청 영상 히스토리(embedded video watches), 검색어(embedded search tokens), 유저의 지역(geographic embedding), 성별(gender), 최근 영상으로 조정한 영상의 나이(example age: 업로드 후 heavy user의 시청데이터에 따라 편향된 모델을 만들지 않기 위해, 즉 영상의 freshness를 모두 최신영상으로 조정한 특성으로 ‘영상의 나이’개념)입니다.
Figure 7 은 순위모델의 상세구조입니다. 순위모델의 Input Features는 유저별로 화면에 뜨는 노출되고 있는 영상(impression video ID), 후보모델에서 추출된 시청한 영상(watched video IDs), 유저의 언어(user language), 영상의 언어(video language), 마지막 시청 대비 지난 시간 (time since last watch), 이전에 노출되었지만 시청하지 않은 영상들의 특성(previous impressions)입니다.
후보모델과 순위모델의 딥러닝 구조는 동일하거나 유사(작업목적에 맞게 하이퍼파라미터를 조정해도 되므로)하게 하고, Input Features을 다르게 한 것을 알 수 있습니다.
따라서, 본 프로젝트에서는 주어진 기간 내 가설검정을 빠르게 한다는 목적으로 후보모델과 순위모델의 딥러닝 구조는 동일하게 사용하고(하이퍼파라미터 조정 등 추가적인 비교실험 없이) 가설로 잡은 Input Feature 를 다르게 조정하는 정도로 프로젝트 결과를 잡았습니다.
2) 본 프로젝트에서 사용한 모델구조
- 후보모델 Input Feature: 유저ID, 구매상품ID, 주문날짜, 주문시간(Hour), 직전 주문 대비 걸린 날짜
- 순위모델(1) Input Feature: 후보목록에서 추려진 상품명, 재주문여부로 나눈 Liked(재주문O)/Disliked(재주문X), 상품의 카테고리 특성(Aisle), 주문시간(Hour)
- 순위모델(2) Input Feature: 후보목록에서 추려진 상품명, 평균주문회차로 나눈 Liked(평균이상)/Disliked(평균미만), 상품의 카테고리 특성(Aisle), 주문시간(Hour)
- 후보/순위 모델 딥러닝 구조:
위 표는 본 프로젝트에서 사용한 순위모델(1)의 구조입니다. 후보모델과 순위모델(1,2) 모두 딥러닝의 은닉층(3개), 하이퍼파라미터(Learning_rate: 0.003, Dropout_pct: 0.1, Alpha:0.0), 활성화함수(Activation Function: 은닉층 ReLU / 출력층 Softmax)는 동일한 구조로 사용했고 앞서 설명했듯이 Input Feature를 다르게 하였습니다.
6. 순위목록 평가지표 nDCG
첫번째 추천모델 프로젝트에서는 추천모델의 평가지표로 RMSE, MAE, Recall@K, Precision@K를 사용하였고, 본 프로젝트에서는 nDCG(Normalized Discounted Cumulative Gain)을 사용했습니다.
nDCG의 개념은 쉽게 표현하면,
“추천순위목록이 얼만큼 유저가 실제 구매할/좋아할/시청할 가능성이 높은지”를 비교하는 지표입니다.
수식을 보면, 위 표와 같이 nDCG는 DCG를 iDCG로 나눈 개념이고 DCG(Discounted Cumulative Gain)는 10개의 추천목록 순위(Rank)들 중에서 테스트 데이터의 실제값이 T(True)면 DCG의 Gain에 포함하고, 실제값이 F(False)면 DCG의 Gain에 포함하지 않습니다. 반면, iDCG(Ideal Discounted Cumulative Gain)는 추천순위가 가장 이상적일 때의 점수로 모든 순위에 대해 테스트 유저의 타겟값이 T(True)일 경우를 가정하여 계산합니다.
즉, nDCG를 다시 한번 정의해보면,
“가장 이상적인 추천목록의 성능(iDCG) 대비 해당 모델의 추천순위 성능(DCG)는 얼만큼 성능이 좋은가?”
에 대한 지표로서,
“여러가지 추천모델 1,2,3…의 성능을 비교하기 위한 지표”
라고 할 수 있습니다.
위 의미를 본 프로젝트에 적용시켜보면, 추천순위 모델1, 2의 nDCG를 비교한다는 의미는 1,2안 중 어떤 추천모델이 더 유저가 True-liked 할 가능성이 높은가를 비교한다는 의미입니다.
7. 결과 요약 및 향후 보완하면 좋을 사항
1) 결과요약
(1) 모델1안(‘재주문여부’를 평점으로 활용한 방법)이 모델2안(‘주문회차’를 평점으로 활용한 방법)보다 nDCG 스코어에서 0.05 높으므로 랭킹의 전체 평균을 고려한다면, ‘재주문여부’를 평점으로 활용한 랭킹1안의 추천목록 상품들을 고객이 실제 좋아할 가능성(true_like할 가능성)이 더 높다고 볼 수 있습니다.
- ranking_1안 ndcg 평균: 0.41
- ranking_2안 ndcg 평균: 0.36
(2) 다만, 유저별로 nDCG스코어가 모델1안이 높은 경우가 있고, 모델2안이 높은 경우가 있으므로 유저 개인별 맞춤 제안이 필요해 보입니다.
- user3: 0.53 (ranking1_ndcg) > 0.34 (ranking2_ndcg)
- user1: 0.53 (ranking1_ndcg) < 0.61 (ranking2_ndcg)
2) 추가 인사이트 및 향후 보완하면 좋을 사항
(1) 실제 현업에 있다면, 마케팅 프로모션과 A/B테스트로 활용하며 지속적인 실험을 해나가면 좋을 것 같다고 생각했습니다.
- 본 추천목록으로 나온 상품목록 중 미구매 상품이라면, 프로모션 쿠폰을 제공하는 등 구매 촉진 활동 실행.
- 1, 2안에서 나온 추천목록 상품들로 다양한 마케팅적 A/B테스트로 활용하며 지속적인 실험으로 추천모델 개선.
(2) 추천목록의 다양성 지표를 보완하여 추천알고리즘 자체를 개선하는 방법도 필요하다고 생각했습니다.
- nDCG는 추천목록의 정확도 지표로 사용하며, 다양성 지표로서 “Entropy Diversity”가 있음.
- ※Entropy Diversity란, 엔트로피의 개념을 추천 결과에 적용한 것. 모든 사용자들에게 비슷한 종류의 상품을 추천할 경우 해당 상품 추천은 자주 발생하므로 정보량이 낮은 반면 개인에게 맞춤화 된 추천은 발생 횟수가 적으므로 정보량이 높아짐. 이들의 기대값을 구한 것이 바로 Entropy Diversity. 예를 들어, 5명의 유저에게 A부터 다섯개의 아이템 가운데 한개를 추천해주는 model A와 model B가 있다고 가정. model A는 모든 유저에게 상품 A를 추천하였다고 할 때, A가 추천될 확률은 1, 정보량은 0이 됨. 모든 유저에 대한 추천의 정보량이 0이므로 Entropy Diversity 역시 0이 됨. 반면, model B의 경우 모든 유저에게 각기 다른 상품을 추천하고 이때 각각의 상품이 추천되는 확률은 0.2, 정보량은 0.32, 엔트로피는 1.6이 됨.
- ※참고: 추천엔진의 성능지표 관련 블로그
마치며…
이번 2차례의 추천모델 프로젝트를 통해 추천모델 알고리즘과 활용성에 대해 깊이 있는 학습을 할 수 있었습니다. 물론 추천모델 알고리즘은 제가 언급한 개념 외에도 정말 다양한 개념들이 존재하고 계속해서 발전해가고 있습니다. 따라서, 계속해서 새로운 기술과 논문을 학습하고 활용해보는 프로젝트를 만들어갈 계획입니다.
긴 글 읽어주셔서 감사합니다, 행복하세요!❣️