您的位置:首页 > 其它

ROC曲线的绘制

2015-07-07 14:34 85 查看

几个概念



场景

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

f(x)=∑m=1MαmGm(x)f(x)=\sum_{m=1}^{M}\alpha_mG_m(x)

最终的分类器

G(x)=sign(f(x))=sign(∑m=1MαmGm(x))G(x)=sign(f(x))=sign\left(\sum_{m=1}^{M}\alpha_mG_m(x)\right)

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

接下来基于这两个数据做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')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: