数学建模社区-数学中国
标题:
详细讲解分类模型评估
[打印本页]
作者:
杨利霞
时间:
2020-4-19 11:53
标题:
详细讲解分类模型评估
4 i* V; w2 W+ n. a V7 z7 K1 ~
详细讲解分类模型评估
分类模型评估
( b* u4 F7 ^$ l& i% z( F# e
% @; U; r8 E2 i( b' h
1、分类模型
( K7 R6 a' m p* v+ ?/ g4 D+ Y
主题:如何对分类模型进行评估
0 A# C% a: l" \) E2 H9 @
目标:
. b" K& F5 X5 c& N1 w# Z5 t
2、混淆矩阵
1 }% H) o0 Y; C3 N3 w
3、评估指标
, }( Z5 m' R' w- w% I: }5 Y
3.1 正确率
- x- [, @# A" v7 F0 @6 j
3.2 精准率
7 {3 y( |* y' M. Z
3.3 召回率
* @( k' Y$ d& p3 W9 D) M+ M9 K
3.4 调和平均值F1
) G0 Z* ?6 j$ U* P2 O
4、ROC和AUC
: K( d1 O' {4 ~& T. A. N9 ~
4.1 ROC曲线
+ G4 p& X e5 G: m8 y" ~- o. W$ @, b
如何画ROC曲线:
2 ~3 ^5 O% T4 G# _4 H( c
4.2 AUC
% _5 K+ s1 ?6 F( E$ |: g9 Y8 `
4.3 ROC曲线程序示例
4 |: c, d; d: o& ?' V Y5 S! v
4.3.1 roc_curve函数的参数
- p- @, ?" J# k1 i0 f* m. B, \. e
4.3.2 roc_curve函数的返回值
& [- K: M j* i
4.3.3 绘制ROC曲线
& v' O+ M9 v8 \& `
5、总结
1 [1 [0 V, b0 O! P; V
1、分类模型
" f* s& t. `+ V1 s/ @
* b, ?* M1 U& d; n4 z' w g
分类问题在我们日常生活中处处可见,比如我们对帅哥的分类,可能对帅哥分为非常帅和一般帅。比如我们平时刷淘宝,淘宝根据我们平时的喜好给我们推送产品,那我们就会把产品分为感兴趣和不感兴趣两类。
) s4 U6 @3 C, v5 |
上述所说的问题就是典型的分类问题,确切的说其实就是二分类问题。
. |, \ j3 a2 V# z: `9 |" v# q
能够解决这些二分类问题的数学模型就被称为二分类模型。
! f& y+ Q! ` h4 ~. v: m
用数学的方式表达就是,给定自变量X,代入到我们的分类模型F,会输出因变量y,y的取值为0或1,其中0代表负样本(一般帅的帅哥、不感兴趣的推送),1代表正样本(非常帅气的帅哥、感兴趣的推送)。
+ z0 c1 o% b R+ s& X+ w) a
) a3 U# o9 [* s* N" q/ L+ ]
主题:如何对分类模型进行评估
) T o$ Z! g9 R9 l/ I, M& U; q
1 E/ z& P8 S W J
目标:
1 H$ K$ R# P# j8 A- U2 a
8 L3 E" F7 L( G. b& P- D1 u2 S
能够熟知混淆矩阵的含义。
6 n4 \7 \6 o3 ]8 s/ R
能够使用各种指标对分类模型进行评估。
3 J+ g) @; ]; Y
能够独立绘制ROC曲线,并熟悉该曲线细节。
: `/ o" r. {$ z+ l: r, S
能够对样本不均衡进行处理(扩展内容)。
9 g5 y3 z$ F5 \0 }+ h' o
2、混淆矩阵
0 K2 e$ q, A1 ?6 d6 T' b
* g5 G1 A6 `( i2 B* b8 ~
混淆矩阵,可以用来评估模型分类的正确性。
4 X: I7 g! C N- [
该矩阵是一个方阵,矩阵的数值用来表示分类器预测的结果,包括真正例(True Positive),假正例(False Positive),真负例(True Negative),假负例(False Negative)。
3 Y- k- D0 i. x: G0 q% }
2020-4-19 11:42 上传
下载附件
(67.71 KB)
6 K" }, G$ z5 i# Q8 r" ^
矩阵的形状是2 x 2,其中, - 矩阵的左上角表示,预测值为1,实际值为1(True Positive,简称TP); - 右上角表示预测值为1,实际值为0(False Positive,简称FP); - 左下角表示预测值为0,实际值为1(False Negative,简称FN); - 右下角表示预测值为0,实际值为0(True Negative,简称TN);
* s* J' M8 j, v- f* P y7 C) g! P
; G0 O2 \6 \. m0 Y& y. z
真负例(TN)+ 假正例(FP)——每个类别真实存在的负例的数量
- A' {# ?" B. y' C( s( M/ W
假负例(FN)+ 真正例(TP)——每个类别真实存在的正例的数量
+ E4 S) |' [: U2 P
真负例(TN)+ 假负例(FN)——每个类别预测的真负例数量
* D0 N9 B2 b' r4 k- P
假正例(FP)+ 真正例(TP)——每个类别预测的真正例数量
+ p1 G! ~( m) L; h& H) O6 g
其中:
2 y9 o2 k: y' n: C1 q
6 s6 a) Y8 P6 Z% `* q2 \9 k! d
TP:真正例,实际为正预测为正;
4 S8 h( D. D( |, l0 t% c/ k# q9 i' s# @
FP:假正例,实际为负但预测为正;
5 |3 K. z! [5 v4 l. x+ i) F$ _
FN:假反例,实际为正但预测为负;
' L% W- Y% a. ] v) }$ f; w8 A: F3 K
TN:真反例,实际为负预测为负
9 t5 A, x: q& i% V
接下来,我们通过数据来看下鸢尾花的混淆矩阵:
' `9 o7 B/ G8 E: e
import numpy as np
" P2 |/ W. D g
from sklearn.datasets import load_iris
" Y' _1 \* [) d6 U* w: G
from sklearn.linear_model import LogisticRegression
4 m9 R# {* f% x
from sklearn.model_selection import train_test_split
" x, w7 t2 j0 g; m" _. F3 e
# 混淆矩阵
" v* y- S9 P: n* C1 k% i5 ^& O
from sklearn.metrics import confusion_matrix
, V/ z; b0 o2 w9 F& M
import matplotlib.pyplot as plt
9 ~4 _6 w8 j2 N; l
import warnings
/ w9 P( ^8 [+ p" I& Q
0 |4 b$ U& R y4 x4 q9 O% D
plt.rcParams["font.family"] = "SimHei"
! C+ h+ Q% ~7 `+ ?$ H6 [- Y
plt.rcParams["axes.unicode_minus"] = False
, \/ d. K1 H2 s4 E: J! w; q4 V
plt.rcParams["font.size"] = 12
/ _6 b+ J+ Y( [6 {# {6 I
warnings.filterwarnings("ignore")
0 j7 T# @+ t+ N" S0 |2 t
) Y2 w) |3 @) O5 r' r7 N2 q
iris = load_iris() #导入鸢尾花数据集
) I+ A3 i4 Z$ }& |! Y
X, y = iris.data, iris.target
9 j) W: N$ N8 r- F! C; ?
X = X[y != 0, 2:]
3 s) t& i% M" h8 c) y4 P4 ?' j
y = y[y != 0]
( j* }8 ?7 z. g8 v/ N" ~
y[y == 1] = 0
8 a$ e; C" y% A: M
y[y == 2] = 1
' E" l5 G- f, Y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=2)
. i2 ~0 s1 U9 _2 l
lr = LogisticRegression() #使用逻辑回归
0 ^% {2 _) N8 @: x) V5 I
lr.fit(X_train, y_train)
) q1 u Y" W" b; m1 D( e; i
y_hat = lr.predict(X_test)
: G; g" A$ D; r9 Z! r
# 根据传入的真实值与预测值,创建混淆矩阵。
, c$ K# q) D, Y# K% r
matrix = confusion_matrix(y_true=y_test, y_pred=y_hat)
! |( @# Q3 d0 @6 x [* j
print(matrix)
$ Q3 w/ T( g; A7 e. {
1 ^% n# u: S f+ Q$ k$ p
- M0 O0 \$ h8 U! [1 w
输出结果:
9 ?. g3 ?) X' g/ u
2020-4-19 11:42 上传
下载附件
(12.51 KB)
0 ]# a5 r( o U( L3 Y# ^
我们还可以对其进行可视化操作:
5 A8 C! R! N2 M2 U3 O) I: v
mat = plt.matshow(matrix, cmap=plt.cm.Blues, alpha=0.5) #cmap 指定颜色图色系,alpha透明度
, m* G3 a8 R s) @. C2 L
label = ["负例", "正例"]
7 y; M% c9 q3 w/ \. f" p8 C
ax = plt.gca()
" D7 l9 j) S' {) Z
ax.set(xticks=np.arange(matrix.shape[1]), yticks=np.arange(matrix.shape[0]),
! E% T# e" `, N) F& e
xticklabels=label, yticklabels=label, title="混淆矩阵可视化\n",
4 j' S0 A7 ]; ?5 H+ ~$ p
ylabel="真实值", xlabel="预测值")
4 ^) D& w& {% q0 A- l
for i in range(matrix.shape[0]):
8 a+ W9 u+ w; g
for j in range(matrix.shape[1]):
+ ]- ~- _) b+ S# R2 G
plt.text(x=j, y=i, s=matrix[i, j], va="center", ha="center")
1 H" i0 I+ f: |* c" G E
a, b = ax.get_ylim()
# K9 z+ R3 Q% a. ], e
ax.set_ylim(a + 0.5, b - 0.5)
% J& F! e" P* y
plt.show()
; _% v- _) U; Z
4 U* @3 s& I' b2 H
; v4 \( s& R0 r# n0 A$ |. f. h
代码解析:
# ^/ a1 D8 O! G
matshow( ) 绘制矩阵,alpha 透明度
+ _. L6 ]- F/ P" O+ x' O
结果:
+ v; }" D3 t& ]) j, c" k T
2020-4-19 11:42 上传
下载附件
(7.85 KB)
/ W; z6 X {# L4 q+ {5 a
练习:
0 ]4 T f/ l. A; m' M
8 Z ~8 R, q; m0 H
关于混淆矩阵,说法正确的是( ABCD)。【不定项】
8 f+ u9 w. O, v, \5 z" l3 _
A 混淆矩阵可以用来评估分类模型。
% V' i! o+ {/ j2 U3 g
B 混淆矩阵中,TP与TN的数值越大,则分类的效果越好。
; q2 x6 C! A7 o3 R# s$ T
C 混淆矩阵一行元素的和代表某个类别的实际数量。
0 Z0 ?& h6 O2 X9 G. \
D 混淆矩阵一列元素的和代表某个类别的预测数量。
% k6 c, P, b+ Q8 I
3、评估指标
2 U% Z1 S: J& Q" ?- w
( Y, Y, R& G; C5 \8 u. f& R
对于分类模型,我们可以提取如下的评估指标:
0 ~. r. Z5 f1 r' c7 V* P, Q
& q# A3 L* g* X" A" k
正确率(accuracy)
* m: g, g8 Y; _: Q! u- N1 N( v
精准率(precision)
) Q6 v% u/ D V, ]
召回率(recall)
! ~# e& l4 Y; H8 a M4 v
F1(调和平均值)
; T9 e$ @$ O; q9 v
3.1 正确率
) s7 n0 v. d- n* a* ^% @6 S1 E+ u
2020-4-19 11:43 上传
下载附件
(17.27 KB)
8 A4 e) U2 g4 h) ]' ]4 P: [; }
正确率(准确率)定义如下:
% z7 u: E" h& d4 X
衡量所有样本被分类准确的比例。
/ o+ `% L K( d7 S/ i4 F4 L5 Z
Accuracy = (TP+TN) / (TP+FP+TN+FN)
' f$ e ]# a" C, T, C# l) x5 f; U A
, S' X$ D' _2 @* Q- X
预测正确的数量除以总数量。
: j/ {5 O' t* n$ e% @6 ~
. y1 _4 {* g; O. V" N( c
3.2 精准率
. X3 K/ E" d) ?- r5 [5 s
2020-4-19 11:43 上传
下载附件
(12.31 KB)
" Q8 p7 G9 G1 `: R( \4 n' H. k
查准率(精准率)定义如下:
- h# v! D) k: |( l" m
衡量正样本的分类准确率,就是说被预测为正样本的样本有多少是真的正样本。
. P: r; N" f4 j
Precision = TP / (TP+FP)
6 ~5 M) m$ \4 n3 I8 G
& _) w' U5 U, N/ J, P" y6 _
精准率只考虑正例。
* x0 Q7 c5 l, C: w8 a* N, A
& W. ^! f8 `9 c8 y4 C8 Y
3.3 召回率
5 r( g& p* U& {3 W7 S
2020-4-19 11:44 上传
下载附件
(10.08 KB)
4 O5 s+ N3 o6 h
查全率(召回率)定义如下:
3 B8 }: _, E8 P, b5 D
表示分类正确的正样本占总的正样本的比例。
' u& B& {' `5 U" T6 M4 V" I T
Recall = TP / (TP+FN)
: J! ?* v5 q' c# G2 ^& S6 \# a
; P. R3 j1 L# K* B
, X( ~! ?& T: E+ M0 n) E
3.4 调和平均值F1
! ^/ U0 }. I3 e
2020-4-19 11:44 上传
下载附件
(22.94 KB)
0 f# t/ v! o- V, Y. u; l
F值(F1-scores)调和平均值F1定义如下:
7 V" B! H( o+ y- D- [
精确率和召回率的调和平均。
3 l0 p( l5 o9 r$ G1 U5 Z
精准率Precision和召回率Recall加权调和平均数,并假设两者一样重要。
: o) \: y% K* A& f }4 g
0 d9 @! h. Z2 T. k P+ A( N" O
F1-score = (2Recall*Precision) / (Recall + Precision)
: {7 [* j5 V s7 P
( ~, |3 K2 N& ^* Q! p, g( t% j4 o
精准率和召回率是一对矛盾的度量。一般来说,精准率高时,召回率往往偏低;而召回率高时,精准率往往偏低。通常只有在一些简单任务中,才可能使二者都很高。
: ^; ^% H4 k) O5 N; d
最好的分类器当然是准确率、精确率,召回率都为1,但实际场景中几乎是不可能的,而且精确率和召回率往往会相互影响,一个高了另一个会有所下降,因此在实际应用中要根据具体需求做适当平衡。
. l6 r/ V5 ~. } k+ D' A5 G
让我们做个练习加深下印象吧!
8 Z1 [/ R, o3 r, M6 b
+ V7 B2 }. r5 L3 R( P- A0 i
以下说法正确的是( C )。
q0 m5 Z1 p" S# w F& [5 x6 w
A 使用正确率去评估一个分类模型,效果会比精准率更好。
2 ?3 a+ I# P1 h1 @, E" w K, U, g% U
B 使用精准率去评估一个分类模型,效果会比召回率更好。
' b/ S. J+ V+ j e- X3 h4 r. O, S
C 精准率与召回率通常要联合使用。
) `. U& o: s1 C7 c7 U
D 精准率与召回率如果有一个值较低,F1值也可能会较高。
% Y8 z" o+ J$ d' Y7 X y+ |% W3 C
如果精准率和召回率我们只能选择重视一个,我们会更看重( C )。
z6 N( p, u$ g1 @7 u
A 精准率。
4 \3 R3 q2 o$ c) i) ]3 @6 Z
B 召回率。
/ \0 q6 E8 d0 U7 u
C 具体场景不同,重视谁也会不同。
( {- L( ~. I8 I' b- Z7 G
接下来我们通过程序来说明下:
" U3 y* c0 L' V1 R
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
3 l( @) f6 l- U. W
+ f# p2 V w' ~& K4 M N
print("正确率:", accuracy_score(y_test, y_hat))
. o ]- F% Z/ I* {# \3 S
# 默认将1类别视为正例,可以通过pos_label参数指定。
& a, P7 f5 N7 g \) K
print("精准率:", precision_score(y_test, y_hat))
& a- F+ n3 x! ~$ Z/ B9 }
print("召回率:", recall_score(y_test, y_hat))
+ Z% x5 h# C2 w3 e9 v
print("F1调和平均值:", f1_score(y_test, y_hat))
1 O+ q. ~# ~% v4 q; L9 \# X. W {0 _
# 我们也可以调用逻辑回归模型对象的score方法,也能获取正确率。
# S/ [) C) W0 w( {4 K
# 但是需要注意,score方法与f1_score函数的参数是不同的。
* t/ f; ?! g3 n7 @6 q4 w3 ~
print("score方法计算正确率:", lr.score(X_test, y_test))
6 U7 }0 D M& y5 v2 K, ]- s
7 N) h, u) _2 N# @* `1 ~% x5 _
1 |( ]! w& o2 T& \/ ]; B1 B" j
结果:
$ m- g7 z! ^8 v9 j
2020-4-19 11:44 上传
下载附件
(5.55 KB)
5 }3 i9 u; `! ]; H1 p
除此之外,我们也可以使用classification_report函数来查看模型的分类统计信息,该方法会返回字符串类型,给出相关的分类指标评估值。
/ _+ j" w% c6 A# W% V! Z
from sklearn.metrics import classification_report
& U) E" a5 s/ V- B0 _
% i& w2 M! g# E: g! X T s! l$ P( L
print(classification_report(y_true=y_test, y_pred=y_hat))
/ l8 V) F' a$ v
" C$ j3 R, p; f2 @% `
& D: l3 b- _% Z/ Y# Z
结果:
2 h+ V5 a$ Q7 W; b% A
2020-4-19 11:45 上传
下载附件
(142.24 KB)
, w7 E( e! v( L2 t r* Q1 S* U
g; H% u' z3 v9 j3 o6 L
练习:
- Q; Y* j V& u: F* I
. g/ E& k9 O* c9 I M9 m
如果使用精准率与召回率评估二分类模型时,我们应该将哪个类别设置为正例? (B)
7 j, l; c* H1 b9 i H, j
A 随意
6 ?% t( ~6 ^ X, _3 O& I7 ^ j
B 关注的类别
* P6 ~; j# ] r& S+ E
C 不关注的类别
* |' d+ ^2 w6 G8 C) `
4、ROC和AUC
9 P- {! h" M) ~! N: h
7 ~! U( [( }) |4 ~
ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣。
4 J1 @5 f( y' q1 f" V
$ B' q! L- b' }, \9 s
4.1 ROC曲线
* R) O) }; S7 Q
2020-4-19 11:46 上传
下载附件
(40.24 KB)
; O2 U. ~7 C: j
ROC曲线(Receiver Operating Characteristic——受试者工作特征曲线),使用图形来描述二分类系统的性能表现。图形的纵轴为真正例率(TPR——True Positive Rate),横轴为假正例率(FPR——False Positive Rate)。其中,真正例率与假正例率定义为:
- x5 Q& @4 p2 R: ~8 W5 h7 K7 a- b- A
' B9 k' s7 v) G0 q8 O
ROC曲线通过真正例率(TPR)与假正例率(FPR)两项指标,可以用来评估分类模型的性能。真正例率与假正例率可以通过移动分类模型的阈值而进行计算。随着阈值的改变,真正例率与假负例率也会随之发生改变,进而就可以在ROC曲线坐标上,形成多个点。
) s2 V6 p- i+ a& L9 }& k
' ~6 V/ o I1 Z/ f' v |' W
ROC曲线反映了FPR与TPR之间权衡的情况,通俗来说,即在TPR随着FPR递增的情况下,谁增长得更快,快多少的问题。TPR增长得越快,曲线越往上凸,模型的分类性能就越好。
( x# F' y- f( W, E2 b2 e1 V$ ~
) G7 ]6 q# U* r( B
ROC曲线如果为对角线,则可以理解为随机猜测。如果在对角线以下,则其性能比随机猜测还要差。如果ROC曲线真正例率为1,假正例率为0,即曲线为与构成的折线,则此时的分类器是最完美的。
+ [3 m; z+ I( o2 v& i
- V& g% u" N$ U2 n
下图就是ROC曲线的一个示意图:
8 w2 B" q+ k; Z5 E
2020-4-19 11:47 上传
下载附件
(73.81 KB)
4 z# |$ C% G5 ^ `6 R+ Y
ROC曲线横坐标是FPR(False Positive Rate),纵坐标是TPR(True Positive Rate)
) o+ S% E# g- |& o8 v& {3 b
接下来我们考虑ROC曲线图中的四个点和一条线。
, F2 L$ q8 S5 k4 q
- H9 A& m3 A) F" k/ H& ]5 p) ?
第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false
+ x2 F6 J; O, ^* I5 ~3 g+ y( x
positive)=0。这是一个完美的分类器,它将所有的样本都正确分类。
6 I$ x! ]: g( q/ s7 X" B
第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。
# G0 n& b* [ p1 V r7 X$ G$ l
第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true
( x2 e7 D9 `# |- k4 k
positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。
. w! j4 D/ \2 I* p8 \- V" ?4 K
第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。
7 M; B u( H' b8 |7 h, l
如何画ROC曲线:
* U9 P6 [, J4 u$ v( ~5 f
5 J2 m% a: Z0 w3 d0 T4 q% _
对于一个特定的分类器和测试数据集,显然只能得到一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值,这又是如何得到的呢?我们先来看一下wikipedia上对ROC曲线的定义:
; F; M3 U0 Z* t$ M
% V; J# z$ C& D, u( c, G
A receiver operating characteristic curve, i.e. ROC curve, is a
" ` o! r& m3 K
graphical plot that illustrates the diagnostic ability of a binary
; e T# Y/ b, x/ s) q
classifier system as its discrimination threshold is varied.
Q- M# u. F" h, W; r D3 J
译:ROC曲线是由一系列因区分阈值变化产生的点,用于描述二分类模型的判断能力
8 h9 l$ [- Y$ F: m, o- t' b5 O, [
这里的关键在于 “its discrimination threshold is varied” ,因为对于一个二分类模型,它的输出结果其实是判断这个样本属于正样本的概率值,假如我们已经得到了所有样本的概率输出(属于正样本的概率),现在的问题是如何改变“discrimination threashold”?我们根据每个测试样本属于正样本的概率值从大到小排序。下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率
" V3 a$ Y% i% @! C: g
2020-4-19 11:48 上传
下载附件
(12.1 KB)
3 E2 U% Z% b! t8 U$ B2 K2 z
然后我们按照样本的score值,从大到小依次作为阈值,当样本score值大于等于阈值时则判定为正样本,否则为负样本。
1 H* T% B. M# A- H: C1 \
例如第一个阈值取0.9,这时只有id=1的样本被预测为正样本,其余都是负样本,此时TPR=1/1+9=0.1, FPR=0/0+10=0。还例如:对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。
" P; c* S5 \' u4 I
K, b* ?# ^# d, Y) Q
详细如下:
' Q) N/ j/ _9 t1 I4 E
2020-4-19 11:48 上传
下载附件
(203.28 KB)
9 ^/ J: P/ q+ h! K
由此我们便得到了一组(FPR,TPR)的值,可以绘制出ROC曲线:
& ]1 I# B# |* w. k
2020-4-19 11:49 上传
下载附件
(63.27 KB)
# w% ]: }& } @/ R
当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。
' |( B# O$ C9 B, L2 |
/ Z, D7 g/ U( X& T$ v
4.2 AUC
4 T; ` |# Y' @4 g$ y$ l+ y- K0 W
2020-4-19 11:49 上传
下载附件
(90.3 KB)
5 \: V6 T; ?% D* j5 d P9 `
AUC(Area Under the Curve)是指ROC曲线下的面积,使用AUC值作为评价标准是因为有时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而AUC作为数值可以直观的评价分类器的好坏,值越大越好。
1 Q g2 Y9 @/ n4 k' R( l6 C3 p9 \
# J9 z" }2 c: u. O. ~5 l* E/ w6 m
AUC是ROC曲线下的面积。
- f, h1 c1 O1 m( w0 j
AUC的取值为[0.5-1],0.5对应于对角线的“随机猜测模型”。
2 Q1 b# l7 x @/ D3 u( |3 d
AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。
. N- U5 d) F/ u
" _1 Y# Z/ [7 K1 W$ }4 H4 Z
从AUC判断分类器(预测模型)优劣的标准:
$ N8 k% U$ k% \
5 ]# `( V3 V# ~2 l; ~3 l4 `9 I
4 w4 i& ?( R$ @. k( \6 a
例如一个模型的AUC是0.7,其含义可以理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分(概率)高于对负样本的打分。
. G+ s% P8 P2 c* o
' d+ k5 Y% W' h p' q$ X- J
三种AUC值示例:
7 s0 \5 q9 A3 b, c g* i$ @& W$ A/ D
2020-4-19 11:50 上传
下载附件
(47.71 KB)
2 E5 E D8 l# Q- e7 F3 F! H
简单说:AUC值越大的分类器,正确率越高。
- C. i) m4 y( h, B
9 ? R, e# ^2 w( r8 ]7 s+ W
那么为什么要用AUC作为二分类模型的评价指标呢?为什么不直接通过计算准确率来对模型进行评价呢?
' u! u( @3 w' p) _* ?/ i( _3 h
因为机器学习中的很多模型对于分类问题的预测结果大多是概率,即属于某个类别的概率,如果计算准确率的话,就要把概率转化为类别,这就需要设定一个阈值,概率大于某个阈值的属于一类,概率小于某个阈值的属于另一类,而阈值的设定直接影响了准确率的计算。也就是说AUC越高说明阈值分割所能达到的准确率越高。
: Y# Y7 D4 k% ?1 e0 Q
6 q' v; c) q8 N, j
小练习:
6 l( \8 W8 k& H+ ?/ _3 P
2 G4 f. [) P A6 D$ k) q
以下说法正确的是( ABD)。【不定项】
, {2 C! F& M! [4 M# b
A 随着阈值的降低,TPR与FPR都会增大。
' y6 [0 R, R# c4 }
B TPR与召回率的值是相同的。
; }8 g; `; }2 f8 B# m' U
C 如果AUC的值非常低,例如,0.1,则该模型效果很差,也很难调优。
7 Y- s3 D, \$ z( M$ ^
D 无论是什么分类模型,ROC曲线一定会经过(0, 0)与(1,1)这两个点。
) \- [" N q2 s- G/ [/ N7 f
4.3 ROC曲线程序示例
- C9 u. i0 w S' H; A9 l
1 J/ w6 k0 A# E4 x& @+ U! s! v. g
我们首先来看一个简单的程序示例,借此来说明sklearn库中,ROC曲线的实现细节。
9 v4 F8 V' t6 ]+ X
# C# Y7 ~# V2 C' y
4.3.1 roc_curve函数的参数
( @) c2 c% Q- I9 n
import numpy as np
% r, ?+ Q4 C; N; s. g; m) I
from sklearn.metrics import roc_curve, auc, roc_auc_score
" O8 e: V0 }+ e$ v; I
y = np.array([0, 0, 1, 1])
5 a5 n. @. J _* j
scores = np.array([0.2, 0.4, 0.35, 0.8])
7 _+ U# V# U, E f) L4 O5 P$ m
# 返回ROC曲线相关值。返回FPR,TPR与阈值。当分值达到阈值时,将样本判定为正类,
+ m: d( n% x, e* @4 K
# 否则判定为负类。
# [4 w% P- N- ^5 \% j
# y_true:二分类的标签值(真实值)。
/ o! `8 a1 H% S- o* A' G* K( H+ r
# y_score:每个标签(数据)的分值或概率值。当该值达到阈值时,判定为正例,否则判定为负例。
: T" q( [% S( j7 N% l1 Z: u+ U
# 在实际模型评估时,该值往往通过决策函数(decision_function)或者概率函数(predict_proba)获得。
% U$ l$ W9 a- h; w3 e% U. l
# pos_label:指定正例的标签值。
) b: e; A: l9 D5 H) N/ e+ S
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=1)
7 U8 W( F& Y/ \1 N' [. b2 h: n* L
print(f"fpr:{fpr}")
; y8 {1 V6 T! B% q3 [2 \
print(f"tpr:{tpr}")
2 b+ r1 j6 i A% e
print(f"thresholds:{thresholds}")
, b. L/ `/ C9 W1 Z! i8 ^8 r5 y/ r5 i# T
# auc与roc_auc_score函数都可以返回AUC面积值,但是注意,两个函数的参数是不同的。
1 m, i0 W$ A; K' L+ @6 S s
print("AUC面积值:", auc(fpr, tpr))
2 h9 k9 ^7 J% I1 T6 j* O- `& H
print("AUC面积得分:", roc_auc_score(y_true=y, y_score=scores))
* A; o3 p" s- J6 E
#### 3.3.2 roc_curve函数的返回值
9 E5 u" j9 W/ F$ V& t( k
6 E- B4 H& F$ _9 X, {
结果:
3 X% G3 c) ?% T+ r
2020-4-19 11:51 上传
下载附件
(40.48 KB)
1.8 是怎么来的?
: I- A3 I. A; v) I* `8 ]# m
1.8是阈值中最大值+1(0.8+1)得来的。为什么这么算?因为要使得最开始得到的所有阈值都不会超过这个值,才能过(0,0)和(1,1)这两个点。
3 F' ?$ w3 W0 b3 |9 `; N
5 L* r; e8 z I7 l3 |
4.3.2 roc_curve函数的返回值
' u! `; Q m! u& e3 L3 B
0 |, ?/ p( U; L. P* V
roc_curve函数具有3个返回值:
9 ^* ?1 B% A- E; u
# \& w/ S* C$ J$ F8 u0 L" n6 |
fpr 对应每个阈值(thresholds)下的fpr值。
$ p$ ^- I5 y' k4 X. {& ? ~4 l
tpr 对应每个阈值(thresholds)下的tpr值。
3 F& m5 s$ M/ \2 ^# t1 _2 R4 e
thresholds 阈值。
3 R) G- J- H4 U* w3 |& M) w* ?& F; s
roc_curve函数会从y_score参数中,选择部分元素作为阈值(选择哪些元素属于实现细节,会根据sklearn版本的不同,也可能会有所差异。),然后进行降序排列,作为roc_curve函数的第3个返回值(thresholds)。同时,根据thresholds中的每个元素(阈值),分别计算fpr与tpr。
$ R! t ^+ ^, p( i( }
iris = load_iris()
" ?) q, B! @! f& i) e0 k6 J( p" W4 a
X, y = iris.data, iris.target
0 J* A r: V1 u! ]$ ]
X = X[y != 0, 2:]
( ?1 f- v) F. H8 F
y = y[y != 0]
. |& |6 B _1 F6 I" q' R% v
y[y == 1] = 0
! c0 O" S; W8 r6 s
y[y == 2] = 1
% |9 C# R% k3 b: j
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25,
) W, Z X9 E8 r
random_state=2)
5 Q; m) Y6 t6 _! w0 K
# lr = LogisticRegression(multi_class="multinomial", solver="lbfgs")
/ ^: R( i) @" n. ] S1 _2 G% O
lr = LogisticRegression(multi_class="ovr", solver="liblinear")
3 x* x) L5 S8 C% V8 v, J E0 {1 j* k! F" D
lr.fit(X_train, y_train)
! P/ ~& [8 u& A. T0 a$ x
# 使用概率来作为每个样本数据的分值。
K0 [4 z+ {. k! ~
probo = lr.predict_proba(X_test)
( c1 }! _. m( Y' |
fpr, tpr, thresholds = roc_curve(y_true=y_test, y_score=probo[:, 1],
4 c0 G- I$ q8 G; g8 }, H0 P3 _
pos_label=1)
5 q% H! I* B) E
display(probo[:, 1])
+ D( f* c* Z' E# d. B6 X
# 从概率中,选择若干元素作为阈值,每个阈值下,都可以确定一个tpr与fpr,
. q/ h Y3 ^) k! p
# 每个tpr与fpr对应ROC曲线上的一个点,将这些点进行连接,就可以绘制ROC曲线。
4 a( j- u: D9 f% j8 ?& m2 q
display(thresholds)
7 B. Z" f. e- L( @- U
! x5 A/ R" x5 n7 ?3 Q. s
结果:
8 N4 o* o4 T( @3 M+ t
2020-4-19 11:52 上传
下载附件
(23.53 KB)
, q3 N0 X+ y/ B
. T0 ~ A5 L8 B% A' n: I2 r
2 H3 O( Z4 Q1 s0 } J+ P2 C
# 随着阈值的不断降低,fpr与tpr都在不断的增大。
/ Y `# l. \, W1 [: k, \2 D3 r
fpr, tpr
* b0 D4 H2 g' k2 D
; m) Y2 \" O! L. @& E7 [! @; B
结果:
p5 e( Q# \& x* ~
2020-4-19 11:52 上传
下载附件
(5.94 KB)
4 y e% @* s) S Z3 c
" `% h5 Z& h- ]8 E& D
4.3.3 绘制ROC曲线
& p! Q/ z. e5 w! S( ~$ h
有了fpr与tpr的值,绘制ROC曲线是非常容易的,只不过是最简单的一个plot而已。
% S; P3 c; M7 I
plt.figure(figsize=(10, 6))
- Y b6 _% y' \4 T/ J8 l
plt.plot(fpr, tpr, marker="o", label="ROC曲线")
3 q. ]% N- z. f1 O) V: q5 ^1 ?" @
plt.plot([0,1], [0,1], lw=2, ls="--", label="随机猜测")
8 }: v, U _9 t2 V+ ~0 o) j
plt.plot([0, 0, 1], [0, 1, 1], lw=2, ls="-.", label="完美预测")
' o: F, V/ T) k" e; T
plt.xlim(-0.01, 1.02)
. Y4 `$ R; ]! \: A' P8 _
plt.ylim(-0.01, 1.02)
. `- S9 {$ g8 e, k: Z! p. _
plt.xticks(np.arange(0, 1.1, 0.1))
# S' b0 _" @$ Z* A
plt.yticks(np.arange(0, 1.1, 0.1))
' n7 o& j! t' A) P
plt.xlabel("False Positive Rate(FPR)")
5 p3 t1 x# l* U' h4 H
plt.ylabel("True Positive Rate(TPR)")
$ l$ K3 f1 j5 p4 {
plt.grid()
( W+ n! h6 R/ V# Q% W
plt.title(f"ROC曲线-AUC值为{auc(fpr, tpr):.2f}")
4 K- q5 a# d$ O5 G9 G u
plt.legend()
" b; D0 R/ I/ v/ R
plt.show()
% }& q2 _/ M4 |: z! O7 k: D
2020-4-19 11:53 上传
下载附件
(27.62 KB)
3 `! P' S( a" f" [
1 B3 k' ^0 \8 o* k O& r2 ~
5、总结
( g9 x" k6 g$ [% J% a4 u( `
( a3 Z+ E8 ~* [6 q6 y/ p
混淆矩阵的含义。
8 w% f9 M2 R4 S; ^6 }
正确率,精准率,召回率与调和平均值F1的含义。
4 O* N2 g B' a5 a8 L
ROC与AUC。
4 k* ^6 X/ U: j+ B, @
- f' W8 H0 f' V# ], ^1 d
参考资料:
. x3 p3 B2 F X
1、https://blog.csdn.net/zuolixiangfisher/article/details/81328297
4 s% k2 w+ t; e4 e* k4 w+ L
2、https://www.jianshu.com/p/2feb00839154
8 |2 P/ [/ r6 k8 S
3、https://www.cnblogs.com/kamekin/p/9788730.html
" p0 d5 J. v0 S) r$ t7 l! ]% C1 M
4、https://www.jianshu.com/p/c61ae11cc5f6
& f+ c( ]$ J3 q4 ~
————————————————
' A0 z! w% T, w8 h6 ~
版权声明:本文为CSDN博主「糖潮丽子~辣丽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 x; W9 S7 _! b, K
原文链接:https://blog.csdn.net/qq_39783601/article/details/105600700
/ | b: P+ a% f; _: `. f {5 v$ j# C
* e% O% }# Q' R. b+ ?# m
) y* m' V! r5 I+ q; q9 r$ w
作者:
1336671542
时间:
2020-4-19 12:50
非常感谢!!!!!!!!!!
; G6 u) w- r0 U8 u. x& [
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5