排名作为阈值绘制ROC曲线
有时我们的结果需要按照最终标签排名作出ROC曲线,如下代码那么我们只需要预测得分和真实标签值。
a.将真实标签按照得分排序
b.排序后的标签按照排名作为阈值,依次从1到最后,每个阈值得到一次FPR和TPR.
大家可以比较一下我写的对不对,如有问题欢迎指出. 代码片
.
import matplotlib.pyplot as plt
class Rankauc:
def __init__(self, score_list, label_list):
self.score_list = score_list
self.label_list = label_list
self.len = len(label_list)
self.F_num = label_list.count(0)
self.T_num = label_list.count(1)
def binding_sort(self):
"""
根据得分大小,将标签排序
:return: 标签排名顺序
"""
zipped = zip(self.score_list, self.label_list)
sort_zipped = sorted(zipped, key=lambda x: x[0], reverse=True) # 按照 x[0] 排序
result = zip(*sort_zipped)
score, label_rank = [list(x) for x in result]
return label_rank
def r_auc(self):
TPR = []
FPR = []
for i in range(self.len):
tp = (self.binding_sort()[:i+1]).count(1)
TPR.append(tp / self.T_num) # 真阳性率
fp = (self.binding_sort()[:i+1]).count(0)
FPR.append(fp / self.F_num) # 加阳性率
plt.plot(FPR, TPR)
plt.show()
return TPR, FPR
if __name__ == '__main__':
A = [0.3, 0.5, 0.9, 0.8, 0.4, 0.6, 0.8, 0.6, 0.7, 0.8, 0.9, 0.75, 0.85]
B = [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
m = Rankauc(A, B)
print(m.binding_sort())
print(m.r_auc())