CTR 예측
Click-Through Rate Prediction
광고/콘텐츠 클릭 확률 예측. 디지털 마케팅 핵심.
Click-Through Rate Prediction
광고/콘텐츠 클릭 확률 예측. 디지털 마케팅 핵심.
CTR(Click-Through Rate) 예측은 사용자가 특정 광고, 콘텐츠, 또는 추천 아이템을 클릭할 확률을 예측하는 머신러닝 과제입니다. 디지털 광고에서 CTR은 노출 대비 클릭 수의 비율이며, 이를 정확히 예측하면 광고 수익 최적화와 사용자 경험 향상을 동시에 달성할 수 있습니다.
CTR 예측의 역사는 로지스틱 회귀(Logistic Regression)에서 시작되었습니다. 이후 FM(Factorization Machine)이 특성 간 상호작용을 모델링하며 성능을 크게 향상시켰고, 현재는 DeepFM, DCN(Deep & Cross Network), Wide & Deep 같은 딥러닝 모델이 주류입니다.
CTR 예측의 핵심 과제는 희소한 범주형 특성(사용자 ID, 광고 ID, 카테고리 등)을 효과적으로 처리하는 것입니다. 임베딩 레이어로 고차원 원-핫 벡터를 저차원 밀집 벡터로 변환하고, 이를 통해 특성 간의 암묵적 상호작용을 학습합니다.
실무에서 CTR 모델은 광고 입찰(bidding), 추천 시스템 랭킹, 검색 결과 정렬 등에 핵심적으로 사용됩니다. Google, Meta, Alibaba 같은 기업들은 일일 수십억 건의 예측을 실시간으로 처리하며, 0.1%의 CTR 개선도 연간 수억 달러의 매출 증가로 이어집니다.
# DeepCTR 라이브러리를 사용한 CTR 예측 모델
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from deepctr.models import DeepFM
from deepctr.feature_column import SparseFeat, DenseFeat, get_feature_names
# 샘플 데이터 생성
data = pd.DataFrame({
'user_id': ['u1', 'u2', 'u3', 'u1', 'u2'] * 1000,
'item_id': ['i1', 'i2', 'i1', 'i3', 'i1'] * 1000,
'category': ['cat1', 'cat2', 'cat1', 'cat3', 'cat2'] * 1000,
'price': [100, 200, 150, 300, 120] * 1000,
'click': [1, 0, 1, 0, 1] * 1000 # 타겟 변수
})
# 범주형 특성 인코딩
sparse_features = ['user_id', 'item_id', 'category']
dense_features = ['price']
for feat in sparse_features:
lbe = LabelEncoder()
data[feat] = lbe.fit_transform(data[feat])
# 특성 정의
fixlen_feature_columns = [
SparseFeat(feat, vocabulary_size=data[feat].nunique(), embedding_dim=8)
for feat in sparse_features
] + [DenseFeat(feat, 1) for feat in dense_features]
# 모델 생성 및 학습
model = DeepFM(fixlen_feature_columns, fixlen_feature_columns, task='binary')
model.compile("adam", "binary_crossentropy", metrics=['AUC'])
# 학습 데이터 준비
train, test = train_test_split(data, test_size=0.2, random_state=42)
train_input = {name: train[name].values for name in get_feature_names(fixlen_feature_columns)}
test_input = {name: test[name].values for name in get_feature_names(fixlen_feature_columns)}
# 학습
model.fit(train_input, train['click'].values,
batch_size=256, epochs=10, validation_split=0.1)
# 예측
predictions = model.predict(test_input)
print(f"예측 CTR 범위: {predictions.min():.4f} ~ {predictions.max():.4f}")
"현재 CTR 모델의 AUC가 0.72인데, DeepFM에서 DCN-V2로 바꾸면 0.75까지 올라갈 것 같습니다. 특히 cross layer가 feature interaction을 더 잘 잡아줘서 long-tail 아이템의 예측 정확도가 높아집니다."
"CTR 예측에서 position bias를 처리하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 position을 별도 특성으로 추가하거나, 학습 시에는 position을 사용하고 서빙 시에는 제외하는 방식입니다."
"임베딩 차원을 16에서 8로 줄이면 모델 크기가 40% 줄어들어 서빙 latency가 개선됩니다. 다만 AUC 하락폭을 검증해보고, 0.5% 이상 떨어지면 다시 조정이 필요해요."
실제 CTR은 보통 1~5% 수준이라 클릭과 비클릭의 비율이 극도로 불균형합니다. Negative sampling, Focal Loss, 또는 클래스 가중치 조정이 필수적입니다.
상단에 노출된 아이템은 더 많이 클릭되는 경향이 있습니다. 이 위치 편향을 보정하지 않으면 모델이 노출 위치와 실제 품질을 혼동하게 됩니다.
사용자 행동 패턴은 빠르게 변합니다. 오래된 데이터로 학습하면 트렌드 변화를 반영하지 못해 성능이 급격히 하락할 수 있으므로 주기적인 재학습이 필요합니다.