matlab实现ROC曲线

概述

ROC曲线是机器学习中的一种评价方式,是receiver operating characteristic curve的缩写,作用是验证训练效果的好坏。本文主要目录为下述:

1. 混淆矩阵

2. FPR和TPR

3. ROC曲线

4. AUC指标

5. matlab代码


 1. 混淆矩阵

混淆矩阵的起源,源于医学上对肿瘤是否发生的预测,对于预测肿瘤是否发生的结果有四种情况。

如上表, 当预测为良性,真实也为良性时,我们认为预测正确,为TP(真正例);同理,当预测为良性实际为恶性时,认为是预测失败,为FP(假正例);当预测为恶性实际为良性,也是预测失败,为FN(假反例);当预测和真实都为恶性时,预测成功,为TN(真反例)。

可见,上述四种情况有两种预测成功的(TP,TN),两种预测失败的(FT,FN)。上面这个表格就组成了混淆矩阵

2. FPR和TPR

在此定义两个公式,

FPR = \frac{FP}{FP+TN}

FPR表示,在所有的恶性肿瘤中,被预测成良性的比例。称为伪阳性率。其表示随机拿一个恶性的肿瘤样本,有多大概率会将其预测成良性肿瘤。由于是错误预测的概率,所以FPR越小越好。

TPR = \frac{TP}{TP+FN}

TPR表示,在所有良性肿瘤中,被预测为良性的比例。称为真阳性率。其表示随机拿一个良性的肿瘤样本时,有多大的概率会将其预测为良性肿瘤。是正确预测的概率,所以TPR越大越好。

3. ROC曲线

以FPR为横坐标,TPR为纵坐标,就可以得到下面的坐标系:

考察几个特殊的点。

  • 点(0,1),即FPR=0,TPR=1。FPR=0说明FP=0,没有假正例。TPR=1说明,FN=0,也就是说没有假反例。所有的预测都正确了。良性的肿瘤都预测为良性,恶性肿瘤都预测为恶性,分类百分之百正确。这也体现了FPR 与TPR的意义。我们本来就希望FPR越小越好,TPR越大越好。
  • 点(1,0),即FPR=1,TPR=0。这个点与上面那个点形成对比,刚好相反。所以这是最糟糕的情况。所有的预测都预测错了。
  • 点(0,0),即FPR=0,TPR=0。也就是FP=0,TP=0。所以这个点的意义是所有的样本都预测为恶性肿瘤。也就是说,无论给什么样本给我,我都无脑预测成恶性肿瘤就是了。
  • 点(1,1),即FPR=1,TPR=1。显然,这个点跟点(0,0)是相反的,这个点的意义是将所有的样本都预测为良性肿瘤。

考察完这四个点,我们可以知道,如果一个点越接近左上角,那么说明模型的预测效果越好。如果能达到左上角(点(0,1)),那就是最完美的结果了。

4. AUC指标

AUC指模型评估指标,其是基于上面提到的ROC图像,将该图像量化为一个数值,更加简介的表示了模型训练的能力。

其具体表述是指,ROC曲线下的面积。

  

5. matlab代码

clear all
%%输入预测值和真实值
label = [1,1,0,0,1,0,1,1,0,0,0,0,1,1,0];        %真实值
p = [0.8,0.6,0.55,0.4,0.7,0.19,0.7,0.8,0.65,0.02,0.25,0.42,0.78,0.69,0.32];     %预测值

%%初始定义
confu = zeros(2,2);     %定义混淆矩阵
x_label=[]; y_label=[]; yy=[];    %定义画图变量
xx=1;

%%ROC运算
for value=0:0.01:1
    box = zeros(1,size(p,2));   %定义缓存向量
    for i=1:size(p,2)  
        if p(i)>=value    %判断阈值
            box(i) = 1;
        else
            box(i) = 0;
        end
        
        if box(i)==0 && label(i)==0     %导入混淆矩阵
            confu(2,2) = confu(2,2) + 1;     %TN
        elseif box(i)==0 && label(i)==1
            confu(1,2) = confu(1,2) + 1;     %FN
        elseif box(i)==1 && label(i)==0
            confu(2,1) = confu(2,1) + 1;     %FP
        elseif box(i)==1 && label(i)==1
            confu(1,1) = confu(1,1) + 1;     %TP
        end
    end
    
    TN=confu(2,2); FN=confu(1,2); FP=confu(2,1); TP=confu(1,1);
    FPR = FP/(FP+TN);   %定义式
    TPR = TP/(TP+FN);
    x_label(xx) = FPR;  %画图坐标赋值
    y_label(xx) =  TPR;
    yy(xx) = FPR;
    xx=xx+1;
end
AUC = -1*trapz(x_label,y_label);    %求AUC值(曲线的面积)


%%画ROC图
figure(1)
plot(x_label,y_label);
title({'ROC曲线', ['AUC = ', num2str(AUC)]});
xlabel("FPR");
ylabel("TPR");
hold on
plot(x_label, yy,'g');

### 绘制ROC曲线图的方法 为了绘制ROC曲线,首先需要准备数据集并训练一个分类器。接着利用`sklearn.metrics`模块中的`roc_curve`函数计算假阳性率(FPR)和真阳性率(TPR),最后通过Matplotlib库来展示这条曲线[^2]。 ```python from sklearn.svm import SVC from sklearn.metrics import roc_curve, auc from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt %matplotlib inline # 创建模拟二元分类的数据集 X, y = make_blobs(n_samples=1000, centers=2, random_state=42) # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=42) # 使用支持向量机作为分类器 classifier = SVC(kernel='linear', probability=True) classifier.fit(X_train, y_train) # 预测概率值用于绘图 y_score = classifier.decision_function(X_test) # 计算FPR、TPR以及阈值 fpr, tpr, _ = roc_curve(y_test, y_score) # 计算AUC面积得分 roc_auc = auc(fpr, tpr) plt.figure() lw = 2 plt.plot(fpr, tpr, color='darkorange', lw=lw, label=f'ROC curve (area = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') plt.xlim([0.0, 1.0]) 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() ``` 上述代码展示了完整的流程,从创建样本到最终呈现ROC图形。值得注意的是,在实际应用中可能还需要调整参数或者更换其他类型的分类算法以适应具体场景的需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值