糖逗 发表于 2020-11-2 13:26:49

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()
   

糖逗 发表于 2020-11-2 13:27:20

{:10_327:}

Nate_2020 发表于 2020-11-2 15:08:44

%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

糖逗 发表于 2020-11-2 19:03:34

Nate_2020 发表于 2020-11-2 15:08
%matplotlib inline
这个是起什么作用, 运行报错, 直接删掉也可以运行.



我是本地3.7的python可以运行。
%matplotlib inline是为了让图直接显示,我一般习惯性加上这句。

糖逗 发表于 2020-11-2 19:05:19

AUC参考链接:https://blog.csdn.net/lieyingkub99/article/details/81266664

Nate_2020 发表于 2020-11-4 08:50:08

糖逗 发表于 2020-11-2 19:03
我是本地3.7的python可以运行。
%matplotlib inline是为了让图直接显示,我一般习惯性加上这句。

哦, 我的是3.8的.
知不知道为什么用pyinstaller转成exe文件后不能运行,揭示RuntimeError:Could not find the matplotlib data files.

糖逗 发表于 2020-11-4 09:22:29

Nate_2020 发表于 2020-11-4 08:50
哦, 我的是3.8的.
知不知道为什么用pyinstaller转成exe文件后不能运行,揭示RuntimeError:Could not find ...

你为啥不查一下百度呢,鱼油?百度能解决99%以上的问题。

Nate_2020 发表于 2020-11-4 10:24:04

糖逗 发表于 2020-11-4 09:22
你为啥不查一下百度呢,鱼油?百度能解决99%以上的问题。

找了,没什么好方法, 都是说要降低版本. 试了一圈, 结果把我的IDLE整坏了, 双击一闪而过, 没有窗口,没有揭示. 修复都没有用. 不知道怎么回事.

糖逗 发表于 2020-11-4 10:47:48

Nate_2020 发表于 2020-11-4 10:24
找了,没什么好方法, 都是说要降低版本. 试了一圈, 结果把我的IDLE整坏了, 双击一闪而过, 没有窗口,没有揭 ...

摸摸头,没有遇到过这种情况{:10_266:}

Nate_2020 发表于 2020-11-4 14:09:12

糖逗 发表于 2020-11-4 10:47
摸摸头,没有遇到过这种情况

刚搞好了, 直接repair不行, 要删掉一部分文件再repair才好了. 谢谢了.
刚安装了pycharm, 试用这个看看.

糖逗 发表于 2020-11-4 14:14:20

Nate_2020 发表于 2020-11-4 14:09
刚搞好了, 直接repair不行, 要删掉一部分文件再repair才好了. 谢谢了.
刚安装了pycharm, 试用这个看看.

我用的是Anaconda

Nate_2020 发表于 2020-11-4 15:07:14

糖逗 发表于 2020-11-4 14:14
我用的是Anaconda

你都会写那个程序, 应该是高手了, 怎么不用pycharm.

糖逗 发表于 2020-11-4 15:16:26

Nate_2020 发表于 2020-11-4 15:07
你都会写那个程序, 应该是高手了, 怎么不用pycharm.

不是高手{:10_245:}
页: [1]
查看完整版本: Python实现ROC和P-R曲线绘制以及AUC计算