ROC曲线绘制与计算

2023-05-16

假设现在有一个二分类问题,先引入两个概念:

  • 真正例率(TPR):正例中预测为正例的比例
  • 假正例率(FPR):反例中预测为正例的比例

再假设样本数为6,现在有一个分类器1,它对样本的分类结果如下表(按预测值从大到小排序)

标签预测值
10.9
10.8
10.7
00.3
00.2
00.1

ROC曲线的横轴为假正例率,纵轴为真正例率,范围都是[0,1],现在我们开始画图——根据从大到小遍历预测值,把当前的预测值当做阈值,计算FPR和TPR。

step1:选择阈值最大,即为1,正例中和反例中都没有预测值大于等于1的,所以FPR=TPR=0。

step2:根据上表,选择阈值为0.9,正例中有1个样本的预测值大于等于1,反例中有0个,所以,TPR=1/3,FPR=0。

step3:根据上表,选择阈值为0.8,正例中有2个样本的预测值大于等于1,反例中有0个,所以,TPR=2/3,FPR=0。

step4:根据上表,选择阈值为0.7,正例中有3个样本的预测值大于等于1,反例中有0个,所以,TPR=1,FPR=0。

step5:根据上表,选择阈值为0.3,正例中有3个样本的预测值大于等于1,反例中有1个,所以,TPR=1,FPR=1/3。

step6:根据上表,选择阈值为0.2,正例中有3个样本的预测值大于等于1,反例中有2个,所以,TPR=1,FPR=2/3。

step7:根据上表,选择阈值为0.1,正例中有3个样本的预测值大于等于1,反例中有3个,所以,TPR=1,FPR=1。

综上,我们得到下表

FPRTPR
01/3
02/3
01
1/31
2/31
11

描点连线,画出的图是下面这样什儿的

 

可以看出这个分类器还是很理想的。

假设现在又有一个分类器2,对同样一组样本,分类结果如下

标签预测值
10.9
10.8
00.75
10.7
00.2
00.1

根据上面描述的方法,画出ROC曲线如下

发现这个曲线的左上角比之前往右下角凹了一点。

emmmm,现在又来了一个分类器3,对同样一组样本,分类结果如下

标签预测值
10.9
00.8
00.78
10.75
10.2
00.1

不多说,直接画图——

哎?这个曲线比之前更“凹”了。

实际上,不用画出曲线,只是根据这3个分类器的分类结果,我们也能大概能分析出它们的性能:分类器1>分类器2>分类器3。

对分类器1的预测结果来说,所有的正例的预测值都在1这一侧,所有反例的预测值都在0那一侧,只要阈值取得合适,即阈值落在(0.3,0.7)内都可以。

再看分类器2的预测结果,出现了对反例的预测值(0.75)大于对正例的预测值了(0.7),所以不能选择一个合适的阈值把这两类完全分开,所以反映在图上就是左上角凹了一点,但对大部分样本还是可以正确分类的。

再看分类器3的预测结果,这种不稳定性就更明显了,所以相比前两个的ROC曲线,凹得就更多了。

从这个角度,也就不难得出,ROC下面的面积越大,分类器越好的结论了。当然还有严格的数学角度的分析,感兴趣的,了解一下。

下面附上画图用的matlab代码

clear;
clc;
% 分类器1
% label = [1,1,1,0,0,0];
% predict = [0.9,0.8,0.7,0.3,0.2,0.1];

% 分类器2
% label = [1,1,0,1,0,0];
% predict = [0.9,0.8,0.75,0.7,0.2,0.1];

% 分类器3
label = [1,0,0,1,1,0];
predict = [0.9,0.8,0.78,0.75,0.2,0.1];


TPR=[];
FPR=[];
numPositive = size(find(label==1),2);
numNegative = size(find(label==0),2);
postive = predict(find(label==1));
negative = predict(find(label==0));
for i=1:size(label,2)+1
    if i==1
        cur = 1;
    else
        cur = predict(i-1);
    end
    TPR(i) = size(find(postive>=cur),2)/numPositive;
    FPR(i) = size(find(negative>=cur),2)/numNegative;
end
plot(FPR,TPR,'k*-')
axis([0 1 0 1]);
xlabel('FPR')
ylabel('TPR')



