机器学习中的ROC曲线理解和实战

一、什么是ROC曲线

1、ROC曲线,又可以称之为接受者操作特征曲线(Receiver Operating Characteristic Curve),

ROC曲线下的面积,称为AUC(Area Under Cureve),可以衡量评估二分类模型的分类好坏。

2、AUC是1乘以的方格中的一部分,起大小在0-1之间,AUC越大说明模型效果越好,

  • AUC=1,是完美的分类器,该模型至少存在一个阈值,可以将正负样本完美的划分开
  • 0.5<AUC<1,优于随机猜测,数值越大,分类效果越好
  • AUC=0.5,说明模型没有分类效果,即随机
  • AUC<0.5,比随机猜测要差,然而若方向预测,该模型可以优于随机猜测

二、ROC曲线如何绘制

1、ROC曲线由预测概率和阈值来共同决定

分类模型的输出结果中包含一个0到1的概率值,该概率代表着对应的样本被预测为某类别的可能性,通过阈值来进行划分,概率大于阈值的为正,概率小于阈值的负。

样本预测概率阈值(thresholds=0.9)阈值(thresholds=0.5)
10.95
20.86
30.64
40.43

2、TPR和FPR

ROC曲线的横坐标为FPR,纵坐标为TPR,FPR是错误的预测为正的概率,TPR为正确的预测为正的概率(注意TPR+FTR不是固定等于1的

                                   FPR=负的预测为正的数量/原本为负的数量(FPR = FP/(TN+FP))

                                   TPR=正的预测为正的数量/原本为正的数量(召回率:TPR = TP/(TP+FN))

         备注:TN+FP为负样本总量;TP+FN为正样本总量。

                     FPR越小越好,TPR越大越好

                                 

三、ROC的曲线绘制步骤

1、将全部样本按概率递减排序

2、阈值从1至0变更,计算各阈值下对应的(FPR,TPR)数值对

3、将数值对绘制直角坐标系中

具体如下:

step1:将全部样本安装概率递减排序(概率是模型预测之后的概率)

样本ID原始类型预测概率
10.95
20.86
30.70
40.65
50.55
60.53
70.52
80.43
90.42
100.35

step2:阈值从1至0变更,计算各阈值下的对应的(FPR,TPR)数值对

1)阈值=1时

      FPR=负的预测为正的数量/原本为负的数量 = 0 / 5 = 0 (样本3、6、7、8、10)

      TPR=正的预测为正的数量/原本为正的数量 = 0 / 5 = 0  (样本1、2、4、5、9)

       此时得到一个点(0,0),即为ROC曲线的第一个点。

样本ID原始类型预测概率当阈值=1阈值=0.95阈值=0.86阈值=0.7
10.95
20.86
30.70
40.65
50.55
60.53
70.52
80.43
90.42
100.35

  2)阈值=0.95时

      FPR=负的预测为正的数量/原本为负的数量=0/5 = 0  (样本3、6、7、8、10)

      TPR=正的预测为正的数量/原本为正的数量=1(样本1)/5 = 0.2  (样本1、2、4、5、9)

       此时得到一个点(0,0.2),即为ROC曲线的第二个点。

后面依次类推,变化阈值,得到(FPR,TPR)

我们最后得到一些点(0,0)(0, 0.2)(0,0.4)(0.2,0.4)(0.2,0.6)(0.2,0.8)(0.4,0.8)(0.6,0.8)(0.8,0.8)(0.8,1.0)(1.0,1.0),根据这些点,我们画如下的ROC曲线了 ~

                 

              

 四、sklearn 中的ROC

1、可能有些同学疑惑,上面这个阈值(thresholds)怎么来的。下面我们简单看下,

这里metrics 输入样本y和scores,scores你可以看成是预测概率了。然后返回的是 fpr, tpr, thresholds。

>>> import numpy as np
>>> from sklearn import metrics
>>> y = np.array([1, 1, 2, 2])
>>> scores = np.array([0.1, 0.4, 0.35, 0.8])
>>> fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)#pos_label=2 正类的标签
>>> fpr
array([0. , 0. , 0.5, 0.5, 1. ])
>>> tpr
array([0. , 0.5, 0.5, 1. , 1. ])
>>> thresholds
array([1.8 , 0.8 , 0.4 , 0.35, 0.1 ])

2、我们可以直接用 

sklearn.metrics.plot_roc_curve 进行绘制 ROC曲线

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn import datasets, metrics, model_selection, svm
X, y = datasets.make_classification(random_state=0)
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)
clf = svm.SVC(random_state=0)
clf.fit(X_train, y_train)
metrics.plot_roc_curve(clf, X_test, y_test) 
plt.show()

说明下,一般我们的模型都会返回预测概率值的。 

以上就是ROC的介绍和使用,欢迎大家评论指正。谢谢!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年6月13日
下一篇 2023年6月13日

相关推荐