Python实现ROC和P-R曲线绘制以及AUC计算
本帖最后由 糖逗 于 2020-11-2 19:05 编辑参考书籍:《美团机器学习实战》
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#分类指标
class cat_plot():
def __init__(self, data, cat):
self.data = data
self.cat = cat
def Precision(self, threshold):
data["预测分类"] = self.data.iloc[:, 1].apply(lambda x : 1 if x > threshold else 0)
TP = np.sum((self.data["预测分类"] == 1) & (self.data["二分类"] == 1))
FP = np.sum((self.data["预测分类"] == 1) & (self.data["二分类"] == 0))
comput = TP / (TP + FP)
return comput
def Recall(self, threshold):
data["预测分类"] = self.data.iloc[:, 1].apply(lambda x : 1 if x > threshold else 0)
TP = np.sum((self.data["预测分类"] == 1) & (self.data["二分类"] == 1))
FN = np.sum((self.data["预测分类"] == 0) & (self.data["二分类"] == 0))
comput = TP / (TP + FN)
return comput
def FPR(self, threshold):
data["预测分类"] = self.data.iloc[:, 1].apply(lambda x : 1 if x > threshold else 0)
FP = np.sum((self.data["预测分类"] == 1) & (self.data["二分类"] == 0))
TN = np.sum((self.data["预测分类"] == 0) & (self.data["二分类"] == 1))
comput = FP / (FP + TN)
return comput
def plot(self):
point_x = []
point_y = []
if self.cat == "P-R":
for i in range(len(self.data)):
threshold = self.data.iloc
point_x.append(self.Recall(threshold))
point_y.append(self.Precision(threshold))
ax1 = sns.lineplot(x = point_x, y = point_y)
ax1.set_title("P-R")
plt.show()
elif self.cat == "ROC":
for i in range(len(self.data)):
threshold = self.data.iloc
point_x.append(self.FPR(threshold))
point_y.append(self.Recall(threshold))
ax2 = sns.lineplot(x = point_x, y = point_y)
ax2.set_title("ROC")
plt.show()
def AUC(self):
self.data = self.data.sort_values(by= "预测概率",ascending = True)
self.data["rank"] = self.data["预测概率"].rank(method='average')
M = np.sum(self.data["二分类"])
comput = np.sum(self.data.loc == 1, "rank"]) - (M+1)*M / 2
print(comput/(M * (len(self.data) - M)))
if __name__ == '__main__':
#数据
data = {"二分类" :,
"预测概率" :[0.99, 0.12, 0.29, 0.45, 0.93, 0.78, 0.89, 0.34, 0.78,
0.67, 0.99, 0.17, 0.88, 0.29, 0.72, 0.11, 0.89, 0.49, 0.34, 0.78,
0.11, 0.99]}
data = pd.DataFrame(data)
temp1 = cat_plot(data, "P-R")
temp2 = cat_plot(data, "ROC")
temp1.plot()
temp2.plot()
temp1.AUC()
{:10_327:} %matplotlib inline
这个是起什么作用, 运行报错, 直接删掉也可以运行.
不过运行后有以下揭示, 是怎么回事?
Warning (from warnings module):
File "D:/python/Lib/idlelib/0.py", line 17
comput = TP / (TP + FP)
RuntimeWarning: invalid value encountered in longlong_scalars Nate_2020 发表于 2020-11-2 15:08
%matplotlib inline
这个是起什么作用, 运行报错, 直接删掉也可以运行.
我是本地3.7的python可以运行。
%matplotlib inline是为了让图直接显示,我一般习惯性加上这句。 AUC参考链接:https://blog.csdn.net/lieyingkub99/article/details/81266664 糖逗 发表于 2020-11-2 19:03
我是本地3.7的python可以运行。
%matplotlib inline是为了让图直接显示,我一般习惯性加上这句。
哦, 我的是3.8的.
知不知道为什么用pyinstaller转成exe文件后不能运行,揭示RuntimeError:Could not find the matplotlib data files. Nate_2020 发表于 2020-11-4 08:50
哦, 我的是3.8的.
知不知道为什么用pyinstaller转成exe文件后不能运行,揭示RuntimeError:Could not find ...
你为啥不查一下百度呢,鱼油?百度能解决99%以上的问题。 糖逗 发表于 2020-11-4 09:22
你为啥不查一下百度呢,鱼油?百度能解决99%以上的问题。
找了,没什么好方法, 都是说要降低版本. 试了一圈, 结果把我的IDLE整坏了, 双击一闪而过, 没有窗口,没有揭示. 修复都没有用. 不知道怎么回事. Nate_2020 发表于 2020-11-4 10:24
找了,没什么好方法, 都是说要降低版本. 试了一圈, 结果把我的IDLE整坏了, 双击一闪而过, 没有窗口,没有揭 ...
摸摸头,没有遇到过这种情况{:10_266:} 糖逗 发表于 2020-11-4 10:47
摸摸头,没有遇到过这种情况
刚搞好了, 直接repair不行, 要删掉一部分文件再repair才好了. 谢谢了.
刚安装了pycharm, 试用这个看看. Nate_2020 发表于 2020-11-4 14:09
刚搞好了, 直接repair不行, 要删掉一部分文件再repair才好了. 谢谢了.
刚安装了pycharm, 试用这个看看.
我用的是Anaconda 糖逗 发表于 2020-11-4 14:14
我用的是Anaconda
你都会写那个程序, 应该是高手了, 怎么不用pycharm. Nate_2020 发表于 2020-11-4 15:07
你都会写那个程序, 应该是高手了, 怎么不用pycharm.
不是高手{:10_245:}
页:
[1]