ROC曲线的解释(很形象)

几个概念

这里写图片描述

场景

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

你可能感兴趣的:(机器学习,数据挖掘)