1万字说清楚Receiver Operating curve(ROC) 受试者操作特征曲线

概述

AUC(area under the curve)是机器学习领域中一种常见且重要的模型评估指标,用于计算二元分类器效率的方法。AUC表示ROC(receiver operator characteristic)曲线下的面积,即AUC = ROC 曲线下面积。

起源-雷达救了英国

很多统计指标来源于战争。ROC最早用于英国雷达分辨鸟或德国飞机的概率。二战期间首次用于分析雷达有效性。在早些时候雷达,有时很难从飞机上分辨出一只鸟。英国人率先使用 ROC 曲线来优化他们依赖雷达进行判别的方式在来袭的德国飞机和鸟类之间。
图片
图片
二战时英国的反入侵战备是英国为了抵抗可能发生的德军入侵,而于1940年和1941年间做出的准备。在这期间,英国政府建立了英国国土警卫队,并在英国全境修建了防御工事。在缺少重型装备的情况下,英军需要将手中的一切可用资源运用到极致。

由于在不列颠空战中战败,德国为入侵英国而开展的海狮计划遭到了无限期的推延。英国也就没能在其本土与德国陆军展开战斗。今天,英国修建的大部分防御工事都已消失,只有一些加固过的混凝土工事还较常见。

自不列颠空战正式打响开始,英国皇家空军和海军航空兵就肩负起了保卫英国领空的任务。它们与德国空军进行了激烈的战斗以使英国上空的制空权不被敌人夺走,而制空权是纳粹德国非常看重的。

如果德国空军成功地占领了英国领空,那么英国空军剩余的极少数飞机将会转移到英格兰东南部的机场。英国人在撤走时会将机场的跑道破坏掉。这些飞机将会与英国皇家海军一起打击德国舰队。尽管还未夺取制空权的德国空军比英国空军强大,但英国战机也有优势,它们大多是在己方领空执行任务,而每次任务的持续时间也会比跨越海峡飞来的德军战机长。

英国空军将所有还能飞的战斗机都调用了起来。而战斗机以外的其它飞机都被改装成了轰炸机,一些新飞行员也会开着拥有简易投弹装置的教练机对德占区进行轰炸。

二战开始之前,英国在英格兰南部修建了一套雷达系统,其中有三座雷达站从1937年起开始运行。尽管德军高层对英国此举有所怀疑,但德国空军并没有做出实际行动。后来正是这些雷达站挽救了英国。

图片

ROC接收器操作特性曲线特点

  • 接收器操作特性(ROC) 曲线:由分类算法的一个参数参数化的二维曲线。

  • 可以通过在 y 轴上绘制 TPR 和在 x 轴上绘制 TNR 来获得 ROC 曲线。

  • AUC 用于衡量模型的区分能力。AUC 始终介于 0 和 1 之间,AUC的值越接近1,表示模型区分能力越好,AUC的值越接近0,模型区分能力越差,AUC的值等于0.5,表示模型区分能力是随机的。

  • 在风控金融领域,大数据残缺不全,垃圾数据较多,模型AUC值一般在0.6-0.7之间。如果模型AUC值能超过0.8表示,模型非常优秀,我在多年金融风控建模项目中,很少看到模型AUC能超过0.8.

ROC图如下
图片
用sensitivity和specificity解释ROC图
图片
AUC 始终介于 0 和 1 之间,AUC的值越接近1,表示模型区分能力越好,AUC的值越接近0,模型区分能力越差,AUC的值等于0.5,表示模型区分能力是随机的。
图片

ROC曲线的阈值问题

sensitivity=黑色竖线右边红色像素面积/红色像素总面积
false positive=黑色竖线右边绿色像素面积/蓝色像素总面积
当我们对不同的阈值进行遍历时,产生的 (假阳率, 真阳率) 坐标点也就可以连成ROC曲线,进而求得曲线下面积AUC。
图片
TP,FP,FN,TN与ROC关系图如下
图片
蓝色表示不接受,红色表示接受。我们用软件对两种颜色重叠不同位置时,观察左上角ROC曲线变化和阈值变化。
图片
图片图片图片
图片
这种roc很难区别分类,两种颜色基本重叠,AUC值接近0.5
图片

ROC应用

ROC应用1

我们必须对属于 A 类或 B 类的产品进行分类。
图片

ROC 应用2

面试,**(+)表示适合工作的候选人,(-)**表示不适合工作的候选人。
图片
ROC 应用3

ROC曲线常用于医疗领域,特别是判断仪器检测效果。ROC能很容易地查出任意界限值时的对疾病的识别能力。

选择最佳的诊断界限值。ROC曲线越靠近左上角,试验的准确性就越高。最靠近左上角的ROC曲线的点是错误最少的最好阈值,其假阳性和假阴性的总数最少。

两种或两种以上不同诊断试验对疾病识别能力的比较。在对同一种疾病的两种或两种以上诊断方法进行比较时,可将各试验的ROC曲线绘制到同一坐标中,以直观地鉴别优劣,靠近左上角的ROC曲线所代表的受试者工作最准确。亦可通过分别计算各个试验的ROC曲线下的面积(AUC)进行比较,哪一种试验的 AUC最大,则哪一种试验的诊断价值最佳。
图片

