ROC曲线和PR曲线
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROC曲线和PR曲线相关的知识,希望对你有一定的参考价值。
参考技术A 接受者操作特性曲线(receiver operating characteristic curve,简称 ROC曲线 ),又称为感受性曲线(sensitivity curve)。接受者操作特性曲线就是以虚惊概率为横轴,击中概率为纵轴所组成的坐标图。因此,ROC曲线越靠近坐标的左上角越好。
对于一个二分类问题,它有四种情况:
如果一个实例是正类,它被分为正类,记为 真正(True Positive);
如果一个实例是正类,它被分为负类,记为 假负(False Negative);
如果一个实例是负类,它被分为正类,记为 假正(False Positive);
如果一个实例是负类,它被分为负类,记为 真负(True Negative)。
在表格中可以表示为:
TP:正确肯定的数目;
FN:漏报,没有正确找到的匹配的数目;
FP:误报,给出的匹配是不正确的;
TN:正确拒绝的非匹配对数;
由此我没可以引入两个新名词:
真正类率 (True Positive Rate, TPR),表示分类器所识别出的 正实例占所有正类的比例,计算公式为:
另一个是 假正类率 (False Positive Rate, FPR),表示分类器错认为正类的负实例占所有负类的比例,计算公式为:
还有一个 真负类率 (True Negative Rate, TNR),表示分类器正确识别所有负类所占全部负类的比例,计算公式为:
以疾病检测为例,这是一个有监督的二分类模型,模型对每个样本的预测结果为一个概率值,我们需要从中选取一个阈值来判断健康与否。
定好一个阈值之后,超过此阈值定义为患病,低于此阈值定义为健康,就可以得出混淆矩阵。如果我没将阈值减少0.1,真正类率(TPR)将会增高,相应的假正类率(FPR)也会提高,为了形象化这一变化,在此引入ROC,ROC曲线可以用于评价一个分类器。
[图片上传失败...(image-acef2b-1591253838567)]
ROC曲线上的每一个点对应于一个threshold,对于一个分类器,每个threshold下会有一个TPR和FPR。
比如Threshold最大时,TP=FP=0,对应于原点;Threshold最小时,TN=FN=0,对应于右上角的点(1,1)。
随着阈值theta增加,TP和FP都减小,TPR和FPR也减小,ROC点向左下移动。
而如果在上述模型中我们没有定好阈值,而是将模型预测结果从高到低排序,将每次概率值依次作为阈值,那么就可以得到多个混淆矩阵。对于每个混淆矩阵,我们计算两个指标TPR和FPR,以FPR为x轴,TPR为y轴画图,就得到了ROC曲线。
一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting,AUC面积越大一般认为模型越好。
AUC(Area Under Curve)被定义为ROC曲线下的面积,取值范围一般在0.5和1之间(当AUC=0.5时,)。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。、
(1) AUC的计算方法
非参数法:(两种方法实际证明是一致的)
参数法:
(2)从AUC判断分类器(预测模型)优劣的标准
(3)不同模型AUC比较
总的来说,AUC值越大,模型的分类效果越好;不过两个模型AUC值相等并不代表模型效果相同,例子如下:
下图中有三条ROC曲线,A模型比B和C都要好
下面两幅图中两条ROC曲线相交于一点,AUC值几乎一样:当需要高Sensitivity(TPR)时,模型A比B好;当需要高Speciticity(FPR)时,模型B比A好;
(4)最优临界点的找法
我们希望自己的模型TPR高的同时FPR要尽量的小,则需要建立max(TPR+(1-FPR))的模型。
有三种方法: 找到离(0,1)最近的点 , Youden index , 最小损耗(cost criterion) 。
PR(Precision-Recall)曲线和ROC曲线类似,ROC曲线是FPR和TPR的点连成的线,PR曲线是准确率和召回率的点连成的线,如下图所示。
[图片上传失败...(image-ddf201-1591253838567)]
精确率和召回率的计算公式为:
精确率(Precision)
全部预测为1中实际标签为1的比率:
召回率(Recall)
实际标签为1中正确预测为1的比率:
而Recall=TPR,因此PR的横坐标为ROC的纵坐标。
相对来讲ROC曲线会稳定很多,在正负样本量都足够的情况下,ROC曲线足够反映模型的判断能力。因此,对于同一模型,PR和ROC曲线都可以说明一定的问题,而且二者有一定的相关性,如果想评测模型效果,也可以把两条曲线都画出来综合评价。对于有监督的二分类问题,在正负样本都足够的情况下,可以直接用ROC曲线、AUC、KS评价模型效果。在确定阈值过程中,可以根据Precision、Recall或者F1来评价模型的分类效果。对于多分类问题,可以对每一类分别计算Precision、Recall和F1,综合作为模型评价指标。
在上图中,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。
参考
全面了解ROC曲线
接受者操作特征曲线
ROC曲线详解
机器学习算法中的准确率、精确率、召回率和F值
机器学习中的性能指标:精度召回率,PR曲线,ROC曲线和AUC,及示例代码
机器学习中的性能指标:精度、召回率、PR曲线,ROC曲线和AUC
精度、召回率
基本概念
可以通过下图来帮助理解
预测为正/阳性 | 预测为负/阴性 | 指标 | |
---|---|---|---|
真值为正/阳性 | True Positive(TP) | False Negative(FN) | R e c a l l = T P T P + F N Recall = \\fracTPTP+FN Recall=TP+FNTP |
真值为负/阴性 | False Positive(FP) | True Negative(TN) | S p e c i f i c i t y = T N T N + F P Specificity=\\fracTNTN+FP Specificity=TN+FPTN |
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy= \\frac TP +TNTP+TN+FP+FN Accuracy=TP+TN+FP+FNTP+TN | P r e c i s i o n = T P ( T P + F P ) Precision=\\fracTP(TP+FP) Precision=(TP+FP)TP | F 1 S c o r e = 2 ∗ R e c a l l ∗ P r e c i s i o n R e c a l l + P r e c i s i o n F1 Score=\\frac2*Recall *PrecisionRecall+Precision F1Score=Recall+Precision2∗Recall∗Precision |
-
精度 ( P r e c i s i o n ) (Precision) (Precision):预测为阳性样本的准确程度。在信息检索领域也叫查准率。换句话理解:判定为阳性的正确个数除以所有判定为阳性的总素。
-
召回率 ( R e c a l l ) (Recall) (Recall):也称作敏感度(sensitivity),全部阳性样本中被预测为阳性的比例。在信息检索领域也称作查全率。
其中精度和召回率同时越高,说明模型性能越好。但精度和召回率在某些情况下是相互矛盾。例如:
阳性/阴性=50/50,模型只识别出一个为阳性,其余被识别为阴性。此时precision=1/(1+0)=100%, recall=1/(1+49)=2%.
F-Score
通过加权平均综合precision和recall,可以得到F-Score:
F
S
c
o
r
e
=
(
1
+
a
2
)
∗
R
e
c
a
l
l
∗
P
r
e
c
i
s
i
o
n
a
2
∗
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F Score=\\frac(1+a^2)*Recall *Precisiona^2*Precision+Recall
FScore=a2∗Precision+Recall(1+a2)∗Recall∗Precision
设置
a
=
1
a=1
a=1,可以得到F1-Score:
F
1
−
s
c
o
r
e
=
2
∗
R
e
c
a
l
l
∗
P
r
e
c
i
s
i
o
n
R
e
c
a
l
l
+
P
r
e
c
i
s
i
o
n
F1-score=\\frac2*Recall *PrecisionRecall+Precision
F1−score=Recall+Precision2∗Recall∗Precision
度量曲线
PR曲线
PR曲线(Precision-Recall Curve):
- 横轴:召回率;
- 纵轴:精度。
理想性能是右上角(1,1)处。PR曲线越往右上凸,说明模型性能越好。
PR曲线绘制方法:
- 根据模型的预测数值,对样本进行从高到低排序,排在前面的样本是正例的可能性更高。
- 按此顺序逐个样本作为正例进行预测(或设置阈值截断正例和负例),则每次可以计算一个召回率和精度。
- 将这些值连成(拟合)一条曲线。
使用scikit-learn官方代码示例:
使用鸢尾花数据集来绘制PR曲线。
from sklearn.metrics import PrecisionRecallDisplay
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
# Add noisy features
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)
# Limit to the two first classes, and split into training and test
X_train, X_test, y_train, y_test = train_test_split(
X[y < 2], y[y < 2], test_size=0.5, random_state=random_state
)
classifier = make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
classifier.fit(X_train, y_train)
display = PrecisionRecallDisplay.from_estimator(
classifier, X_test, y_test, name="LinearSVC"
)
_ = display.ax_.set_title("2-class Precision-Recall curve")
ROC曲线
ROC曲线(Receiver-operating-characteristic curve):
- 横轴:False Positive rate(FPR),度量所有阴性样本中被错误识别为阳性的比率。
F
P
R
=
1
−
S
p
e
c
i
f
i
c
i
t
y
FPR=1-Specificity
FPR=1−Specificity。
F P R = F P F P + T N FPR =\\fracFPFP+TN FPR=FP+TNFP - 纵轴:True positive rate(TPR),即recall。度量所有阳性样本被识别为阳性的比例。
理想性能在左上角(0,1)处。ROC曲线越往左上凸,说明模型性能越好。对角线为随机识别的ROC曲线。绘制方法与PR曲线相似。
PR曲线和ROC曲线的比较
- ROC曲线:对于各类别之间样本分布比例不敏感,因为FPR和TPR各自只跟真值为负或真值为正的样本相关。
- PR曲线:对于各类别样本分布比例敏感,因为precision同时和真值正负的样本都相关。
AUC
曲线下方面积(Area under the Curve, AUC):将曲线度量所表达的信息浓缩到一个标量表达。
- A U C = 1 AUC=1 AUC=1,是完美分类起
- 0.5 < A U C < 1 0.5<AUC<1 0.5<AUC<1:优于随机猜测。模型妥善设定阈值,能有预测价值
- A U C = 0.5 AUC=0.5 AUC=0.5:跟随机猜测一样,模型没有预测价值
- A U C < 0.5 AUC<0.5 AUC<0.5:比随机猜想还差。
使用scikit-learn官方示例代码
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import roc_auc_score
# Import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target
# Binarize the output
y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]
# Add noisy features to make the problem harder
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
# shuffle and split training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
# Learn to predict each class against the other
classifier = OneVsRestClassifier(
svm.SVC(kernel="linear", probability=True, random_state=random_state)
)
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
plt.figure(dpi=100)
lw = 2
plt.plot(
fpr[2],
tpr[2],
color="darkorange",
lw=lw,
label="ROC curve (area = %0.2f)" % roc_auc[2],
)
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("Receiv以上是关于ROC曲线和PR曲线的主要内容,如果未能解决你的问题,请参考以下文章
机器学习中的性能指标:精度召回率,PR曲线,ROC曲线和AUC,及示例代码
机器学习中的性能指标:精度召回率,PR曲线,ROC曲线和AUC,及示例代码