实验室规定,不能调库,但是我还是调了一个求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,目前最高值,有待提高