乐趣区

关于python:Python多分类问题pr曲线绘制含代码

import numpy as np
import matplotlib.pyplot as plt
score_path = “./pr_curve.txt” # 文件门路
with open(score_path, ‘r’) as f:

files = f.readlines()      # 读取文件 

lis_all = []
for file in files:

_, _, s1, s2, s3 = file.strip().split(" ")
lis_all.append(s1)
lis_all.append(s2)
lis_all.append(s3)

lis_order = sorted(set(lis_all)) # 记录所有得分状况,并去重从小到大排序,寻找各个阈值点
micro_precis = []
micro_recall = []
for i in lis_order:

true_p0 = 0         # 真阳
true_n0 = 0         # 真阴
false_p0 = 0        # 假阳
false_n0 = 0        # 假阴
true_p1 = 0
true_n1 = 0
false_p1 = 0
false_n1 = 0
true_p2 = 0
true_n2 = 0
false_p2 = 0
false_n2 = 0
for file in files:
    cls, pd, n0, n1, n2 = file.strip().split(" ")       # 别离计算比拟各个类别的得分,离开计算,各自为二分类,# 最初求均匀,得出宏 pr
    if float(n0) >= float(i) and cls == '0':               # 遍历所有样本,第 0 类为正样本,其余类为负样本,true_p0 = true_p0 + 1                              # 大于等于阈值,并且实在为正样本,即为真阳,elif float(n0) >= float(i) and cls != '0':             # 大于等于阈值,实在为负样本,即为假阳;false_p0 = false_p0 + 1                            # 小于阈值,实在为正样本,即为假阴
    elif float(n0) < float(i) and cls == '0':
        false_n0 = false_n0 + 1
    if float(n1) >= float(i) and cls == '1':                # 遍历所有样本,第 1 类为正样本,其余类为负样本
        true_p1 = true_p1 + 1
    elif float(n1) >= float(i) and cls != '1':
        false_p1 = false_p1 + 1
    elif float(n1) < float(i) and cls == '1':
        false_n1 = false_n1 + 1
    if float(n2) >= float(i) and cls == '2':                # 遍历所有样本,第 2 类为正样本,其余类为负样本
        true_p2 = true_p2 + 1
    elif float(n2) >= float(i) and cls != '2':
        false_p2 = false_p2 + 1
    elif float(n2) < float(i) and cls == '2':
        false_n2 = false_n2 + 1
prec0 = (true_p0+0.00000000001) / (true_p0 + false_p0 + 0.000000000001)      # 计算各类别的准确率,小数避免分母为 0
prec1 =[Skrill 下载](https://www.gendan5.com/wallet/Skrill.html) (true_p1+0.00000000001) / (true_p1 + false_p1 + 0.000000000001)
prec2 = (true_p2+0.00000000001) / (true_p2 + false_p2 + 0.000000000001)
recall0 = (true_p0+0.00000000001)/(true_p0+false_n0 + 0.000000000001)        # 计算各类别的召回率,小数避免分母为 0
recall1 = (true_p1+0.00000000001) / (true_p1 + false_n1+0.000000000001)
recall2 = (true_p2+0.00000000001)/(true_p2+false_n2 + 0.00000000001)
precision = (prec0 + prec1 + prec2)/3
recall = (recall0 + recall1 + recall2)/3               # 多分类求得均匀精确度和均匀召回率,即宏 micro_pr
micro_precis.append(precision)
micro_recall.append(recall)

micro_precis.append(1)
micro_recall.append(0)
print(micro_precis)
print(micro_recall)
x = np.array(micro_recall)
y = np.array(micro_precis)
plt.figure()
plt.xlim([-0.01, 1.01])
plt.ylim([-0.01, 1.01])
plt.xlabel(‘recall’)
plt.ylabel(‘precision’)
plt.title(‘PR curve’)
plt.plot(x, y)
plt.show()

退出移动版