您的位置:首页 > 其它

广告计算中的AUC和ROC曲线

2016-12-14 15:00 405 查看
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 Researchers

Tom Fawcett in ReCall(2004)

附一段AUC计算的Python代码:

[python] view
plain copy

<span style="font-style: normal;">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</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)
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: