이탈위험 유저 예측모델
안녕하세요, Blux ML Research Engineer Simon입니다.
지금까지 Intensity Function을 정의하여 전반적인 모델의 틀을 잡았다면, 이제부터는 모델의 디테일한 부분을 설계하고, 모델이 데이터를 학습할 수 있도록 목적함수를 정의하여야 합니다. 또한 모델의 성능을 측정할 수 있는 실험을 설계해야 합니다. 이번 글에서는 어떤 식으로 모델을 학습시켰고 어떤 실험을 진행하였는지 공유드리려 합니다.
첫번째로 고려할 부분은 사용자(u)를 어떻게 표현할 것인지 설계하는 것입니다. 사용자를 표현하는데 있어 인구통계학적인 정보와 더불어 개인정보는 최대한 배제하기 때문에 가용할 수 있는 데이터인 사용자 로그 데이터에서 여러 Feature를 추출하여 처리하였습니다. 기본적으로 포함한 정보들은 아래와 같습니다.
Item : 어떤 상품들을 상호작용하였는지
Event Type : 상품들을 어떻게 상호작용하였는지 (Click, Purchase,…)
Adjacent Timedelta : 재방문시 바로 이전 상호작용과 얼마나 시간차가 나는지
Visit Number : 얼마나 재방문을 하였는지
Lifetime Value : 단위 기간 동안 얼마나 소비하였는지
Item과 Event Type과 같이 Categorical Feature는 Vector로 Embedding하여 처리하였고, Timedelta, Visit Number, Lifetime Value와 같은 Numeric Feature의 경우 [1]를 참고하여 처리하였습니다. 사용자 Feature는 고객사의 도메인 혹은 데이터 특성에 따라 달라질 수 있습니다.
특히 어떤 상품을 어떻게 상호작용했는지의 정보를 포착하는 것은 Blux에서 고도화하고 있는 추천 모델을 통해 진행할 수 있었습니다.
이제 목적함수만 정의하면 모델을 훈련시킬 수 있습니다. 훈련 과정에서 인공지능 모델이 학습해야하는 파라미터는 다음과 같습니다.
추천 모델의 Parameter
Intensity Function의 Parameter
일반적으로 추천 모델을 MLE 방식으로 훈련을 시킨다면 SGD 방식을 이용해 Negative Log Likelihood인
-log(P(I=i|u))를 Minimize합니다. 한편 상품 추천과 더불어 사용자의 재방문 시간을 예측해야하는 이번 모델의 경우 사용자가 다음으로 상호작용한 상품뿐만 아니라 마지막 상호작용과 다음 상호작용의 시간차에 대한 확률도 함께 추론할 수 있어야 합니다. 즉, 추천과 시간차에 대한 결합확률분포를 학습해야 합니다. 이를 수식으로 표현하면 다음과 같습니다.
강한 가정이지만 일반적인 가정[2]에 따라 사용자의 Context 정보(u)가 주어졌을 때, 다음으로 상호작용할 상품과 시간은 조건부 독립이라 가정하였습니다. 따라서 다음과 같이 목적함수를 설정할 수 있습니다.
이렇게 훈련이 완료된 모델의 성능을 테스트해보기 위해 다음 Offline Evaluation을 진행해보았습니다.
Method : 과거 데이터를 기반으로 Survival Analysis 기반 모델과 RFM Score 기반 모델을 기반으로 특정 날짜에 구매를 진행한 사용자를 얼마나 잘 예측하였나?
Metric : AUC-ROC Curve
Evaluation의 결과는 AUC 값은 RFM Score기반 모델은 0.69, Survival Analysis 기반 모델은 0.75가 도출되어 RFM Score 기반 모델에 비해 Survival Analysis 기반 모델이 10% 더 좋은 성능을 보여주었습니다.
아래는 ROC Curve를 시각화한 것입니다.
이번 Evaluation에서 ROC Curve의 경우 확률값(혹은 RFM Score)을 기준으로 정렬 후 전체 X% 유저를 추출하여 Target User의 몇%를 커버했는지를 표현하도록 하였습니다. 즉, 전체 20%의 유저를 추출하여 RFM Score 모델의 경우에는 구매유저의 40%유저를, Survival Analysis 모델의 경우 60%를 커버한 것으로 해석할 수 있습니다.
추가적으로 임의로 N명을 추출하여 Intensity Function을 시각화해보았습니다. 그 결과 대다수의 사용자가 지수분포를 따르는 결과가 도출되었습니다. 이는 모델이 많은 사용자들이 동질적인(Homogeneous) 패턴을 보인다고 판단한 것으로 해석할 수 있습니다.
저는 해당 모델의 훈련 결과에 의구심이 들었습니다. 결론적으로 성능은 RFM 기반 모델보다 좋지만 과연 이 모델이 매우 다양하게 나타나는 사용자의 행동 패턴을 잘 표현했는지 확답을 내릴 수 없었기 때문입니다.
일차적으로 저는 훈련 데이터의 분포와 관련이 있을 것으로 생각하였습니다. 위에서 제시한 재접속에 대한 분포를 살펴보면 대부분의 값이 ShortTerm Effect 구간에 집중되어 있는 것을 알 수 있습니다. 즉, LifeTime Effect를 학습하기에 데이터가 부족할 수 있다고 생각하였습니다. 저는 사용자의 Intensity를 표현할 때, 과거 LifeTime Effect가 더 명시적으로 반영될 수 있다면 이 문제를 해결할 수 있을 것이라 생각하였습니다. 이에 Intensity Function을 정의하는 또 다른 방법인 Hawkes Process를 통해 Intensity Function을 정의해보기로 결정하였습니다.
Hawkes Process는 각 사건의 발생이 미래에 더 많은 사건이 발생할 확률을 증가시킨다는 아이디어에 기초합니다. 이는 사건이 연쇄적으로 다른 사건을 유발할 수 있음을 의미합니다. 기본적으로, 이 프로세스는 과거의 모든 사건들이 현재 시점에서 사건 발생률에 미치는 영향을 모델링합니다. 즉, 과거 LifeTime Effect의 영향을 더 명시적으로 Intensity Function에 반영할 수 있을 것이라 판단하였습니다. Hawkes Process에 기반한 Intensity Function의 경우 다음과 같이 정의됩니다.
mu(u : Base Intensity로 정의되며, 과거 사건의 영향을 받지 않는 사용자의 고유한 Intensity를 나타냅니다. Visit Number, Lifetime Value 등으로 표현하였습니다.
t_j : 현재시간($t$) 이전에 발생한 모든 사건에 대한 Time을 나타냅니다.
K : 과거 사건이 현재의 사건 발생률에 미치는 영향을 나타내는 Kernel입니다. 보통 시간에 따라 감소하는 함수를 사용하지만 이번 모델에는 지수분포와 정규분포의 혼합분포 형태로 관련 파라미터들이 학습될 수 있도록 설계하였습니다.
이에 따라 목적함수에서 시간에 대한 확률항이 다음과 같이 변경됩니다.
최종적으로 학습한 모델의 Offline Evaluation을 실시하였습니다. 그 결과는 AUC 값은 0.82로 다른 두 방식보다 좋은 성능을 보여주었습니다. 특히 RFM Score 기반 모델보다 20% 좋은 성능을 보여주었습니다.
이전 모델과 같은 사용자를 대상으로 ROC Curve를 시각화하였을 때, 모든 구간에 두 모델을 앞서는 성능을 보여주었습니다.
또한 Intensity Function 값 역시 사용자마다 다양하게 표현되어 동적인 사용자 행동을 잘 표현하고 있다고 판단하였습니다.
이번 글에서는 다양한 도메인에 합리적인 방식으로 이탈위험 유저를 추출할 수 있는 모델 개발기를 소개해드렸습니다. Blux는 이탈위험 예측 뿐만 아니라 CRM 마케터들이 고민하는 많은 부분들을 인공지능이 도움을 줄 수있도록 다양한 기능을 개발하고 있습니다. 또한 솔루션에 탑재할 수 있는 범용적인 인공지능 모델을 만드는 것은 모델 외에도 모델 성능 모니터링 및 파라미터 튜닝과 같이 고려해야할 점들이 많기에 다른 엔지니어분들도 함께 고생을 해주시고 계십니다.
이렇듯 Blux는 ML을 이용하여 Business 의사결정을 혁신하기 위해 도전적인 문제들을 고민하고, 해결하고 있습니다. 그리고 함께 문제를 해결해나가실 분들을 모시고 있습니다. 이번 글을 보면서 Blux의 ML 개발에 관심이 있으신 분들은 언제든지 연락해주시면 감사드리겠습니다!
[1] An Embedding Learning Framework for Numerical Features in CTR Prediction, Huifeng Guo, 2021 (KDD)
[2] A Variational Point Process Model for Social Event Sequences, Zhen Pan, 2020 (AAAI)