所有术语计算公式如下

TP,FN,TN,FP,FN

TP(True Positive)=A类产品的数量,属于A类产品。
FN (False Negative) = A 类产品的数量,属于 B 类产品。
TN (True Negative) = B 类产品的数量,属于 B 类产品。
FP(False Positive)= B类产品的数量,属于A类产品。
FP = N-TP;// 其中数字 N 是 A 类产品的数量
FN = M-TN;// 其中 number M 是 B 类产品的数量

为了让大家更好立即,附上英文释义
TP (True Positive) = number of Class A products, which are classified as Class A products.
FN (False Negative) = number of Class A products, which are classified as Class B products.
TN (True Negative) = number of Class B products, which are classified as Class B products.
FP (False Positive) = number of Class B products, which are classified as Class A products.
FP = N-TP; // where number N is the number of class A type products
FN = M-TN; // where number M is the number of class B type products

混淆矩阵

混淆矩阵中横轴通常表示真实类别(1和0分别对应真、伪),纵轴表示预测类别(1和0分别对应阳、阴),对真实类别和真实类别进行组合,便组成混淆矩阵:
图片
更详细混淆矩阵图如下
图片
混淆矩阵里概念比较相似,相同指标有不同术语,为了让大家更好立即回血矩阵,我附上混淆矩阵英文图谱,如下图:
图片
图片
图片

准确率Accuracy

准确性衡量测试对 TPR 和 TNR 的预测效果。按照混淆矩阵中的符号形式,准确率的公式可以表示为:
图片

准确率是一种非常常见的模型效能度量指标,然而当面对样本不平衡问题时,其度量效果会产生问题。比如在一个总样本中,1类样本占90%,0类样本占10%,样本严重不平衡,此时我们只需要将全部样本预测为1即可得到高达90%的准确率。

精准率Precision

精准率(Precision)又称查准率,代表所有被预测为1的样本中实际为1的概率,其公式如下:
图片

召回率Recall

召回率(Recall)又称查全率,代表在所有实际为1的样本中被预测为1的概率,其公式如下:
图片

F1分数

通常情况下,查准率和查全率会随着阈值的变化而变化,我们希望查准率和查全率同时都非常高,然而这两个指标实际是此消彼长的关系,无法做到双高。对此,我们就需要一个新的指标 —— F1分数。F1分数同时考虑了查准率和查全率,通过选取最高的F1来确定分类阈值,F1公式如下:
图片

ROC/AUC 相关指标介绍

为了了解ROC/AUC,我们需要了解几个指标。灵敏度sensitivity和召回率recall是同一个指标,不同场景术语叫法不一样。

灵敏度
灵敏度衡量正确识别的阳性比例

图片

特异度specificity

特异度衡量被正确识别的阴性比例
图片

真阳率 (TPR)

真阳率和召回率一样,代表在所有实际为1的样本中被预测为1的概率,其公式如下:
图片

假阳率 (FPR)

假阳率代表在所有实际为0的样本中被预测为1的概率,其公式如下:
图片

指标间关系

用条件概率理解混合矩阵容易得多
sensitivity:真阳性条件下,测试也是阳性
specificity:真阴性条件下,测试也是阴性
FALSE positive:真阴性条件下,测试却是阳性
FALSE negative:真阳性条件下,测试却是阴性
只要全部认定为阳性,敏感度就是百分之百,但说明调高敏感度同时,假阳性概率也会随之提高
当全部认定为阳性,阴性数量为0,specificity=0, 假阳性1-specificity=1,假阳性也是最高。
敏感性和假阳性率呈现正比例
敏感性和准确性(阳性预测率)呈现反比例
ROC和PRC曲线说明:敏感性(召回率)不是越高越好,敏感性太高,假阳性率也会上升(会损失掉一些好客户)。
敏感性太高,阳性预测率(准确率)会下降。

各指标计算举例
图片

ROC的Excel计算逻辑
ROC可以用Excel来计算,具体计算逻辑举例如下图:
图片

图片

ROC 曲线的python代码

在 Python 中计算 ROC 曲线scikit-learn 使计算 ROC 曲线变得非常容易。但首先要做的是:要制作 ROC 曲线,我们首先需要一个分类模型进行评估。对于这个例子,我将制作一个合成数据集,然后使用 scikit-learn 构建一个逻辑回归模型。

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
X, y = make_classification(n_samples=10000, n_features=10, n_classes=2, n_informative=5)
Xtrain = X[:9000]
Xtest = X[9000:]
ytrain = y[:9000]
ytest = y[9000:]

clf = LogisticRegression()
clf.fit(Xtrain, ytrain)

