ROC曲线的绘制

标签: ROC
868人阅读 评论(0) 收藏 举报
分类:

几个概念

这里写图片描述

场景

AdaBoost的基本分类器的线性组合

f(x)=m=1MαmGm(x)

最终的分类器

G(x)=sign(f(x))=sign(m=1MαmGm(x))

这里已知 {f(xi)|i=1,2,,N}{labeli|i=1,2,,N},前者是每个样本xi对应的基本分类器的输出的加权组合,后者是对应的标签数据。

接下来基于这两个数据做ROC曲线图。

作图

这里写图片描述

绘图代码:

#predStrengths 和classLabels都是299个元素的ndarray对象。
ySum = 0.0 #variable to calculate AUC
N = classLabels.shape[0] #总样本个数
numPosClas = np.sum(classLabels==1.0) #样本中正例的个数
yStep = 1.0/numPosClas;  #真阳率(在纵轴上)的分母是正样本的个数
xStep = 1.0/(N-numPosClas) #假阳率(在横轴上)的分母是负样本的个数
srtidxs = predStrengths.argsort()# 从小到大排列的序号

fig = plt.figure()
fig.clf()
ax = plt.subplot(111)

cur = (1.0,1.0) #左上顶角坐标,全部样本都判为正,真阳率和假阳率都为1
for idx in srtidxs: 
    #从值最小到值最大,作为判断门限,将大于该值的样本判为正,将小于等于该值的样本判为负
    if classLabels[idx] == 1.0: # 样本为正,影响的是真阳率,判错了,所以真阳率要减小一个刻度
        delX = 0; 
        delY = yStep;
    else: # 样本为负,影响的是假阳率,盘对了,故假阳率要减小一个刻度
        delX = xStep; 
        delY = 0;

        #每次x轴(即假阳率)调整时,将ySum加上当前的y轴刻度值,
        ySum += cur[1] 

    ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY], c='b')
    cur = (cur[0]-delX,cur[1]-delY) #更新坐标,从右上角向左下角画的曲线    
ax.plot([0,1],[0,1],'b--') # 画一条对角线,从(0,0)到(1,1)

auc = np.str( "%.4f"%(ySum*xStep)) #曲线下的面积
plt.xlabel(u'假阳率',{'fontname':'STFangsong','fontsize':15}); 
plt.ylabel(u'真阳率',{'fontname':'STFangsong','fontsize':15})
plt.title(u'ROC曲线'+'(AUC = ('+auc+')',{'fontname':'STFangsong','fontsize':15})

ax.axis([0,1,0,1]) 
fig.savefig('roc.png',dpi=300,bbox_inches='tight')
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:486497次
    • 积分:6234
    • 等级:
    • 排名:第3974名
    • 原创:157篇
    • 转载:2篇
    • 译文:0篇
    • 评论:122条
    博客专栏
    Snapshot
    • x
    • x
    • x
    • x
    • x
    • x