AUC的英文全称为 Area Under Curve,AUC的意思是曲线下面积,在计算广告学中,AUC经常用于统计ROC曲线的面积,用来量化评估广告的CTR质量。这里再解释一下ROC的含义,ROC全称为:Receiver Operating Characteristics (ROC) graphs ROC经常被用于模式识别、分类器的结果展现和性能评测。传统的ROC曲线多用于医学检测领域,2000年以后,在机器学习、数据挖掘领域开始有使用。
因为在一些应用场景中,accuracy这样传统的度量标准很难恰当的反应分类器的效果。例如:测试样本中有A类样本90个,B 类样本10个。分类器C1把所有的测试样本都分成了A类,分类器C2把A类的90个样本分对了70个,B类的10个样本分对了5个。则C1的分类精度为 90%,C2的分类精度为75%。但是,显然C2更有用些。另外,在一些分类问题中犯不同的错误代价是不同的(cost sensitive learning)。这样,默认0.5为分类阈值的传统做法也显得不恰当了。这也被称为样本在不同类别上的不均衡分布问题(class distribution imbalance problem)。
ROC是二维平面上的曲线,平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR),对某个待评估的数据挖掘方法而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,分类器就可以映射成ROC平面上的一个点,这些点构成一个阶梯状的曲线,计算的AUC也就是这些阶梯下面的面积之和
在广告中,根据CTR预测的高低,将最有可能被用户点击的广告按顺序依次展现,根据点击反馈,可以生成ROC曲线(y方向,点击+1;x方向,未点击+1),很明显,用户点击的越多,被点击的广告排序越靠前,ROC曲线下的面积越大,即AUC越大,则表明广告投放的效果越好,也就是CTR预测越准确
(陈运文)
在具体应用AUC作为Metrics方法时,又有很多变化,如果要深入了解,以下三篇文献应该很有帮助:
An introduction to ROC analysis
T Fawcettin Pattern Recognition Letters (2006)
A critical analysis of variants of the AUC
Stijn Vanderlooy, Eyke Hüllermeierin Machine Learning (2008)
ROC Graphs:Notes and Practical Considerations for ResearchersTom Fawcett in ReCall(2004)附一段AUC计算的Python代码:def scoreClickAUC(num_clicks, num_impressions, predicted_ctr):
"""
Calculates the area under the ROC curve (AUC) for click rates
Parameters
----------
num_clicks : a list containing the number of clicks
num_impressions : a list containing the number of impressions
predicted_ctr : a list containing the predicted click-through rates
Returns
-------
auc : the area under the ROC curve (AUC) for click rates
"""
i_sorted = sorted(range(len(predicted_ctr)),key=lambda i: predicted_ctr[i],
reverse=True)
auc_temp = 0.0
click_sum = 0.0
old_click_sum = 0.0
no_click = 0.0
no_click_sum = 0.0
# treat all instances with the same predicted_ctr as coming from the
# same bucket
last_ctr = predicted_ctr[i_sorted[0]] + 1.0
for i in range(len(predicted_ctr)):
if last_ctr != predicted_ctr[i_sorted[i]]:
auc_temp += (click_sum+old_click_sum) * no_click / 2.0
old_click_sum = click_sum
no_click = 0.0
last_ctr = predicted_ctr[i_sorted[i]]
no_click += num_impressions[i_sorted[i]] - num_clicks[i_sorted[i]]
no_click_sum += num_impressions[i_sorted[i]] - num_clicks[i_sorted[i]]
click_sum += num_clicks[i_sorted[i]]
auc_temp += (click_sum+old_click_sum) * no_click / 2.0
auc = auc_temp / (click_sum * no_click_sum)
return auc
def main():
import sys
if len(sys.argv) != 3:
print("Usage: python scoreKDD.py solution_file.csv submission_file.csv")
sys.exit(2)
num_clicks, num_impressions = read_solution_file(sys.argv[1])
predicted_ctr = read_submission_file(sys.argv[2])
auc = scoreClickAUC(num_clicks, num_impressions, predicted_ctr)
print("AUC : %f" % auc)