T2、正确率、精准率、召回率以及ROC曲线的理解

引言:在机器学习实战中(Machine Learning),处理分类问题时除了通过训练误差、测试误差去评价分类器的性能之外;通常情况下我们需要其他分类性能指标:正确率,召回率以及ROC曲线等进行评价分类器的性能。首先,通过引用一个二分类问题的混淆矩阵(confusion matrix),帮助我们更好地了解分类中的错误。 

表一 一个二分类问题的混淆矩阵,其中输出不同类别的标签
   预测结果
真实结果   +1 -1
+1 真正例(TP) 伪反例(FN)
-1 伪反例(FP) 真反例(TN)

在分类中,当某个类别的重要性高于其他类别时,我们就可以利用上述定义来定义出多个比错误率更好的新指标。

第一个指标:正确率(Precision),它等于TP/(TP + FP):给出的预测为正例的样本中真正正例的比例;

第二个指标:召回率(Recall),它等于TP/(TP + FN):预测为正例的真实正例占所有真实正例的比例。

 

T2、正确率、精准率、召回率以及ROC曲线的理解

上图为马疝病监测系统的ROC曲线, 横轴是假阳率=FP/(FP + TN),纵轴是真阳率=TP/(TP + FN)。ROC曲线给出的是当阈值变化时假阳率和真阳率的变化情况。在理想情况下,最佳分类器应该尽可能处于左上角,这就意味着分类器在假阳率很低的同时获得了很高的真阳率。

对于不同的ROC曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve,AUC)。AUC给出的是平均性能值,当然它并不能完全替代对整条曲线的观察,一条完美的分类器的AUC为1.0,而随机猜测的AUC为0.5。

ROC曲线的绘制及AUC计算函数:如下给出的是对应的程序:

def plotROC(predStrengths, classLabels):
    import matplotlib.pyplot as plt
    cur = (1.0, 1.0)
    ySum = 0.0
    numPosClas = sum(np.array(classLabels) == 1.0)
    yStep = 1/float(numPosClas)
    xStep = 1/float(len(classLabels) - numPosClas)
    sortedIndicies = predStrengths.argsort()
    fig = plt.figure()
    fig.clf()
    ax = plt.subplot(111)
    for index in sortedIndicies.tolist()[0]:
        if classLabels[index] == 1.0:
            delX = 0; delY = yStep;
        else:
            delX = xStep; delY = 0;
            ySum += cur[1]
        ax.plot([cur[0], cur[0] - delX], [cur[1], cur[1] - delY], c='b')
        cur = (cur[0] -delX, cur[1] - delY)
    ax.plot([0, 0], [0, 1], 'b--')
    plt.xlabel('False Positive Rate'); plt.ylabel('True Positive Rate')
    plt.title('ROC curve for AdaBoost Horse Colic Detection System')
    ax.axis([0,1,0,1])
    plt.show()
    print("the Area Under the Curve is: ", ySum*xStep)