机器学习基础:AUC

AUC简介

  • AUC是Area Under Curve的首字母缩写,这里的Curve指的就是ROC曲线,AUC就是ROC曲线下面的面积(下面会介绍)
  • AUC是模型评价指标,只能评价二分类模型,其他的二分类模型指标有logloss,precision,accuracy等

为什么要用AUC

  • 因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。

  • 在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),此时如果用precision/recall等指标的话,数据分布的波动就会出现预测的较大波动

  • AUC考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价

  • 下图是ROC曲线和Precision-Recall曲线的对比,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。

  • 可以看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。

  • 机器学习基础:AUC_第1张图片
    image-20181227154813967

AUC计算

  • 混淆矩阵

    • 混淆矩阵中有着Positive、Negative、True、False的概念,其意义如下:

      • 预测类别为1的为Positive(阳性),预测类别为0的为Negative(阴性)
      • 预测正确的为True(真),预测错误的为False(伪)
      • 机器学习基础:AUC_第2张图片
        image-20181227155717914
    • True Positive Rate(TPR, 真阳率)

      • 所有真实类别为1的样本中,预测类别为1的比例
      • TPR = TP/(TP+FN)
    • False Positive Rate(FPR, 伪阳率)

      • 所有真实类别为0的样本中,预测类别为1的比例
      • FPR = FP/(FP+TN)
  • ROC

    • ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一个画在二维平面上的曲线——ROC 曲线。平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)
    • ROC曲线是一系列threshold下的(FPR,TPR)数值点的连线。此时的threshold的取值分别为测试数据集中各样本的预测概率,但取各个概率的顺序是从大到小的。
    • 机器学习基础:AUC_第3张图片
      image-20181227160935865
  • AUC计算

    • 步骤:
      • 按预测概率从大到小的顺序排序
      • 机器学习基础:AUC_第4张图片
        image-20181227163201022
      • 计算全部概率值下的FPR和TPR,得到点(FPR, TPR)
      • 机器学习基础:AUC_第5张图片
        image-20181227163938631
      • 画出最终的ROC曲线和计算AUC值(即面积)
        • 可以转化为每个小矩阵来计算
        • 机器学习基础:AUC_第6张图片
          image-20181227164226796
    • 举例:
      • 在反欺诈场景,设非欺诈类样本为正例,负例占比很少(假设0.1%),如果使用准确率评估,把所有的样本预测为正例便可以获得99.9%的准确率。但是如果使用AUC,把所有样本预测为正例,TPRate和FPRate同时为1,AUC仅为0.5,成功规避了样本不均匀带来的问题。

python实现

  • 数据准备
    • 假设我们现在有个测试数据文件 data.txt,格式为 score, pos_label, neg_label
      • 0.99,1,0
      • 0.88,1,0
      • ...
      • 0.33,0,1
  • 代码实现
    #! -*- coding=utf-8 -*-
    import pylab as pl
    from math import log,exp,sqrt
    
    evaluate_result="data.txt"
    db = [] #[score,nonclk,clk]
    pos, neg = 0, 0
    with open(evaluate_result,'r') as fs:
            for line in fs:
                    clk,score = line.strip().split(' ')
                    clk = int(clk)
                    nonclk = 1-clk
                    score = float(score)
                    db.append([score,nonclk,clk])
                    pos += clk
                    neg += nonclk
    
    db = sorted(db, key=lambda x:x[0], reverse=True)
    
    #计算ROC坐标点
    xy_arr = []
    tp, fp = 0., 0.
    for i in range(len(db)):
            tp += db[i][2]
            fp += db[i][1]
            xy_arr.append([fp/neg,tp/pos])
    
    #计算曲线下面积
    auc = 0.
    prev_x = 0
    for x,y in xy_arr:
            if x != prev_x:
                    auc += (x - prev_x) * y
                    prev_x = x
    print "the auc is %s."%auc
    
    x = [_v[0] for _v in xy_arr]
    y = [_v[1] for _v in xy_arr]
    pl.title("ROC curve of %s (AUC = %.4f)" % ('svm',auc))
    pl.xlabel("False Positive Rate")
    pl.ylabel("True Positive Rate")
    pl.plot(x, y)# use pylab to plot x and y
    pl.show()# show the plot on the screen
    

参考文献

  • 如何理解机器学习和统计中的AUC?
  • 为什么使用ROC?什么是AUC

你可能感兴趣的:(机器学习基础:AUC)