haje01 노트

이탈 예측을 어떻게 할 것인가?

목차

개선할 것
피처 합성 및 HPO 활용
용어와 개념
피처
데이터 준비
학습 데이터
기본 용어와 개념
수집 윈도우 관련
슈도 코드
학습 데이터 수집 예
초모수의 선택
척도의 선택
예측과 검증
예측
용어와 개념
슈도 코드
검증
슈도 코드
검증 결과의 활용
기타
미숙 유저의 분류
용어와 개념
끝으로
[ ml  idea  draft  ]

이탈 예측을 어떻게 할 것인가?

예전에 게임 유저 이탈 예측을 시도해 보았는데, 성과가 썩 좋지는 않았다. 유저 이탈은 외부 요인 등으로 인해 성능에 한계가 있지만, 아래의 사항을 고려하여 다시 시도해보려 한다.

개선할 것

피처 합성 및 HPO 활용

저번에는 수작업된 피처들과, 적당한 휴리스틱으로 선택한 초모수로 훈련하였다. 최근에 Featuretools 등의 자동 피처 합성기와 Dask / Ray 클러스터를 이용한 초모수 최적화(Hyper-parameter Optimization) 테크닉을 활용해보려 한다. 얼마 안되는 피처에서 대충 설정한 초모수 보다는 좋은 결과가 나올 것으로 기대한다.

지금부터 필자가 고안한 변수와 초모수를 이용하여 이탈 예측 방법을 설명하겠다. 초모수는 서비스별 특성에 맞게 변경이 가능할 것이다.

용어와 개념

\[k = \lceil \frac {p} {d} \times U \rceil\] \[k^{mar} \in \mathbb Z, 1 \le k^{mar}\] \[f = \frac {d} {p} = \frac {U} {k}\] \[f^{max} = \frac {U} {k^{mar}}\] \[e_p \in \mathbb Z, 0 \lt e_p\] \[E_d^{max} = \lceil f^{max} \times e_p \rceil\]

피처

예측 모델의 성패는 피처에 달려있다고 해도 과언이 아닐 것이다. 피처는 다양한 방식으로 발굴될 수 있는데, 이 글에서 다 다루기는 어렵다. 별도의 글 온라인 게임을 위한 피처 유니버스 만들기 를 참고하도록 하자.

데이터 준비

앞서 말한 개념과 피처를 이용해 학습 및 예측을 위한 데이터를 준비하게 된다. 중요한 것은 모든 유저가 대상은 아니라는 점 이다. 게임 가입 후 적응하지 못하여 초기에 이탈했거나, 비정기적으로 플레이하는 유저, 그리고 어뷰징 툴을 사용하는 등의 유저는 기대 이익을 최대화하는 이탈 검출 을 위해 대상으로 하지 않는 것이 바람직할 것이다.

학습 데이터

학습 데이터 (learn_data, L) 는 유저별 피처 (features, X)라벨 (label, y) 로 구성된다.

기본 용어와 개념

\[L_d \in \mathbb Z, L_d^{mar} \le L_d\]

실재 학습 데이터는 이후 설명할 수집 윈도우를 진행하며 여러번에 걸쳐 수집되며, 윈도우는 유효 데이터와 이탈 확인 데이터의 두 부분으로 나누어 진다. 먼저 관련 용어를 살펴보자.

\[c_r \in \mathbb R, 0 \lt c_r\] \[c_d = \lceil f \times c_r \rceil\] \[c_d^{max} = \lceil f^{max} \times c_r \rceil\] \[L_d^{mar} = E_d^{max} + c_d^{max}\]

한계 학습 데이터 일수는 어디까지나 최소한의 값이다. 이에 따라 데이터를 확보해도 그 기간동안 유저 행동에 변동이 있으면 데이터가 부족해질 수 있기에, 실제 학습 데이터 일수는 한계 학습 데이터 일수 보다 여유있게 잡자.

\[L_e < P_b\] \[L_b = L_e - L_d\]

수집 윈도우 관련

\[w_w = E_d + c_d\] \[w_e = w_b + w_w\]

여기까지의 설명을 그림으로 나타내면 아래와 같다:

수집 윈도우

\[w_r \in \mathbb R, 0 \lt w_r \leq 1\] \[w_s = \lceil E_d \times w_r \rceil\]

슈도 코드

학습 데이터를 모으는 과정의 슈도 코드는 아래와 같다:

학습 데이터 시작일 (L_b) 과 종료일 (L_e) 에서 학습 데이터 (L) 초기화
최대 유효 데이터 일수 (E_d^max) 를 구함
학습 데이터 내 모든 유저에 대해
  첫 접속일을 수집 윈도우 시작일 (w_b) 로

  수집 윈도우에 대해
    데이터가 최대 유효 데이터 일수 (E_d^max) 미만이면
      다음 유저로
    윈도우 시작일 (w_b) 부터 최대 유효 데이터 일수 (E_d^max) 이후의 날을 대상일 (t) 로 함
    대상일부터 거꾸로 거슬러 유효 접속 일수 (e_p) 를 만족하는 날을 찾아 유효 데이터 일수 (E_d) 결정
    유효 데이터가 부족하면
      다음 유저로
    유효 데이터에서 단위 기간 접속 일수 (k) 및 접속 주기 (f) 를 구함
    단위 기간 접속 일수 (k) 가 단위 기간 한계 접속 일수 (k^mar) 미만이면
      다음 유저로
    마지막 접속일 (l) 에서 결석 비율 (a_r) 을 구함 (피처로 사용)

    접속 주기 (f) 에서 이탈 확인 일수 (c_d) 를 구함
    이탈 확인 데이터가 부족하면
      다음 유저로
    이탈 확인 데이터 (C) 에서 구한 단위 기간 접속 일수 (k) 가 단위 기간 한계 접속 일수 (k^mar) 미만이면
      이탈로 라벨링

    유효 데이터에서 피처 정보 수집
    피처와 유저의 이탈 여부 (라벨) 를 학습 데이터로 추가

    이탈했으면
      다음 유저로
    활성이면
      수집 윈도우 비율 (w_r) 로 윈도우 스텝 (w_s) 산정

    수집 윈도우의 스텝만큼 윈도우 진행

위의 과정을 구체적인 예를 통해 살펴보자.

학습 데이터 수집 예

지금까지 설명한 개념과 과정의 이해를 돕기 위해, 추가적인 예를 들어 설명하겠다. 아래는 단위 기간 접속 일수가 k = 5 에서 k = 4 으로 변하고 이탈한 유저의 예이다.

수집 과정

초모수의 선택

여기서는 초모수를 정하는 예를 살펴보겠다. 온라인 및 모바일 게임 서비스이고 단위 기간을 일주일로 할 때, 다음과 같이 초모수를 선택한다:

어떤 서비스에서 어떤 척도를 사용하는지에 따라 다양한 초모수가 이용될 수 있겠다.

척도의 선택

“실제 예측 모델이 목표로 해야할 것은 오차를 최소화하는 것이 아니라 모델 적용을 통해 기대되는 이익을 최대화 하는 것”

흔히 사용되는 Accuracy, Recall, F1-Score 등의 척도에서 이익을 최대화 하기 위한 방향으로 하는 것이 맞을 것이다.

예를 들어 제한된 프로모션 비용에서 이익을 최대화 하기 위해서 VIP 대상 이탈 예측을 선택하는 경우, 이들은 매출을 올려주는 진성 유저이기에 오탐을 두려워하지 말고 미탐이 적은 방향으로 학습 척도를 선택할 수 있다.

예측과 검증

예측

학습이 완료된 모델로 실제 예측을 실시한다. 이때 예측을 위한 데이터가 필요하다.

예측 데이터 (pred_data, P) : 학습된 모델로 유저의 이탈 예측을 하기 위한 데이터

용어와 개념

\[P_d = E_d^{max}\] \[P_b = P_e - P_d\]

슈도 코드

예측 데이터를 모으고 예측하는 과정의 슈도 코드는 아래와 같다:

예측 데이터 시작일과 종료일에서 예측 데이터 (P) 초기화
예측 데이터 내 모든 유저에 대해
  대상일에서 거꾸로 유효 접속일 (e_p) 에 맞는 유효 데이터 일수 (E_d) 를 찾음
  유효 데이터에서 구한 단위 기간 접속 일수 (k) 가 단위 기간 한계 접속 일수 (k^mar) 미만이면
    다음 유저로
  유효 데이터에서 피처 정보 추출
  학습된 모델에 넣어 예측

예측 후에는 결과를 저정해 사후 검증에 활용하도록 하자.

검증

실제 모델의 성능 평가를 위해 예측 후 검증이 꼭 필요하다. 검증은 예측 이후 데이터에 대해, 앞에서 설명한 학습 데이터 수집시와 같은 방식으로 이탈을 판정한다. 다만, 윈도우를 진행하지 않고 한 번만 판정한다.

예측한 모든 유저에 대해 검증하려면 충분한 시간이 흐른뒤 검증을 실시해야 한다. 검증의 결과로 예측 모델의 성능이 떨어졌으면, 예측 실패 사례를 포함한 최신 데이터로 다시 학습을 진행해야 한다.

슈도 코드

검증 과정의 슈도 코드는 아래와 같다:

대상 예측일에 대한 예측 결과 불러오기
예측 결과 내 모든 유저에 대해
  예측 시점의 접속 주기 (f) 를 얻고, 이를 이용해 이탈 확인 일수 (c_d) 를 계산
  이탈 확인 데이터내 단위 기간 접속 일수 (k) 가 단위 기간 한계 접속 일수 (k^mar) 미만이면
    이탈 판정
  예측과 실제 결과를 비교

검증 결과에서 모델의 성능 계산

검증 결과의 활용

검증의 결과 모델의 예측 성능이 일정 수준 이하로 떨어졌다면, 학습 데이터에 검증 데이터 기간이 포함되도록 하여 다시 모델을 업데이트하도록 하자.

기타

미숙 유저의 분류

미숙 (unripe) 유저는 가입 후 본격적으로 서비스를 이용하지 않은 유저로, 이탈 외 이런 유저의 식별도 도움이 될 수 있다.

용어와 개념

끝으로

여기에 제시된 방법이 절대적인 것은 아닐지라도 이탈 예측을 하기 위한 참고가 되기를 바란다.