CTR이 높고 CVR이 낮은 것과 CTR이 낮고 CVR이 높은 것 중 어느 것이 좋은가?

광고 캠페인을 운영하다보면 비슷한 또는 동일한 캠페인인데 매체 또는 DSP업체 성과가 다음과 같이 다른 경우가 있습니다.

  • CTR은 높지만 CVR이 낮은 것
  • CVR은 높지만 CTR이 낮은 것

CTR과 CVR은 단순하게는 DSP의 타겟팅 능력과 매체의 품질에 가장 큰 영향을 받습니다만
그럼에도 불구하고 둘 중 어느 것이 좋은가를 기술적으로 볼 때

  • 광고업체(매체와 DSP모두)의 입장에서는 1번이 좋습니다.
  • 광고주의 입장에서는 2번이 좋습니다.

아직도 광고비 과금을 CPC(클릭당 과금) 방식으로 많이하기 때문입니다. 클릭율이 높으면 과금율이 높아지므로 매체( CPC매체인 경우)와 광고회사에게 좋습니다.

하지만 여기에 생각할 부분이 더 있습니다.

CPC가 만약 가변인 경우입니다. 즉 몇몇 광고 업체처럼 가변 CPC로 KPI에 따라 목표치에 최대한 근접하게 광고를 운영한다고 하면 생각할 것이 많아집니다.

CTR이 낮아도 광고요금이 상대적으로 높을 수 있고 CTR이 높아도 광고요금이 낮을 수 있습니다. 즉 CTR만으로는 광고의 성과를 정확하게 알아낼 수 없습니다.

결국 cVR로 마찬가지가 됩니다. 클릭 후에 오디언스의 액션에 따라 전환되는 비율을 측정하는데 CVR이 조금 낮더라도 전환수가 많다면 CVR이 높아도 전환수가 많지 않은 것 보다는 좋습니다.

CPC가 만약 고정이라면

그래도 CTR이 높은 경우가 사실은 더 유리합니다.

CVR은 원래 CTR보다 높게 형성되지만 보통 물건의 품질, 가격경쟁력, 브랜드파워에 따라 달라집니다. 그럼에도 불구하고 cTR이 높아져서 전환수가 많아지는 것이 전환률이 높은 것보다는 광구주 측이의 매출이나 이윤이장에서는 유리합니다.

결론

많은 경우에 CTR이 높고 CVR이 낮은 것이 더 좋습니다. 그 반데의 케이스보다는 유리합니다. 하지만 항상 그런 것은 아닙니다.

쉽게 이해하는 XGboost

요약

XGboost는 기계학습에서 사용하는 결정 트리(Decision Tree)라는 계열의 알고리즘 중 하나입니다. 중요한 특징으로는 분산 컴퓨팅으로 기계학습 모델을 빌드 할 수 있습니다.

즉 어려대의 서버로 대량의 학습데이터를 사용해서 결정트리 기계학습 모델을 만들 수 있게 해주는 기계학습 프레임워크(알고리즘)입니다.

결정 트리 (Decision Tree)

결정나무라고도 번역하는데 이게 느낌이 너무 이상해서 대부분 디씨젼트리 또는 결정트리라고 부릅니다.

결정트리 (Decision Tree)의 계보는 CART부터 시작해서 밑에 그림과 같습니다. 뒤에 LightGBM아 몇개가 더 있습니다만 XGboost까지의 계보는 저렇습니다.

여기서 아마 역사적으로 가장 잘 알려진 것은 “랜덤포레스트”일 것입니다.

랜럼포레스는 결정트리에 배깅 기법을 추가한 것이고
GBM은 결정트리에 부스팅 기법을 추가한 것입니다.

GBM은 분류 알고리즘이라면 어떤 알고리즘이라도 사용할 수 있지만 결정트리가 가장 쓰기 편하고 좋기 때문에 GBM은 결정트리를 주로 씁니다.

XGBoost: A Scalable Tree Boosting System

개요

  • XGBoost = eXtream Gradient Boosting
  • Gradient Boosted Decision Tree의 분산 컴퓨팅을 위한 새 구현체
  • 정확히 설명하면 GBM(Gradient Boosting Machine)의 분산 환경을 구현체

