推荐点击率CTR修正平滑
CTR(Click-Through-Rate)即点击通过率,指网络广告的点击到达率。CTR是广告推荐系统中,一项重要的衡量算法好坏的指标。
计算公式: CTR = 点击数 / 曝光数
由于原始CTR计算方式只考虑了相对值,没有考虑绝对值。即,没有考虑曝光的数值大小,因为,曝光少的情况下,计算出的CTR其实不可靠,样本充足的情况下,才能反应真实情况。
举个例子,有三个广告:
A:点击数 5 曝光数 10
B:点击数 50 曝光数 100
C:点击数 500 曝光数 1000
此三个广告的CTR 都是 0.5 ,但是按照实际表现,从置信的角度分析,应该是C > B > A,因为C的样本数更多,可信度更高。
法一:Wilson CTR
为了衡量样本数对于 CTR 置信区间的影响,科学家们引入"威尔逊(Wilson)区间"的概念。公式如下:
p —— 概率,即点击的概率,也就是 CTR
n —— 样本总数,即曝光数
z —— 在正态分布里,均值 + z * 标准差会有一定的置信度。例如 z 取 1.96,就有 95% 的置信度。
Wilson区间的含义就是,就是指在一定置信度下,真实的 CTR 范围是多少。
Wilson CTR修正的源码如下:
def Wilson_change_ctr(category_change_ctr_rdd):
# Wilson_CTR
z = 1.96 #95%置信度
city_code = str(category_change_ctr_rdd[0])
category = str(category_change_ctr_rdd[1])
expo_cnt = float(category_change_ctr_rdd[2])
ctr = float(category_change_ctr_rdd[3])
try:
if expo_cnt * ctr == 0:
w_ctr = 0.0
else:
w_ctr = (ctr + z * z / (2.0 * expo_cnt) - z * math.sqrt(
(ctr * (1.0 - ctr) + z * z / (4.0 * expo_cnt)) / expo_cnt)) / (1.0 + z * z / expo_cnt)
except:
w_ctr = 0.0
return (city_code, category, expo_cnt, w_ctr)
结论:利用Wilson CTR修正公式计算出的score分数越高,表明item的表现越好。
法二:Percentile CTR
利用曝光数据的分位数:
def Percentile_change_ctr(category_change_ctr_rdd):
# percentile map_ctr
city_code = str(category_change_ctr_rdd[0])
category = str(category_change_ctr_rdd[1])
expo_cnt = category_change_ctr_rdd[2]
ctr = category_change_ctr_rdd[3]
percentile = category_change_ctr_rdd[4]
try:
if float(expo_cnt) >= float(percentile):
map_ctr = float(ctr)
else:
map_ctr = float(ctr) * float(expo_cnt) / float(percentile)
except:
map_ctr = 0.0
return (city_code, category, expo_cnt, map_ctr)
结论:利用Percentile CTR修正公式计算出的score分数越高,表明item的表现越好。