非均衡分类问题

非均衡分类问题:

1、样本正反例数量差距大;

2、不同类别的分类代价不相等。

除了分类错误率,还有以下分类性能度量指标:正确率、召回率和ROC曲线

正确率:预测为正例的样本中真正正例的比例。

召回率:预测为正例的真实正例占所有真实正例的比例。

正确率和召回率很难同时达到很高。

ROC曲线:横轴为伪正例的比例(假阳率),纵轴为真正例的比例(真阳率)。

def plotROC(predStrengths,classLabels):
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    cur = (1.0, 1.0) 
    ySum = 0.0  # variable to calculate AUC
    numPosClas = sum(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)
    # print(type(sortedIndicies))
    # print(sortedIndicies.tolist())
    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='y')
        cur = (cur[0] - delX, cur[1] - delY)
    ax.plot([0, 1], [0, 1], 'r--')
    plt.xlabel('假阳率')
    plt.ylabel('真阳率')
    plt.title('AdaBoost马疝病检测系统的ROC曲线')
    ax.axis([0, 1, 0, 1])
    plt.show()
    print("the Area Under the Curve is: ", ySum * xStep)

 测试输出:

if __name__=='__main__':
    dataArr,labelArr=loadDataSet('horseColicTraining2.txt')
    classifyArray,aggClassEst=adaBoostTrainDS(dataArr,labelArr,10)
    plotROC(aggClassEst.T,labelArr)

 

the Area Under the Curve is:  0.8582969635063604

 

posted @ 2018-11-07 22:18  我的下铺刚田武  阅读(159)  评论(0编辑  收藏  举报