学习笔记:使用python画Roc图像

实验室规定,不能调库,但是我还是调了一个求Auc的库函数。

这是调用的几个库,配置在我的另一个博客https://blog.csdn.net/folk_/article/details/80028997

from numpy import *
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc  ###计算roc和auc

画Roc曲线需要用到的参数介绍,在我的另一篇博客里https://blog.csdn.net/folk_/article/details/80280059

这是画Roc曲线,将阈值划分成了100份

def drawRoc(weights,testLabels,testSet):
    testSet= mat(testSet)   #list转换成矩阵类型
    m, n = shape(testSet)   #训练集的行数和特征个数
    FPR = zeros((101,1))    #1-specificity
    TPR = zeros((101,1))    #sensitivity
    probability = zeros((m,1))#每个样本的概率
    for j in range(101):      #求Roc图像的每一个点
        TP = 0  # true positive
        FN = 0  # ture negative
        FP = 0  # false positive
        TN = 0  # true negative
        threshold = float(j / 100.0)
        for i in range(m):
            dataSet = testSet[i]
            dataSet = dataSet.transpose()
            probability[i] = sigmoid(dot(weights,dataSet))#求每个样本的概率
            #print('pro = ',probability[i])
            if probability[i] > threshold:
                value = 1
            else:
                value = 0
            if abs(testLabels[i]-1.0)<1e-7 and abs(value-1.0)<1e-7:#true positive
                TP = TP + 1
            elif abs(testLabels[i]-1.0)<1e-7 and abs(value-0.0)<1e-7:#false positive
                FN = FN + 1
            elif abs(testLabels[i]-0.0)<1e-7 and abs(value-0.0)<1e-7:#true negative
                TN = TN + 1
            elif abs(testLabels[i]-0.0)<1e-7 and abs(value-1.0)<1e-7:#false positive
                FP = FP + 1
        TPR[j] = float(TP/(TP+FN))
        FPR[j] = float(FP/(TN+FP))
    # print(TPR)
    # print(FPR)
    roc_auc = auc(FPR, TPR)
    print('Auc=',roc_auc)
    plt.plot([0, 1], [0, 1], '--', color=(0 , 0, 1))#画对角线
    plt.plot([0, 1], [0, 0], '-', color=(0, 0, 1))#画x轴
    plt.plot([1, 1], [0, 1], '-', color=(0, 0, 1))#画边界
    plt.plot(FPR, TPR, "b", linewidth=1)#在当前绘图对象绘图,蓝线
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic curve')
    plt.show()#显示图像

其实画Roc也是可以调库的,但能手写还是手写吧。

但是,还是能调库还是调库吧(#滑稽)

贴一张我画出来的roc曲线。 auc = 0.8463,目前最高值,有待提高

                    

猜你喜欢

转载自blog.csdn.net/folk_/article/details/80283463