分类---非均衡分类问题

再分类问题中,事实上在大多数情况下不同类别的分类代价不同,比如对于人,我们不能仅仅凭分类器预测有癌症,就判定该人必会死亡,这样的代价过大。所以本节考察一种新的分类器性能度量方法。
1 正确率 召回率和ROC曲线
一般地, 大多分类器都是以错误率来衡量分类器任务的成功程度。错误率是指 所有测试样例中分类错误的样本比例。实际上,这样的度量掩盖了样例如何被分错的事实。在机器学习中,混淆矩阵可以很好的帮助我们了解分类中的错误。如果混淆矩阵非对角矩阵元素均为0,就可以得到完美的分类器。
对于一个简单的二分类问题:

真实结果\预测结果+1-1
+1真正例(TP)伪反例(FN)
-1伪正例(FP)真反例(TN)

正确率 = TPTP+FP : 预测为正例的样本中真正样例的比例。
召回率 = TPTP+FN : 预测为正例的真实正例占所有真实正例的比例。
在召回率很大的分类器中,真正判错的正例数目并不多。
高正确率或高召回率的分类器,很难去同时保证两者成立,所以构建一个同时使正确率和召回率最大分类器是具有挑战性的。
ROC曲线(操作者特征 receiver operating characteristic)::当阈值变化时,假阳率(FPFP+TN)和真阳率(TPTP+FN)的变化情况。
ROC曲线不但可以用来比较分类器,还可以基于成本效益分析来做出决策。理想情况下,最佳的分类器应该是在假阳率很低的同时获得了很高的真阳率。
对不同的ROC曲线进行比较的一个指标是曲线下面积(Area Unser the Curve, AUC) AUC给出的是分类器的平均性能值,当然它并不能完全代替对整条曲线的观察。一个完美的分类器AUC为1.0,而随机猜想的AUC则为0.5.
如何去画出ROC曲线呢???
当然,我们需要提供给每个样例被判定为阳性或者阴性的可信程度值,而大多分类器都可以做到这一点。为了创建ROC曲线,首先将分类样例按照其预测强度排序(所谓的预测强度是指:比如AdaBoost中输入到sign()函数中的值),先从排名最低的样例开始,所有排名更低的样例都被判定为反例,而所有排名更高的样例都被判定为正例。 ,该情况对应点<1.0, 1.0>,然后将其移到排名低的样例中,如果该样例属于正例,那么对真阳率进行修改,如果该样例属于反例,那么对假阳率进行修改。

def plotROC(predStrengths, classLabels):
    # 输入: predStrengths : 一个Numpy数组或者一个行向量组成的矩阵 ,代表的是分类器的预测强度。比如AdaBoost中的aggClassEst
    # classLabels 真实标签
    import matplotlib.pyplot as plt  # 载入画图工具包
    cur = (1.0, 1.0) # 
    ySum = 0.0  #  用于计算AUC的值
    numPosClas = sum(array(classLabels)==1.0) #  统计样本中正例的个数
    yStep = 1/float(numPosClas) # 在y坐标轴上的步进数目。
    xStep = 1/float(len(classLabels) - numPosClas)
    sortedInd = predStrengths.argsort()  # 数组排序 argsort函数返回的是数组值从小到大的索引值,所以我们从点<1.0, 1.0>开始绘图 直到<0, 0>.
    #### 开始画图
    fig = plt.figure()
    fig.clf() # 清空绘图区
    ax = plt.subplot(111)
    for index in sortedInd.tolist()[0]:  # tolist() 将矩阵转换为list
        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,1], [0 ,1], 'b--')  #  以第一个参数值为横轴,第二个参数值为纵轴
    ax.axis([-0.1, 1, 0, 1.1])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('ROC curve')
    plt.show()
    print('the AUC is :', ySum*xStep)

:为了计算AUC,我们需要对多个小矩形面积进行累加,这些小矩形的宽度是xStep,因此先对所有矩形的高度进行累加。所有高度的和(ySum)随着x轴的每次移动逐次增加。
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值