예측 대상과 목표 정의하기
그 동안 기계 학습이나 통계 모델을 이용한 업무를 하면서 느낀 점들을 정리해 보았습니다. 제가 얻은 교훈은 주로 성공보다는 실패를 통해서였습니다. 때문에 이 글에서 얘기하는 주장이 반드시 정답이라고 생각하지마는 않습니다. 다만 앞으로 비슷한 업무를 할 때 시행착오를 줄이는데 참고 자료는 될 수 있으리라 생각합니다.
가독성을 위해 단정적인 표현을 사용할 때도 있겠지만, 확신을 갖고 쓴 글은 아닙니다. 현재까지의 생각을 정리한 글입니다. 따라서 앞으로의 경험에 따라 생각이 바뀔 수 있습니다. 발전적인 변화를 위해, 만약 다른 생각과 의견이 있으시다면 편하게 댓글 남겨 주시기 바랍니다.
이 글은 몇 편의 시리즈로 작성될 예정인데, 전체 초안은 https://www.facebook.com/lee.eunjo.3/posts/10223852483158298 에서 확인하실 수 있습니다. 제가 하고 싶은 내용의 핵심은 여기에 다 있습니다. 이후 작성되는 글은 초안을 좀 더 다듬고 사례를 덧붙인 내용이 될 것입니다.
앞으로 다룰 주제들은 다음과 같습니다.
서비스 대상과 목표 명확히 정의하기
데이터 조사 및 탐사 분석
라벨링
모델링
서비스 구현
서비스 운영 및 보안
생각의 정리를 위해 주제별로 항목을 구분하였지만, 실상 항목 간에 연관성이 높기 때문에 따로 떨어뜨려 생각할 수는 없습니다. 가령, 서비스 대상과 목표를 정의하는 것은 각각 라벨링 및 모델 평가와 관련이 높습니다. 또한 라벨링은 서비스 운영과도 함께 생각해야 합니다. 지속적인 서비스를 위해선 지속적으로 라벨링이 가능해야 할 뿐더러 운영 방식이나 과정이 라벨링에 영향을 주기 때문입니다. 모델링은 서비스 구현 및 운영과도 연결됩니다. 예를 들어, 과도하게 무거운 모델은 서비스 구현 및 운영 비용을 크게 증가시킵니다. 탐사 분석은 사용할 데이터를 검토하는 작업에서도 필요하지만 모델링 단계에서 전처리를 어떻게 할 것인지나 모델 설계, 어떤 학습 알고리즘을 사용하지를 결정할 때에도 필요합니다.
따라서 저는 이런 연결 관계를 고려해 각 주제를 다룰 때 관련있는 다른 주제를 반복적으로 언급하려 합니다.
예측 모델을 이용해 어떤 서비스를 만든다면 무엇을 예측할 것인지 예측 대상과 예측 모델을 통해 얻고자 하는 목표가 명확해야 합니다. 예측 대상은 레이블을 결정하고, 목표는 모델을 어떻게 활용할 것인지 실행 전략과 모델 평가 방법을 결정합니다. 따라서 최대한 구체적으로 정의해야 합니다.
예를 들어, '주가를 정확히 예측하겠다.' 는 좋은 정의가 아닙니다. 적어도 어느 시점의 주가를 예측할 것인지가 정의되어야 합니다. 특히, 대개의 경우 실전 서비스에서 '정확한 예측' 은 좋은 목표가 아닙니다. 여기서 얘기하는 '정확한 예측'이란, accuracy, F1 score, AUC, RMSE 등의 (우리가 흔히 논문에서 사용하는) 지표가 높은 값을 기록하는 것을 의미합니다. 이런 지표들이 비록 모델의 예측 성능을 비교하기 위해 많이 사용하는 방법이지만, 현실 서비스에서 목표를 정의할 때는 그리 적절한 방법이 아닙니다.
가령, '내일의 주가를 최대한 정확하게 예측하겠다.' 고 목표를 정할 경우 실전에서는 쓸모 없는 모델이 될 가능성이 높습니다. 이를 테면, RMSE가 최소가 되도록 내일의 주가를 예측하는 가장 단순한 모델은 y(t) = y(t-1) 입니다. 대체로 오늘의 주가는 전날 가격에서 크게 벗어나지 않기 때문입니다. 그러나 쉽게 예상할 수 있듯이 이것은 아무 쓸모가 없는 모델입니다.
몇 년 전 딥러닝 전문 업체를 표방하는 한 회사에서 LSTM을 이용해서 비트 코인 시세를 예측하는 모델을 만들어다고 홍보하는 글을 본 적이 있습니다. 해당 모델은 RMSE가 최소가 되도록 학습되었습니다. 아래 그래프는 해당 홍보 자료에 있던 모델의 예측치와 실제 비트 코인 가격을 비교한 그래프입니다. 얼핏 보기에 실제 비트 코인 가격을 잘 예측하는 것처럼 보이지만 사실 빨간색 그래프는 초록색 그래프를 한칸 오른쪽으로 옮겨놓은 것에 더 가깝습니다. 즉, 이 모델은 전날의 비트코인 가격을 거의 그대로 답습합니다. RMSE를 최소로 하는 것이 모델의 목표라면 이것은 만족스러운 결과일 수 있습니다. 하지만 이 모델로 뭔가 유용한 서비스를 만들 수는 없을 것입니다. 시계열 예측을 시도하는 많은 초보자들이 이와 비슷한 실수를 합니다.
실전에서는 실행 전략을 고려한 목표를 정의해야 합니다. 적어도 '오늘보다 내일 주가가 오른다고 예측되면 매수하고, 내린다고 예측되면 매도하는 전략을 취할 경우 기대 이익이 최대가 되는 모델을 만들겠다.' 정도가 되어야 합니다.
실행 단계에서 필요한 비용도 고려해야 합니다. 온라인 쇼핑몰에서 A라는 상품의 구매율을 높이기 위한 맞춤형 광고 서비스를 만드는 간단한 시나리오를 생각해 보죠. 기존에 A 상품을 산 고객 집단과 그렇지 않은 고객 집단의 이전 구매 이력, 장바구니 보관 항목, 검색 기록 등의 정보를 학습 데이터로 사용하여 A를 구매할 확률을 예측하는 모델을 만들 수 있을 것입니다. 이후 이 예측 모델을 통해 구매 확률이 높다고 예측된 고객에게 맞춤형 광고를 하는 것이죠. 이 예측 모델의 예측 대상은 '일정 기간 이내에 A 상품을 구매할 고객' 이고, 목표는 'A 상품 구매율 높이기' 가 됩니다. 이런 경우 예측 모델의 성과는 맞춤형 광고 대상 중 A 상품을 구매한 고객 비율이 될 것입니다. 이제 서비스 담당자는 A 상품 구매율을 높이기 위해 예측 모델을 계속 개선해 나갈 것입니다.
그러나 이것은 비용을 고려하지 않은 방법입니다. 이 예측 모델이 추정하는 것은 P(구매 | 과거 활동 정보) 입니다 (이 수식은 과거 활동 정보를 조건으로 한 조건부 구매 확률을 의미합니다). 즉, 이것은 맞춤형 광고와 상관없이 해당 제품을 구매할 확률입니다. 극단적으로 말해, 우리 예측 모델의 성능이 매우 뛰어날 경우, 구매 확률이 높게 나온 고객은 우리가 아무런 마케팅을 하지 않더라도 A 상품을 구매할 것입니다. 그런데 대부분의 맞춤형 광고는 비용이 발생합니다. 따라서 구매 확률이 높게 예측된 고객에게 광고를 수행하는 것은 불필요한 낭비입니다. 오히려 구매 확률이 매우 낮게 나온 고객에게 맞춤형 광고를 해서 구매 확률을 조금이라도 높이려고 애쓰는 것이 나을지 모릅니다. 물론 실제로 이렇게 했다간 마케팅 성과나 예측 모델의 성능이 매우 낮게 나올 것이고 해당 서비스는 실패한 것으로 평가받을 가능성이 높습니다.
이런 문제를 피하려면, 예측 모델의 추정 대상이 P(구매 | 과거 활동 정보) 가 아니라 P(구매 | 맞춤형 광고) 가 되어야 합니다. 또한 목표 지표 역시 단순히 A 상품 구매율이 아니라 맞춤형 광고 비용을 고려했을 때의 기대 이익이 되어야 합니다. 이것을 측정하는 한 가지 방법은 A/B 테스트를 이용하는 것입니다. 모델을 통해 예측된 고객을 두 집단으로 임의 분류한 후 한 집단에만 맞춤형 광고를 하는 것이죠. 이후 두 집단의 A 상품 매출을 통한 이익금에서 광고 비용을 뺀 값을 측정합니다. 이것은 아마 최선은 아니겠지만, 예측 모델에 대한 비용 대비 효과를 비교적 정확하게 측정할 수 있는 방법입니다.
한편, 이런 비용을 고려한 목표 지표는 예측 대상을 정의하는데에도 영향을 미칩니다. 제가 2018년에 쓴 https://ieeexplore.ieee.org/document/8485736 는 이탈로 예측되는 고객에 대해 타겟 프로모션을 하는 실행 전략을 취할 경우, 전체 고객을 예측 대상으로 삼는 것보다 상위 1%의 소위 VIP 고객만을 예측 대상으로 정하는 것이 기대 이익이 더 높다 라는 점을 실험을 통해 제시하였습니다.
아래 표를 보면, Test set I 이 전체 고객을 예측 대상으로 한 예측 모델의 성능 평가 결과이고, Test set II 는 '고객 생애 가치 (Customer Lifetime Value, CLV)' 가 높은 VIP 고객만을 예측 대상으로 한 예측 모델의 성능 평가 결과입니다. 여러 가지 상황에 대해 다양한 평가 지표를 정리했기 때문에 보기에 좀 복잡한데, 쉽게 말해 실전에서 예상되는 기대 이익인 'expected profit' 이 Test set I 은 음수값이 나오는 (즉, 손실이 발생하는) 반면, Test set II 는 대부분의 시나리오에서 높은 기대 이익이 추정됩니다.
여기서 주목할 점은 아래 표에서 accuracy, F1 score, AUC 등의 성능 평가 지표의 경우 Test set I 이 Test set II 에 비해 더 높다는 점입니다. 따라서 만약 예측 모델의 목표를 예측 정확도로 정의한다면 Test set I 처럼 서비스를 이용하는 모든 고객을 예측 대상으로 정의하는 것이 옳은 선택입니다. 그러나 앞서 설명했듯이 기대 이익 관점에서 보면 Test set II 가 더 합리적인 선택입니다. 이것이 의미하는 것은 (전체 고객을 예측 대상으로 정의하는 것이 항상 잘못되었다는 것이 아니라) 이 실험에서와 같은 실행 전략을 취할 경우 나쁜 방법이라는 것입니다.
물론 대부분의 경우 적절한 목표 지표를 정의하는 것은 어렵습니다. 게다가 우리가 아는 많은 성공한 서비스들이 처음부터 완벽한 기획과 목표를 갖고 시작하지는 않았습니다. 따라서 전 '좋은 목표 지표를 찾기 전에는 예측 모델링을 하면 안된다!' 라는 교조주의적 주장을 하려는 의도는 없습니다. 다만 적어도 실전 서비스를 개발하는 단계 혹은 운영 과정에서 계속해서 적절한 예측 대상과 목표를 찾는 고민은 해야겠습니다.
위에서 언급한 기대 이익을 고려한 예측 모델 평가하기에 대한 또 다른 이야기는 https://brunch.co.kr/@gimmesilver/36 를 참고하시기 바랍니다.