首页 > 编程知识 正文

roc曲线数据处理,roc曲线的auc效能比较

时间:2023-05-03 06:41:35 阅读:244562 作者:4619

机器学习实战——ROC曲线和AUC值 1.查准率(Precision)和召回率(Recall)2.ROC曲线3.AUC值
近期在做机器学习实战上的项目时,讲解roc部分的代码没有理解,查阅相关博客资料后有所感悟理解,做下笔记记录一下。

1.查准率(Precision)和召回率(Recall)

通过一个例子来理解一下:我们现在需要判断一群病人中是否患有癌症。

上表中1表示患有癌症,0则不患有癌症。“True Positive”表示我们预测病人患有癌症,而事实是该病人确实有癌症的人数;“False Negative”表示我们预测病人没有癌症,但是事实上他却凡有癌症的人数;其他以此类推。
下面我用TP简写代表“True Positive”,其他也是。
接下来我们来看看查准率和召回率的定义:

1. 查准率(Precision) = TP/(TP+FP)
它表示的含义就是对于所有我们预测患有癌症的病人,到底有多大比例的病人是真正患有癌症的。

2. 召回率(Recall) = TP/(TP+FN)
召回率的含义是对于所有患有癌症的病人,有多少人我们可以正确的告诉他们需要治疗(即告诉他们患有癌症)。

上表也称为混淆矩阵(confusion matrix)。

2.ROC曲线

先看到下图:

横轴表示假阳率(=FP/(TN+FP)),纵轴表示真阳率(=TP/(TP+FN))。
其中假阳率可以理解为对于所有没有患癌症的病人,我们却告诉病人患有癌症的比例;真阳率就是我们的召回率。
理想情况是假阳率很低的同时有很高的真阳率:很高的真阳率即对于那些患有癌症的病人我们都告诉他们患有癌症(避免了错过治疗);很低的假阳率即对于那些正常的病人我们正确告诉他们没有患癌症(如果错误告诉,可能会给病人带来极大的心理负担)。

如何绘制ROC曲线?
例如对于adaboost分类器,我们得到了每个样本的预测值的概率,通常是设置阈值为0.5,大于等于0.5的判定为1(正例),小于0.5的则为0(反例),然后我们便可以结合真实值计算出真阳率和假阳率,便得出了其中的一点。然后我们再通过设置不同的阈值得到多个点,即可绘制出我们的ROC曲线。
具体流程:
1.我们先通过分类器得出每个样本的预测强度(即概率大小)。
2.然后我们将所有样本按概率大小从小到大排序。
3.接着循环从最小的开始,取其值为我们的阈值,比阈值小的都预测为反例,比阈值大的预测为正例。因为我们每次都是从小到大遍历去取一个概率值作为阈值,相当于把这个样本从原来预测1变为预测0,然后结合真实值,如果真实值为1,我们以前预测为反例1现在预测0,则TP-1;如果真实值为0,我们以前预测为反例1,则FP-1

看代码:

#cur[0]为真阳率,cur[1]为假阳率,初始都设为1cur = (1.0,1.0) ySum = 0.0#得到总的真实值为1的正例数目numPosClass = sum(array(classLabels)==1.0)#步长,真阳率每次分子减一(上面就是求得总的整理的数量,因此取倒数就行),横轴同理 yStep = 1/float(numPosClass) xStep = 1/float(len(classLabels)-numPosClass) #predStrengths是一个向量,包含每一个样本的预测强度,这里我们从小到大排序 #argsort()返回的是排序后每个元素在数组中的下标:例. [23,24,10,56,78]得到[2 0 1 3 4] sortedIndices = predStrengths.argsort() #构建画笔 fig = plt.figure() fig.clf() ax = plt.subplot(111) #从最小的概率值开始遍历 for index in sortedIndices.tolist()[0]: #进行判断,如果真实值为1,在前面的循环中,也是将其预测为1,这轮循环则 #将其预测为0(因为阈值取该样本的概率值),也就是TP-1,真阳率的分子减一 if classLabels[index] == 1.0: delX = 0; delY = yStep else: delX = xStep; delY = 0 ySum += cur[1] ax.plot([cur[0], cur[0] - delX], [cur[1], cur[1] - delY], c='b') #更新当前点,即 cur = (cur[0] - delX, cur[1] - delY) 3.AUC值

AUC,Area Under the Curve,顾名思义AUC值使我们曲线线下所围成的面积。AUC给出的是分类器的平均性能值。

结合代码:
看到上面的代码,我们计算曲线围成的面积其实就是对多个小矩形进行累加,小矩形的宽度就是xStep,然后只需要将每个矩形的高度累加起来即可,只有当我们进行横轴的移动时才累加高度,看到上面因为纵轴减小时,横轴没变,此时相当于一条线,所以不需要累加。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。