我们在测试数据的时候,有时候会出现只有一类的数据集,如果这个时候用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')
如果要一次画好几条,只需要把fig,ax = plt.subplots()
在函数里删去,提到最前面就行了。
fig,ax = plt.subplots()
pic_roc(pre_test0,'A')
pic_roc(pre_test1,'B')
pic_roc(pre_test2,'C')