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代码:[python] view plain copy
- <span style="font-style: normal;">def scoreClickAUC(num_clicks, num_impressions, predicted_ctr):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
-
- 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</span>
[python] view plain copy
- 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)