잘 알려지지 않았지만 GBRT (Gradient Boosting Decision Tree)는 정말 성능이 좋은 알고리즘이지만 모델 빌드속도가 매우 느리고 분산 노드를 이용해서 빌드 속도를 단축시키는 것이 가능하지 않다는 문제가 있습니다. GBRT는 정확도를 쥐어짜듯이 끌어내면서도 과적합(오버피팅)이 심하게 되지 않는 장점이 있습니다.

GBRT의 문제점은 학습데이터가 많아지고 자질(feature)가 많아질 수록 빌드속도가 늘어나고 한대의 컴퓨터에서 처리할 수 없는 메모리를 사용해야 하면 빌드를 하지 못합니다.

XGboost는 그 문제를 해결해놓은 것입니다.
이 문제를 해결했기 때문에 GBRT를 이용해서 대량의 학습데이터로 성능을 최대한 뽑아내는 모델을 빌드할 수 있게 되었습니다.

논문 Paper

읽어보면 좋습니다만 좀 어렵습니다.
https://arxiv.org/abs/1603.02754

유용한 정보

XGboost는 monothonic 제약을 지원합니다. 예측값이 항상 과거 보다는 미래의 값이 크거나 같아야 하는 경우를 말합니다.

사용상 문제 Issue

아직 몇 가지 문제도 있고 그렇습니다만 일반적으로 쓰는 데는 큰 문제가 없습니다.

그리고 카테고리 변수를 사용하지 못하는 큰 문제가 있습니다.

참조

다른 자료들도 참조하세요.

https://brunch.co.kr/@snobberys/137

LightGBM

LightGBM은 결정 트리(Decision Tree) 계열의 알고리즘 중에서는 현재까지의 가장 좋은 알고리즘입니다. 그렇다고 해서 이 알고리즘이 xgboost나 gbdt에 비해서 항상 성능이 좋다는 말은 아닙니다.

마이크로소프트(Microsoft)에서 만들었습니다.

GBM은 Gradient Boosting Machine의 약자이고 Light는 가볍고 빠르다는 뜻입니다.
그러면 “GBDT (GBRT)나 XGboost는 무겁운가?” 라고 묻는다면.

네. 그렇습니다. 하지만 XGBoost가 쓸모 없다는 말은 아닙니다.

lightGBM의 대략의 특징입니다.

특징

  1. 범주형 변수를 차원으로 올리는 더미 변환 또는 피폿(캐스팅)을 하지 않아도 된다.
  2. XGboost 보다 적은 데이터로 더 정확한 모델을 만들 수 있다.
  3. XGboost 보다 더 모델 빌드가 빠르다.

기존의 다른 알고리즘의 문제점과 개선한 방법

  • 느린 모델 빌드 속도
    • GBDT(Gradient Boosted Decision Tree; 또는 GBRT) 계열은 직렬 연산 알고리즘으로 병렬처리가 불가능하다.
    • GBDT는 엔트로피 계산(Information gain)을 위한 변수의 구간 탐색이 매우 빈번하다. 
    • 여러 개의 트리가 필요하지만 Gradient boosting(그래디언트 부스팅)을 하기 위해서는 병렬 처리를 할 수 없다. 어차피 트리를 병렬로 생성할 수 없기 때문에 가능하지 않다.
  • 모델 빌드 속도 개선 방법1
    • XGboost와 같이 변수에 대해서 히스토그램 색인을 만들고 학습 데이터를 병렬 분산, 중복 적재해서 연산력을 위해서 데이터 탐색 속도를 줄인다.
    • 즉 병렬처리를 하지 못하므로 직렬 처리에서 시간 소모가 가장 많은 부분에 연산자원을 과투입하고 데이터 전처리를 해둔 뒤 빌드 시간을 줄인다.
  • 모델 빌드 속도 개선 방법2
    • 학습데이터를 샘플링하는데 Gradient가 급격한 구간의 데이터들의 샘플 수를 줄이고 완만한 구간의 샘플을 늘려서 샘플의 능력 발현을 최대로 활용한다.
  • 범주형 변수 지원의 문제점
    • XGboost가 범주형 변수를 지원하지 못하기 때문에 문제가 많은데 범주형 변수를 지원하기 위해서 어쩌고저쩌고 하는 알고리즘(알고리즘이 매우 어려워서 여기서는 이름도 쓰지 않겠음)을 개발해서 적용했다.

