본문 바로가기
Python_Wiki/머신러닝

(포폴 다시 공부하기) 인스타카트 예측: 새제품 추천, 재구매제품 예측, 구매주기 예측

by yj-data 2026. 2. 11.

첫번째, 새로운 제품 추천

  • 라이브러리: Surprise
  • 라이브러리에서 작동되는 알고리즘: SVD(Singular Value Decomposition)
    • 수학 알고리즘 개념으로 행렬을 분해하는 방법이며, 추천시스템에서 잠재요인 모델로 사용
  • 필요한 데이터: 유저 id, 구매한 이력이 있는 제품, 전체 제품 목록
    • 전체 제품 목록: 인스타카트 셋에서는 제품이 5만 개나 있어서 어차피 새로운 상품 추천을 해주는 경우에는 구매 수가 적은 제품을 추천해 주는 것은 의미가 없을 것 같아서 카테고리별로 구매 수 Top00 해서 제품을 걸러서, 이 목록을 전체 상품목록이라고 정하고 진행함. 5000개로 걸렀다고 치자.
    • 이 이후에, 유저별로 5000개 상품과 모두 전체 행렬을 만드는 건 아니고, 특정 유저가 구매한 제품에 한해서 행렬이 의미가 있음. 사지 않은 제품들이 '후보군'이 되고, SVD가 후보군 상품 별로 점수를 매겨서 점수가 높은 순서대로 추천.
    • SVD로는 유저-상품 상호작용을 학습함. 유저 유사도를 직접 체크하는게 아니라, 유사 패턴을 가진 유저들은 유사 벡터 모양을 가지게 됨.
  • 협업필터링은 '나와 비슷한 행동을 하는 사람들이 좋아하는 것을 추천한다'라는 개념을 가진 것이고, Surprise는 협업 필터링 중심의 추천 시스템 구현 라이브러리.
  • SVD에 시간 개념은 들어가있지 않은데, 혹시 여러번 산 제품에 가중치를 두거나 더 최근에 구매한 제품에 가중치를 두는 방식으로 추천 결과를 변경할 수 있다. SVD는 user_id | item_id | rating  과 같은 형태의 데이터만 받게 되어있기 때문이다.

 

두번째, 재구매 제품 예측

  • SVD와 다르게 잔뜩 피처 엔지니어링이 들어가는 이유는, SVD는 패턴을 압축하는 모델이지만 재구매예측은 '확률을 직접 예측하는 모델'이기 때문이다. 따라서 설명 변수가 필요함.
  • 예측이라면 기본적으로 로지스틱 회귀가 있고, 결정트리 그다음 복잡해지는 게 랜덤 포레스트인데, 여기서 로지스틱 회귀를 사용하지 않는 것은 재구매 예측에 들어가는 요소들이 굉장히 많아서 선형성이 담보되기 어렵기 때문에 일단 비선형성부터 시작을 합니다. 다음은 결정트리인데 결정트리에 비해 랜덤 포레스트는 앙상블이죠, 결정트리는 분산이 크다. 랜덤 포레스트는 그 트리를 여러 개 돌리기 때문에 결정 트리에서 담보되지 않는 그 안정성이 담보된다 그래서 랜덤포레스트를 사용하였습니다.
  • 유저의 상품 구매이력을 기반으로 재구매제품을 예측하는 것이기 때문에, 피처는 유저, 상품, 유저-상품 피처 이렇게 사용해야함.
  • 유저 피처로서는 '이 사람이 원래 재구매를 많이 하는 타입인가 / 어떤 소비자인가 ' ( 총 주문 횟수, 총 주문 간격, 전체 재구매율 등 확인) / 상품 피처는 '이 상품은 원래 자주 반복 구매되는 상품인가' / 유저-상품은 '이 사람과 이 상품의 관계는 얼마나 끈끈한가' 이렇게 세 개를 보는 것.
  • 유저, 상품, 유저와 상품 이렇게 다양한 피처들이 엔지니어링 되어서 각각 테이블로 만들어지는데 그 각각 공통된 아이디(예를 들어 이번 경우에는 프로덕트 아이디)를 공통키로 만들어서 그 테이블을 나중에 다 합침. 그리고 합칠때 주문의 최근성이(시간 변수) 들어가 있기 때문에 가장 마지막 주문을 테스트로 두고 나머지를 트레인으로 두고 트레인 테스트 스플릿을 진행함. 마지막 주문이 train 셋으로, 나머지 주문이 prior 셋으로 이미 분리되어있으니, 피처 생성은 prior로, train 내용 안에 맞춰야 할 훈련 답이 있음, 그리고 train 세트 내용으로 모델 학습 시킴
  • 그럼 그 피처들을 가지고 만든 테이블을 각각 공통 키가 있으니까 그 공통 키를 기준으로 그 테이블을 합치고 그 안에서 이제 가장 최신 오더를 트레인 테스트 중에 테스트로 하고 나머지를 트레인으로 하고, 그다음에 모델 학습을 돌리고 나면 결과가 나올 텐데 y에 정답이 이미 포함되어 있으니까 top n 추천은 랭크를 순서로 top 몇 개를 뽑는다는 식으로 해서 뽑으면 되는 거지.
 
 
세번째, 재구매주기 예측
  • 피처가 특별한 게 없음. 유저 id, 재 구매 순서(첫번째 두번째...), 그 특정 구매와 그 다음 구매와의 간격 이렇게 해서 세개임.
  • 특정 숫자 특정 포인트를 예측하는 것이기 때문에 선형 회귀로 했었음.
  • 전체 주문 중에 가장 지금 값을 구해야 하는 마지막 주문을 테스트라고 두고 그 직전 주문을 밸리데이션이라고 두고 그 이전 주문들을 다 트레인으로 두어서, 이제 트레인으로 모델 학습하고 밸리데이션으로 검증하고 그리고 테스트로 결과를 내는 그런 방식의 선형 회귀를 했었음.
  • 근데 지금 보니까 피처가 하나밖에 없으면 좀 더 단순한 방법, 그러니까 마지막 3회 주문의 평균을 내는 방식 등으로 하는 게 더 합리적이고 쉽다. 사람마다 구매 주기라는 것이 있기 때문에 시계열 예측을 하는 것이 더 정확할 수 있고, 선형 회귀는 선형성을 담보하기 때문에 선형성이 없는 경우에 예측이 어려울 수 있다(구매주기가 선형적으로 움직인다는 보장은 없으니까). 그리고 데이터가 많지 않은 경우는 더더욱 그렇다. 하지만 데이터가 없는 경우에 시계열까지 가는 것은 너무 과한 분석이기 때문에 데이터가 적고 단순한 분석의 경우 머신러닝까지 가지 않고 조금 더 비즈니스에 합리적인 (이동평균, 최근 주문 일자 평균 등등) 방법으로 결과값을 찾는 것이 좋아보인다.