ROC 曲线通俗解释

### 写这个文章主要是因为 TP FP 什么什么巴拉巴拉的字母及其含义太多了记不住,所以简明的把自己的理解写一下。
### ROC曲线的说明
# ROC曲线常用来体现二分类问题的模型的性能,既然是体现性能,那自然是为了多个模型的比较。
# 假如你来做猫狗图片分类,一共有M个图,其中10个是狗,你只认出来6个狗,那么召回率( recall )就是0.6,只记住这一个词儿就行了。
# recall_1,recall_2 分别表示狗和猫的召回率。
# 其他文章或书里所谓的TPR 就是其中一类的召回率,他们喜欢叫真阳率,但是相似的还有好多别的名字和字母,什么假阳什么什么的,太多了我也记不住。
# 二分类问题中,显然的,两个类别地位是相等的,非此即彼的关系。
# 如果定义一个分数阈值(score_thresh),假设样本的分数(score)大于 score_thresh 的是狗,那么小于 score_thresh 的就是猫。
# 当分数阈值越来越大,识别为狗的要求越来越高,那么识别结果中狗的数量肯定越来越少,猫越来越多。
# 那么狗的召回率肯定越来越低,猫的召回率肯定越来越高。所以猫狗的召回率是随着那个分数阈值(score_thresh )在变化的。
# 基本比较想法:如果有多个模型要比较性能,在狗的召回率一致的情况下,哪个模型的猫的召回率越高,就说明哪个模型性能在当前的狗的召回率下表现越好。
# 然后把所有狗的召回率都比较一遍,综合一个结果去比较。
# 先看看大家是怎么画的:
# 横坐标为1-recall_2,纵坐标为 recall_1,
# recall 的值是由不同的 score_thresh 来体现的,每定一个 score_thresh,得到的正负结果数量就不同,recall就不同,
# 定N个score_thresh 就得到 N个(1-recall_2,recall_1)点,连起来得到ROC曲线。
# 它的好坏可以用ROC曲线下的面积来体现,称为AUC。
# 如果有M个样本,习惯于定M个 score_thresh  ,下一个score_thresh 正好比当前 score_thresh 大一点点,刚好让一个样本的分数从比 score_thresh大变到比 score_thresh 小 。如果数据量太大的话,就可以定少一些阈值,减少计算次数,反正定的阈值越多,ROC曲线上点越多,连起来就显得越光滑。
# 同理,其实你也可以画 (recall_1,recall_2),(recall_2,recall_1),(1-recall_1,recall_2),(recall_2,1-recall_1),(recall_1,1-recall_2),(1-recall_1,1-recall_2) ,(1-recall_2,1-recall_1)等等曲线。
# 只不过只有(1-recall_2,recall_1)叫做 ROC 曲线,其他的没人用,真是太惨啦。
# 举个例子,如果画(recall_1,1-recall_2) 曲线,那么同样的recall_1,下 recall_2 越大越好,也就是1- recall_2 越小越好。
# 这时候AUC 就要计算[[0,0],[0,1],[1,1],[1,0]]正方形内曲线上面包含的面积,也就是 1-曲线下方的面积
# 只要纵坐标是1-recall_x,AUC就等于 1-曲线下方的面积
# 来看看python代码,百度给的,然后自己随便改改
# 先导几个包
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt

# 假设 y_true 表示真实标签,y_score 是跑模型得到的预测分数
# 假设有100个样本
# 先设置真实标签,用 0 和 1 表示,我设了 45个0 和 55个1,最好两个类别的数量均衡一些。
y_true = np.concatenate([np.zeros(45),np.ones(55)],0)
# 我们这里没有模型,就手动生成 y_score 。
# 随机生成 100个[0,1]的值,再把前面 45 个变小一点,后面55个变大一点。
# 用来体现我们的虚空模型还是有一点点用处的,哈哈哈哈哈哈哈。
y_score = np.concatenate([np.square(np.random.rand(45)), np.sqrt(np.random.rand(55))],0) 
# 看一下生成的数
# print("y_true",y_true,'\n',"y_score",y_score) 

# 计算,直接调的函数,过程你自己去函数里看吧。 fpr, tpr 就是 1-recall_2 和 recall_1 
fpr, tpr, _= metrics.roc_curve(y_true, y_score)

# 下面几行可以随便调整 ,用来画上面提到的其他的曲线,最原始的就啥也不加
# fpr=1-fpr # 将 1-recall_2 换成 recall_2
# tpr=1-tpr # 将 recall_1 换成 1-recall_1
# t=fpr   # 对调横纵坐标
# fpr=tpr
# tpr=t


# 绘制ROC曲线
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label=f"ROC curve (AUC = {metrics.auc(fpr, tpr)})")
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.05])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic example')
plt.legend(loc="lower right")
plt.show()


###
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值