好的,现在我们有了我们的模型,我们可以计算 ROC 曲线了。 非常简单——从 scikit-learn 导入 roc_curve,传入我们测试集中的实际 y 值以及这些相同记录的预测概率。结果将产生您的 FPR 和 TPR。 将它们传递给 ggplot 和 BAM! 你有一个漂亮的 ROC 曲线。

from sklearn import metrics
import pandas as pd
from ggplot import *

preds = clf.predict_proba(Xtest)[:,1]
fpr, tpr, _ = metrics.roc_curve(ytest, preds)

df = pd.DataFrame(dict(fpr=fpr, tpr=tpr))
ggplot(df, aes(x='fpr', y='tpr')) +\
    geom_line() +\
    geom_abline(linetype='dashed')

最后计算AUC:

auc = metrics.auc(fpr,tpr)
ggplot(df, aes(x='fpr', ymin=0, ymax='tpr')) +\
    geom_area(alpha=0.2) +\
    geom_line(aes(y='tpr')) +\
    ggtitle("ROC Curve w/ AUC=%s" % str(auc))

我们得到 0.900。回顾之前,AUC 在 0 和 1 之间有界,所以这很不错。

ROC 曲线的R代码

在 R 中计算 ROC 曲线在 R 中制作 ROC 曲线也很容易。 我强烈推荐使用 ROCR 包。 它为您完成了所有艰苦的工作,并制作了一些非常漂亮的图表。对于模型,我们将构建一个分类器,该分类器使用逻辑回归模型来预测钻石数据集中的记录是否超过 2400 美元。

library(ggplot2)
diamonds$is_expensive <- diamonds$price > 2400
is_test <- runif(nrow(diamonds)) > 0.75
train <- diamonds[is_test==FALSE,]
test <- diamonds[is_test==TRUE,]
summary(fit <- glm(is_expensive ~ carat + cut + clarity, data=train))
Using ROCR, making the charts is relatively simple.
library(ROCR)
prob <- predict(fit, newdata=test, type="response")
pred <- prediction(prob, test$is_expensive)
perf <- performance(pred, measure = "tpr", x.measure = "fpr")
# I know, the following code is bizarre. Just go with it.
auc <- performance(pred, measure = "auc")
auc <- auc@y.values[[1]]
roc.data <- data.frame(fpr=unlist(perf@x.values),
                       tpr=unlist(perf@y.values),
                       model="GLM")
ggplot(roc.data, aes(x=fpr, ymin=0, ymax=tpr)) +
    geom_ribbon(alpha=0.2) +
    geom_line(aes(y=tpr)) +
    ggtitle(paste0("ROC Curve w/ AUC=", auc))

总结,今天2021年7月24日终于总结完ROC,AUC,混淆矩阵等概念。为了让大家更好理解这些概念,我图文并茂,整合了大量资料。但是这些概念确实比较容易混淆,希望大家下来各个击破,勤加练习,不能死记硬背这些指标。赠送大家一句话practice makes it perfect! 欢迎各位同学学习我录制的<python金融风控评分卡模型和数据分析微专业课>,课程不断更新,与时俱进。

欢迎学习csdn学院更多金融风控相关知识《python金融风控评分卡模型和数据分析》
在这里插入图片描述
版权声明:文章来自公众号(python风控模型),未经许可,不得抄袭。遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

在MATLAB中,可以使用以下代码来绘制受试者工作特征曲线ROC曲线): 假设我们有一组真实标签(ground truth)和一组预测概率(predicted scores): ```matlab % 真实标签 true_labels = [0 1 1 0 1 1 0 0 1]; % 预测概率 predicted_scores = [0.2 0.6 0.8 0.3 0.9 0.7 0.4 0.1 0.5]; ``` 首先,需要根据预测概率和真实标签计算不同阈值下的真阳性率(True Positive Rate,TPR)和假阳性率(False Positive Rate,FPR): ```matlab % 根据阈值计算TPR和FPR thresholds = unique(predicted_scores); n_thresholds = length(thresholds); TPR = zeros(n_thresholds, 1); FPR = zeros(n_thresholds, 1); for i = 1:n_thresholds threshold = thresholds(i); TP = sum(predicted_scores >= threshold & true_labels == 1); FN = sum(predicted_scores < threshold & true_labels == 1); FP = sum(predicted_scores >= threshold & true_labels == 0); TN = sum(predicted_scores < threshold & true_labels == 0); TPR(i) = TP / (TP + FN); FPR(i) = FP / (FP + TN); end ``` 然后,可以使用`plot`函数将TPR和FPR绘制成ROC曲线: ```matlab % 绘制ROC曲线 plot(FPR, TPR, 'b-', 'LineWidth', 2); grid on; xlabel('False Positive Rate'); ylabel('True Positive Rate'); title('Receiver Operating Characteristic (ROC) Curve'); axis square; ``` 最后,可以使用`axis([0 1 0 1])`函数设置坐标轴范围为[0,1],以确保ROC曲线在图像中正确显示: ```matlab % 设置坐标轴范围 axis([0 1 0 1]); ``` 这样就可以得到一个用于评估分类器性能的ROC曲线
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python机器学习建模

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值