1 p8 E0 R2 J+ U6 ^* B2 p7 Y
ROC曲线横坐标是FPR(False Positive Rate),纵坐标是TPR(True Positive Rate) # M: I, ^' p9 T! h% s4 r$ ^/ T8 G- o接下来我们考虑ROC曲线图中的四个点和一条线。9 y; u; q, r7 x- i1 L
+ f* O a% f) Y第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false 9 q1 f1 `3 `; Q, \. K5 ~positive)=0。这是一个完美的分类器,它将所有的样本都正确分类。 % l3 I! q2 f# \+ f4 @- |6 B第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。& Y* ?( K& `0 Y8 A* Y+ g/ K
第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true' o+ Q4 C4 B, _9 b( }
positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。 D4 j. V0 v" Y% F. t1 N' Y第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。 3 I$ b4 `/ A4 v' E2 K如何画ROC曲线: . Q5 F! [& R9 L5 [; L; G& q1 l+ R $ {. w" G# c& K' _. M) a对于一个特定的分类器和测试数据集,显然只能得到一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值,这又是如何得到的呢?我们先来看一下wikipedia上对ROC曲线的定义:9 X, f: P% ]* _$ `& e. {
! c' ]! Q8 B4 P0 QA receiver operating characteristic curve, i.e. ROC curve, is a 0 c/ d8 c1 e* K$ @# D6 l6 K4 Mgraphical plot that illustrates the diagnostic ability of a binary' e) `( ~5 @3 m/ K' M7 B6 l2 m5 R
classifier system as its discrimination threshold is varied.+ ?- e4 `; A/ k. F6 Y
译:ROC曲线是由一系列因区分阈值变化产生的点,用于描述二分类模型的判断能力0 L( K0 q, r4 V7 j+ K
这里的关键在于 “its discrimination threshold is varied” ,因为对于一个二分类模型,它的输出结果其实是判断这个样本属于正样本的概率值,假如我们已经得到了所有样本的概率输出(属于正样本的概率),现在的问题是如何改变“discrimination threashold”?我们根据每个测试样本属于正样本的概率值从大到小排序。下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率 8 J* i7 n" ~. f5 n: r; _6 h
; o6 {! M: G2 h$ r8 r' ]- M1 L以下说法正确的是( ABD)。【不定项】 " y9 a! b0 h! S/ M; Q+ C. WA 随着阈值的降低,TPR与FPR都会增大。 1 K$ U/ s; O* ^3 M/ v% k& g& uB TPR与召回率的值是相同的。/ c- z U$ @$ Q+ N
C 如果AUC的值非常低,例如,0.1,则该模型效果很差,也很难调优。& d! E. M0 r: n! Y
D 无论是什么分类模型,ROC曲线一定会经过(0, 0)与(1,1)这两个点。 % S- R z0 y# p6 E4 _4.3 ROC曲线程序示例% o \7 n, e x, j/ i. N' I6 b
& A- r- J) l9 ^ K我们首先来看一个简单的程序示例,借此来说明sklearn库中,ROC曲线的实现细节。# W. s! g# R( j2 d
4 z, {" q& Q) u; h5 I" x4.3.1 roc_curve函数的参数& p% C' d2 [3 U: N4 Q9 b
import numpy as np : x# H8 Q% n1 y) ^! h. E7 t3 E Rfrom sklearn.metrics import roc_curve, auc, roc_auc_score ( a* r+ n2 z* t7 ^" n1 M% e, h* |# Yy = np.array([0, 0, 1, 1])9 Z* u: D, u4 S3 \8 z# `8 T
scores = np.array([0.2, 0.4, 0.35, 0.8])- N- h8 u- P5 p5 N- E. t
# 返回ROC曲线相关值。返回FPR,TPR与阈值。当分值达到阈值时,将样本判定为正类, % C6 h% N! ~" D+ o5 _3 `# 否则判定为负类。 " j z9 o) _4 e4 W# y_true:二分类的标签值(真实值)。* p* R# f& i! E/ a* _. L
# y_score:每个标签(数据)的分值或概率值。当该值达到阈值时,判定为正例,否则判定为负例。1 U' x9 P9 C2 E$ v
# 在实际模型评估时,该值往往通过决策函数(decision_function)或者概率函数(predict_proba)获得。 4 g5 }& v, h, t1 U: ^# pos_label:指定正例的标签值。 % U$ o" X/ P! }* E- Hfpr, tpr, thresholds = roc_curve(y, scores, pos_label=1)' O8 |% t1 {/ C" f
print(f"fpr:{fpr}") 0 A E% ], x% l$ Rprint(f"tpr:{tpr}") ( H9 N) D6 o' s ~print(f"thresholds:{thresholds}"): ^& Z T3 ^+ }$ }% {
# auc与roc_auc_score函数都可以返回AUC面积值,但是注意,两个函数的参数是不同的。 ( Q; q; | F7 R4 @print("AUC面积值:", auc(fpr, tpr))* f. J: D* v( S% ?; n
print("AUC面积得分:", roc_auc_score(y_true=y, y_score=scores)) , x, R; w" }& R+ I1 \% J, ~#### 3.3.2 roc_curve函数的返回值 0 @" D: D/ r0 M) K; `, i8 b, E * j6 D0 ]( b; r+ e1 O8 e% S `9 f结果: / `% p0 h9 B; L4 T- H; Y