【点击模型学习笔记】Predicting Clicks_Estimating the Click-Through Rate for New Ads_MS_www2007

本文深入探讨了逻辑回归在点击率预估(CTR)问题上的应用,详细解析了搜索引擎如何通过广告展示位置、用户行为等因素,利用逻辑回归模型预测广告点击率,以优化广告收入。文章提出了通过极大似然估计方法处理点击率预测问题,并讨论了特征选择、训练方式、评测标准等关键步骤。此外,还介绍了通过广告质量、特定性、搜索数据等特征的引入,以及外部数据特征的应用,来提升CTR预测模型的准确性与实用性。
概要:
微软研究院的人写的文章,提出用逻辑回归来解决ctr预估问题,是以后ctr的经典解决方案,经典文章。

具体内容:

名词:
CPC —— cost per click
CTR —— click through rate

1. 研究初衷

搜索引擎主要靠商业广告收入,在广告位上面打广告,用户点击,之后广告商付费。在通用搜索引擎,通常广告位置是在搜索结果之前,或者在搜索结果右边。

商业广告收入 = pClick * CPC

要提升广告收入,关键问题是在有限的广告为上面,放什么广告?很自然的想法就是,放用户可能点击的广告,并且放每次点击广告商付费多的广告,如上面公式所示。总而言之,计算广告的点击率就是问题的关键。

一点常识:
* 搜索广告平均点击率是2.6%。(个人记得展示广告的平均点击率比这个要低一个到两个数量级,能超过千分之一就不错了)
* 搜索广告的点击率和广告的展示位置关系非常密切,通常排在第一个的广告的点击率要远超过排在后面几个的广告

2. 问题抽象

对于某个广告,要素:bid term(query命中这些term,则有机会展示这个广告)、广告本身、广告商等等
当用户搜索的query命中了bid term的时候,此时会索引到一系列广告,计算这些广告在当前情况下(query、用户等)的点击率,并且按照点击率进行排序、展示。

3. 朴素的想法

用极大似然方式来估计点击率,即广告被点击的次数除以广告的总展示次数。
缺点:
* 广告实际被点击的次数可能很少,计算误差会比较大
* 对于新广告,无法解决冷启动问题

Regelson and Fain的方法:
对于冷启动问题,这两个人用该广告bid term中的其他广告的ctr来对其进行预测


4. 本文的方法

总体思路:把点击率预测问题转换成机器学习问题,将具体广告、环境抽象成特征,用特征来进行达到泛化的目的,从而对冷启动中的广告进行预测。

具体来说:

p(click|ad, pos) = p(click|ad, pos, seen) * p(seen|ad, pos)

其中,ad表示广告,pos表示展示位置,seen表示广告被用户看见。上述表示:用户在当前位置点击广告的概率等于用户在当前位置看到广告的概率及看到广告后点击广告的概率。对于上述概率进一步简化(在直观上作简化),得到:

p(click|ad, pos) = p(click|ad, pos, seen) * p(seen|ad, pos) = p(click|ad, seen) * p(seen|pos)

对于每个广告位置,可以估计广告放在这里被用户看到的概率——很多追踪眼球运动的装置能够发现用户观看搜索结果的情况——这样p(seen|pos)的值就可以估计出来。
问题的关键转成计算p(click|ad, seen)的值。

作者把概率估计问题转成回归问题(曲线拟合问题),不过用的是逻辑回归、而不是线性回归。对此,作者的解释是,逻辑回归(不考虑最后的阶跃函数来分类)将函数值映射到[0,1]区间,这个区间和概率的区间是一致的,所以就用它了。

训练方式:
对于某个广告,根据历史统计广告的经验点击率,并从广告和广告位等信息中抽取特征,有些是实值特征,组成<特征....,经验点击率>这样的训练样本,用来进行训练。
而现在实际常用的系统中,往往采用的是0-1特征,而输出值,也是0-1,表示这个广告在当前是否被点击。这样的话,随着广告被不断展示,可以不断进行增量训练。而原文作者这种方式,只能是积累了一段时间之后,重新统计,生成新的经验点击率,然后再进行重新训练。而且,原文这种方式,不能够利用那些稀疏点击——否则根据MLE来估计的“经验点击率”会很不准确(这也是本文要解决的问题),这时候会影响训练。

数据选择:
选择那些展示了100次以上的广告,进行训练。避免数据稀疏问题。

评测方式:
按照广告商来区分训练集和测试集——这样,训练集中的经验点击率用于训练,测试集中的经验点击率用于测试。
两个评测标准:MSE和KL距离

作者提道了一句:作者也尝试了回归树(MART: multiple additive regression trees),就像通用搜索做的那样,不过后来发现效果和逻辑回归很接近,就采用逻辑回归了。

5. 特征选择

在模型确定之后,在deep learning延伸到这个领域之前,特征工程就是最重要的——几乎是唯一——的可以做的事情了。

对于每一个数值特征,如果count是c,则作者同时用了log(c+1)和c^2作为特征。作者把这些特征归一化到均值是0方差是1的正态分布中。

5.1 term ctr

