数据只有正类(或反类),如何画ROC曲线

数据只有正类,画ROC曲线

    • 数据只有正类(或反类),如何画ROC曲线

数据只有正类(或反类),如何画ROC曲线

我们在测试数据的时候,有时候会出现只有一类的数据集,如果这个时候用auc函数,则会出现:

ValueError: Only one class present in y_true. ROC AUC score is not
defined in that case

从定义出发,AUC的讲解参考下面文章,已经介绍的很清楚了,本文不再介绍。
AUC,ROC我看到的最透彻的讲解
看该文章第二节的例子,如果没有反类,我们可以直接设为0,即画预测概率的曲线,并计算与x轴围成的面积。

from numpy import trapz
import matplotlib.pyplot as plt

def pic_roc(y_pre,label='A'):
    data=list(y_pre) # 把y_pre变成list
    data.sort() # 将list从小到大排序
    auc = trapz(data, np.arange(0,1, 1/len(data)), dx=0.001) # 用trapz计算散点与x轴之间的距离,用1/len(data)进行归一化
    fig,ax = plt.subplots()  
    plt.plot(np.arange(0,1, 1/len(data)),data,label = label+'(AUC=%.4f)'%auc)
    plt.plot(np.arange(0,1, 0.01),np.arange(0,1, 0.01),'k:') # 对角线
    plt.legend(loc=4,fontsize='15')

比如这里我随便敲了几个数举例,y_pre如下,输入函数


y_pre = [0.005,0.36,0.102,0.108,0.25,0.36,0.88,0.9,0.87,0.95,0.854,0.785,0.76,0.81,0.8789,0.85,0.79,0.65,0.95,0.655,0.998,0.956]

pic_roc(y_pre,'test')

数据只有正类(或反类),如何画ROC曲线_第1张图片
因为数据的原因不太好看哈哈哈,但是大致是这样。

如果要一次画好几条,只需要把fig,ax = plt.subplots() 在函数里删去,提到最前面就行了。

fig,ax = plt.subplots() 
pic_roc(pre_test0,'A')
pic_roc(pre_test1,'B')
pic_roc(pre_test2,'C')

数据只有正类(或反类),如何画ROC曲线_第2张图片
随便找了个数据集用xgboost跑一下,真实的测试结果好看多了。

你可能感兴趣的:(python)