作者:阿健在长安
链接:https://www.jianshu.com/p/6572bf3a0d5d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROC曲线绘制与计算 的相关文章

  • 模型评价指标—ROC曲线

    对于分类模型 xff0c 在建立好模型后 xff0c 我们想对模型进行评价 xff0c 常见的指标有混淆矩阵 F1值 KS曲线 ROC曲线 AUC面积等 也可以自己定义函数 xff0c 把模型结果分割成n 100 份 xff0c 计算top
  • ROC曲线绘制与计算

    假设现在有一个二分类问题 xff0c 先引入两个概念 xff1a 真正例率 xff08 TPR xff09 xff1a 正例中预测为正例的比例假正例率 xff08 FPR xff09 xff1a 反例中预测为正例的比例 再假设样本数为6 x
  • 推荐系统之ROC和AUC详解

    前言 这个绝对是重量级内容了 xff0c 也是很基础的东西 对于模型来讲 xff0c 不同的阈值会有不同的泛化能力 xff0c 这时候 xff0c 如果想比较两个模型的泛化能力 xff0c 这个阈值的高低也会受到影响 xff0c 所以就需要
  • 二分类确定画出roc曲线,以及基于roc曲线获得最佳划分阈值

    问题 在做二分类问题时候 xff0c 有正样本和负样本 构建的算法 xff0c 针对每个样本会输出一个分数值 假设该分数大小为 0 1 区间内的值 有时候单纯地以分数0 5位阈值划分样本为预测为1或者预测为0 xff0c 效果有时候并不好
  • 理解ROC曲线,TPR与FPR

    在垃圾邮件判别模型中 邮件被判别为垃圾邮件为positive 被判别为非垃圾邮件为negative 那么 TPR TP TP FN 的含义是 垃圾邮件被正常判别为垃圾邮件的比例 FPR FP FP TN 的含义是 非垃圾邮件被判别为垃圾邮件
  • 如何在R中直接绘制h2o模型对象的ROC

    如果我遗漏了一些明显的东西 我很抱歉 在过去的几天里 我非常喜欢使用 R 界面与 h2o 一起工作 我想通过绘制 ROC 来评估我的模型 例如随机森林 该文档似乎表明有一种简单的方法可以做到这一点 解释 DRF 模型 默认情况下 显示以下输
  • 如何使用 ROCR 包计算 AUC

    我已经安装了 SVM 模型并使用 ROCR 包创建了 ROC 曲线 如何计算曲线下面积 AUC set seed 1 tune out tune svm Negative Positive data trainSparse kernel r
  • 在 R 中为逻辑回归模型绘制多条 ROC 曲线

    我有一个逻辑回归模型 使用 R 作为 fit6 lt glm formula survived ascore gini failed data records family binomial summary fit6 我在用着pROC用于绘
  • 根据 R 中的交叉验证(训练)数据绘制 ROC 曲线

    我想知道是否有一种方法可以从使用 SVM RFE 模型生成的交叉验证数据中绘制平均 ROC 曲线caret包裹 我的结果是 Recursive feature selection Outer resampling method Cross
  • 从 ROC 曲线获取阈值

    我有一些模型 使用ROCR将预测类百分比向量封装起来 我有一个性能对象 使用规格 tpr fpr 绘制性能对象可以得到一条 ROC 曲线 我正在比较特定误报率阈值 x 的模型 我希望从性能对象中获取真阳性率 y 的值 更重要的是 我想获得用
  • 来自插入符号中的训练数据的 ROC 曲线

    使用R包插入符号 如何根据train 函数的交叉验证结果生成ROC曲线 比如说 我执行以下操作 data Sonar ctrl lt trainControl method cv summaryFunction twoClassSummar
  • 错误:“y_true 中的类数不等于 'y_score' 中的列数”

    我有一个不平衡的多类数据集 当我尝试计算 roc auc score 时 我收到此错误 ValueError y true 中的类数不等于 y score 中的列数 这是代码 model svm SVC kernel linear prob
  • MATLAB - 从分类器生成混淆矩阵

    我有一些测试数据和标签 testZ 0 25 0 29 0 62 0 27 0 82 1 18 0 93 0 54 0 78 0 31 1 11 1 08 1 02 testY 1 1 1 1 1 2 2 2 2 2 2 2 2 然后我对它
  • 如何生成阳性预测值 (PPV) 与各种分类截止点的关系图?

    我生成了一些分数来帮助预测某些内容是 是 1 还是 否 0 假设数据包括 scores c 10 20 response c 0 0 1 0 1 0 1 1 0 1 1 mydata data frame scores response 我
  • roc_auc_score 和plot_roc_curve 结果不同

    我正在训练一个RandomForestClassifier sklearn 预测信用卡欺诈 然后当我测试模型并检查 rocauc 分数时 我在使用时会得到不同的值roc auc score and plot roc curve roc au
  • sklearn RandomForestClassifier 与 auc 方法中 ROC-AUC 分数的差异

    我分别从 sklearn 的 RandomForestClassifier 和 roc curve auc 方法收到不同的 ROC AUC 分数 以下代码得到了 0 878 的 ROC AUC 即 gs best score def tra
  • 使用 pROC 绘制 ROC 曲线失败

    我有一个数据集 其组织方式如下 gt head crypto data time btc price btc change btc change label eth price block size difficulty estimated
  • 使用 Caret 包的测试集的 ROC 曲线

    我正在尝试从测试集上的插入符号中获取最佳模型的 ROC 曲线 我碰到MLeval包似乎很方便 输出非常全面 使用几行代码提供了所有需要的指标和图表 一个很好的例子在这里 https stackoverflow com a 59134729
  • scikit-learn - 具有置信区间的 ROC 曲线

    我可以使用 ROC 曲线scikit learn with fpr tpr thresholds metrics roc curve y true y pred pos label 1 where y true是基于我的黄金标准的值列表 即
  • R 中多类分类的 ROC 曲线

    我有一个包含 6 个类别的数据集 我想绘制多类别分类的 ROC 曲线 Achim Zeileis 给出的第一个答案非常好 R中使用rpart包的ROC曲线 https stackoverflow com questions 30818188

随机推荐