장점

  • 매우 큰 학습데이터를 빌드하는데 시간 소모가 드라마틱하게 줄어들지만 예측 성능은 떨어지지 않는다.
  • 범주형 변수를 지원한다.
  • 사용하기 매우 편하다.
  • Microsoft가 만들었다.

단점

  • GPU로 추가 성능 개선을 할 여지가 없다.
  • Tensorflow를 비롯한 여러 프레임워크중에서 지원하지 않는 것이 많다.
  • 범주형 변수의 오토 레이블링(레벨링)을 지원하지 않는다. 범주형 변수를 모두 integer로 변환해야 한다.
  • Microsoft가 만들었다. 그래서 관리를 잘 해줄 것이라는 기대와 믿음이 있다.

Python패키지가 있으므로 주피터노트북에서 불러써도 됩니다.

Centos에 C++을 위한 build-essential 설치하기

Python 패키지 중에는 설치할 때 C++ 작성된 코어 모듈을 컴파일해서 설치하는 것들이 종종있습니다. 이런 것을 설치하려면 C++ 컴파일을 할 수 있는 컴파일러와 빌드도구를 설치해줘야합니다.

Ubuntu에서는 C++ 컴파일러를 포함해서 여러가지 개발 도구를 설치할 때 다음과 같이 합니다.

sudo apt-get install build-essential

Centos는 다음과 같이 하면 됩니다.

sudo yum groupinstall 'Development Tools'

MAB (Multi Armed Bandit) – 광고 플랫폼의 캠페인 노출 최적화

MAB는 기계학습 강화학습의 일종입니다. 완전한 강화학습은 아니지만 포함해서 취급합니다.

MAB는 “엠에이비”, “멀리암드밴딧”이라고 발음합니다.

“팔 여러 개 달린 산적” “Multi Armed Bandit”은 슬롯머신의 별명인데 이 알고리즘은 이름처럼 “어떤 슬롯 머신의 팔을 당겨야 돈을 딸 수 있는가?” 와 같은 문제를 풀기위한 방법입니다.

엄밀한 의미의 강화학습에 포함되지 않지만 상당히 간단하고 쓸만하고 강화학습의 개념을 익히기 좋기 때문에 강화학습을 설명할 때 가장 먼저 설명하는 것이기도 합니다.

여러 대의 슬롯 머신이 있고 이 슬롯 머신 중 어떤 것의 레버를 당겨야 돈을 딸 수 있는가를 푸는 문제입니다. 한 번에 1대의 슬롯머신의 레버를 당기고 계속해서 반복합니다.

이 문제의 전제 조건이 있는데 한 번에 하나의 슬롯머신의 팔을 당길 수 있다는 것입니다.

그래서 동시에 모든 슬롯머신의 팔을 당겨서 그리고 여러번 당겨서 어떤 슬롯머신이 돈을 딸 학률이 높은지 알아낼 수 없습니다.

그래서 한 번에 하나씩만 선택해서 돈을 최대한 많이 따는 것이 이 문제의 푸는 목적입니다.

복잡한 공식은 여기에 안 적겠습니다. 구글에서 찾아보시면 수식과 코드가 다 있습니다.

첫번째 방법. Greedy 욕심쟁이

모든 슬롯머신에 순차적으로 한 번씩 팔을 내려봅니다. 그래서 돈을 못땄다면 다시 한 번씩 다 팔을 내려봅니다.

몇번을 수행한 후에 딴 돈이 가장 많은 슬롯머신에게 계속해서 몰빵합니다.

이게 그리디(Greedy, 탐욕스러운) 방식입니다. 단순하면서도 조금 무식한 방법입니다.

두번째 방법. epsilon

Greedy 방법을 사용하되 무작정 사용하지 않고 랜덤으로 팔을 당길 확률을 정해놓습니다.

만약 50%의 확률로 랜덤을 고르겠다고 하면 한 번은 지금까지 가장 돈을 많이 딴 슬롯머신을 당기고 한 번은 랜덤으로 아무것이나 고르는 방법입니다.

그나마 다른 것들에게 기회를 준다는 것 때문에 낫습니다.

epsilon이라는 이름은 랜덤으로 고를 확률값을 epsilon이라고 이름을 붙여서 부르기 때문입니다.

세번째 방법. UCB(Upper-Confidence-Bound)