和当前广告用相同bid term的广告的ctr,计算方式为:
f = {alpha * average_total(ctr) + N(ad_term) * ctr(ad_term)} / {alpha + N(ad_term)}

其中,average_total(ctr)是指训练集合中所有广告的总的ctr,N(ad_term)是指同当前广告具有相同term的广告的数目,ctr(ad_term)是指这些广告的平均ctr

5.2 related term ctr

对term ctr中的term进行扩展——字面意义上相关的term,如:red shoes 和 buy red shoes

5.3 ad特征

* 外观
* 是否吸引眼球
* 广告商信誉
* 广告页面质量
* 广告与query的相关性

作者还用了unigram特征:选择1w个在广告title和正文中经常出现的词语作为特征。值得注意的是,作者曾经用这些词的词频作为特征,来代替现在用的0-1特征,不过效果没有明显变化。

5.4 广告的specificity特性

基本假设是:如果一个广告是很明确的针对某种类别的,如:衣服、鞋、等等,则这个广告更加容易被用户点击;相反,如果一个广告所针对的类别、受众的人群很模糊,则不容易被用户点击。

作者的做法是:通过bid term来作为搜索query,进行搜索,在搜索结果中作文本分类(伪相关反馈,不求精度,用NB就可以),用各个类别组成的熵来反映这个广告是只针对某种特定的类别(熵很小)还是面向很多类别(熵比较大),将这个熵值作为特征加进去。需要注意的是,这个过程可以进行离线计算,不必在线计算。

5.5 外部数据特征

bid term在搜索引擎中返回的页面数量等等。因为这个数值差异比较大,作者没有进行通常意义上的归一化,而是把它bin化,即分成几个桶(20个),不同区间的数值映射到不同的桶中。


6. 试验和讨论

哪些特征比较好?或者说起到的作用比较大?
作者单独用某类特征,取得的提高如下:
(1)广告质量特征,提升12%;其中,广告词语的unigram特征就提升了10%
(2)广告specificity特性,提升9%
(3)搜索数据体征(外部数据特征)提升3%

注意:
1. 不能够根据特征的权重大小来决定特征的好坏,因为各个特征其实不是独立的
2. 某些特征(如:某些词)会对点击率起到很正面的作用,此时有两个用处:(1)当广告上买bid term的时候,给广告商推荐这些词;(2)当某些广告商恶意的购买这些词的时候,通过该广告商广告的ctr的剧烈变化,可以侦测到这个情况,从而进一步处理。

7. 未来工作

引入term的相关词特征


在数据集GAS_145中绘制卵巢转移的Nomogram(诺模图)用于预测卵巢转移的概率,可以按照以下步骤进行: 1. **数据预处理**: - 确保数据集中包含所有必要的变量和标签。 - 处理缺失值和异常值。 2. **特征选择**: - 选择与卵巢转移相关的特征,例如年龄、肿瘤大小、病理类型等。 - 可以使用统计方法或机器学习算法(如随机森林、逻辑回归)来评估特征的重要性。 3. **模型训练**: - 选择合适的模型进行训练,例如逻辑回归模型,因为逻辑回归模型可以输出概率值,适合用于绘制诺模图。 - 使用交叉验证方法评估模型的性能。 4. **计算预测概率**: - 使用训练好的模型对新样本进行预测,计算每个样本的卵巢转移概率。 5. **绘制诺模图**: - 使用R语言中的`rms`包或Python中的`pyNomo`库来绘制诺模图。 - 诺模图通常包括各个特征的得分、总分和对应的预测概率。 以下是一个使用R语言绘制诺模图的示例代码: ```R # 安装并加载必要的包 install.packages("rms") library(rms) # 假设数据集名为data,包含卵巢转移的标签和特征 data <- read.csv("GAS_145.csv") data$ovarian_metastasis <- as.factor(data$ovarian_metastasis) # 数据预处理 dd <- datadist(data) options(datadist = "dd") # 训练逻辑回归模型 fit <- lrm(ovarian_metastasis ~ age + tumor_size + pathology_type, data = data) # 绘制诺模图 nom <- nomogram(fit, fun = plogis, fun.at = seq(0.1, 0.9, by = 0.1), lp = FALSE) plot(nom) ``` 以下是一个使用Python绘制诺模图的示例代码: ```python # 安装并加载必要的库 # pip install pynomo import numpy as np import matplotlib.pyplot as plt from pynomo.nomographer import Nomographer # 定义诺模图的参数 type1 = { 'tag': 'risk', 'type': 'linear', 'x': np.linspace(0, 100, 100), 'func': lambda x: x, # 替换为实际的风险计算函数 'scale_type': 'linear', 'title': 'Risk Score' } type2 = { 'tag': 'probability', 'type': 'linear', 'x': np.linspace(0, 1, 100), 'func': lambda x: x, # 替换为实际的风险到概率的映射函数 'scale_type': 'linear', 'title': 'Probability of Ovarian Metastasis' } # 创建诺模图 nomograph = Nomographer([type1, type2]) # 绘制诺模图 nomograph.draw() # 显示图表 plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值