위의 epsilon에서 약간의 공식을 주어서 랜덤 찬스가 왔을 때 무조건 랜덤으로 어떤 슬롯머신을 팔을 다기지 않고 덜 뽑혔던 슬롯머신에 가중치를 두어서 더 뽑아서 팔을 내려줍니다.

네번째 방법. Tompson sampling

톰슨 샘플링은 설명을 하면 조금 복잡해지는데 확률 분포 중 하나인 베타분포를 이용해서 확률이 가장 높은 것을 선택하는 것입니다.

베타분포 함수에 선택된 횟수와 돈을 딴 횟수를 입력하면 베타분포를 각각 구할 수 있고 그 베타분포를 확률 분포로 이용해서 값을 구하면 선택할 것을 찾을 수 있습니다.

저장된 데이터를 이용할 수 있는 장점이 있고 UCB 보다 성능이 조금 더 좋아서 온라인 추천 시스템에서 많이 이용되고 있습니다.

A/B 테스트와 MAB의 관계

A/B 테스트는 통계학의 실험계획법 중 하나 인데 2개 또는 2개 이상의 그룹을 동일한 수(최대한 비슷한 수) 만큼 각각 분할해서 한쪽에만 다른 처리를 해서 두 그룹의 차이를 보는 방법입니다

온라인에서는 흔히 버킷테스트라고 하는 방법입니다.

예를 들어 광고배너가 있는데 원래 배너는 테두리가 하얀색인데 테두리를 빨간색으로 바꿨을 때 사람들이 어떤 것을 클릭을 더 많이 하는지 알아 보고 싶을 때 같은 경우에 합니다.

A/B 테스트가 오랫동안 사용한 방법이기 때문에 잘 알려져 있지만 문제는 두 그룹을 방해받지 않게 불한하는 방법이 상당히 어렵고 두 그룹의 차이를 알아보는 방법이 데이터의 양상과 원래 데이터의 특성에 따라 여러가지 통계적인 방법을 써야하는 데 실수로 잘못된 방법으로 확인을 했다고 하더라도 그 실수를 알아내기 어렵다는 문제가 있습니다.

A/B 테스트를 하는 것은 많이 어렵지 않지만 A/B테스트의 결과를 해석하는 것은 매우 숙련된 통계학자가 필요하고 시간도 많이 걸립니다.

그래서 A/B 테스트를 하지 않고 각각 반응을 그대로 볼 수 있는 어떤 환경이 있다면 그 환경에서는 각각 매번의 결과에 따라서 결과가 좋은 것에 점수를 더 줘서 그것을 선택하게 만드는 방법을 쓰자는 것입니다.

그래서 MAB는 온라인 시스템의 추천시스템이나 평가에 굉장히 적합합니다.

광고시스템과 MAB

한 번에 5개의 제품을 동시에 보여지는 광고 이미지가 있다고 가정합니다.

사용자 별, 또는 사용자 그룹별로 어떤 제품에 더 관심을 가지는 지를 보고 클릭을 많이 하는 제품을 MAB에 의해서 더 많이 노출한다고 하겠습니다.

흔히 쓰는 방법이지만 이게 문제가 좀 있습니다.

  • 선택할 제품이 매우 많은 경우에는 못합니다. 아마도 제품의 카테고리가 있고 그것들 중에 가장 잘 팔리는가 하는 전략을 취할 수 있지만 상식적으로 좋은 방법은 아닐 것입니다.
  • 선호도는 계절성 효과, 요일 효과, 캠페인에 피로도에 따라 달라집니다. 슬롯머신 처럼 확률이 안변한다는 가정을 두기가 좀 어렵습니다. 변동이 너무 많습니다.
  • 또 가중치를 변경하는 것 때문에 생기는 문제가 파생적으로 생기는데
    • 쿠키로 인해 신규 및 재이용자의 분포에 영향을 미칩니다.
    • 변화에 대한 적응이 느리기 때문에 인해 관성때문에 결과가 왜곡될 수 있습니다.

아주 단순한 경우에만 사용이 가능하며 복잡한 시스템으은 오히려 결과를 왜곡할 수 있습니다.

저렇게 선택한 것이 여전히 가장 좋은 방법 또는 그리 좋은 선택이 아닐 수도 있겠지만 그 자체를 확실하게 확인 못합니다. 이건 다른 알고리즘도 동일한 문제이긴 합니다만.