本篇主要內(nèi)容:混淆矩陣(Confusion Matrix) 炫狱、精準(zhǔn)率(Precision)闻书、召回率(Recall )
準(zhǔn)確率的陷阱
在之前我們都是用分類準(zhǔn)確度來評價分類算法的好壞,但其實用準(zhǔn)確率來評價分類算法的好壞是存在很大問題的爽茴。
準(zhǔn)確率的問題
現(xiàn)在有一個癌癥預(yù)測系統(tǒng)卒稳,輸入你的體檢信息突琳,來判斷是否有癌癥,這個系統(tǒng)能達(dá)到99.9%的預(yù)測準(zhǔn)確率澡匪,那這是一個好系統(tǒng)嗎熔任?不少人會覺得99.9%的準(zhǔn)確率當(dāng)然是一個好系統(tǒng),實際真的是這樣嗎唁情?想象一種情況疑苔,如果這種癌癥本身的發(fā)病率只有0.01%,那這就意味著甸鸟,根本不需要任何機器學(xué)習(xí)算法夯巷,無論是什么樣的體檢信息,都預(yù)測他是健康的不會患癌癥哀墓,這樣肯定有99.99%的準(zhǔn)確率趁餐,而現(xiàn)在的系統(tǒng)只有99.9%的準(zhǔn)確率還不如沒有機器學(xué)習(xí)的準(zhǔn)確率高,說明這個系統(tǒng)是失敗的篮绰。
這就是用分類準(zhǔn)確度來衡量一個分類系統(tǒng)性能好壞的問題所在后雷。這樣的問題發(fā)生在數(shù)據(jù)是極度偏斜(Skewed Data)的情況下,即不同類別的數(shù)量差異巨大,這樣的情況下臀突,只使用分類準(zhǔn)確度是遠(yuǎn)遠(yuǎn)不夠的勉抓。于是有了混淆矩陣,在混淆矩陣上我們可以得到比分類準(zhǔn)確度還要好的分類性能評價指標(biāo)候学。
混淆矩陣Confusion Matrix
什么是混淆矩陣呢藕筋?以二分類問題為例,對于二分類問題梳码,混淆矩陣是一個2×2的矩陣:
真實\預(yù)測 | 0 | 1 |
---|---|---|
0 | 預(yù)測negative正確 TN |
預(yù)測positive錯誤 FP |
1 | 預(yù)測negative錯誤 FN |
預(yù)測positive正確 TP |
混淆矩陣中行代表真實值隐圾,列代表預(yù)測值,0-Negative掰茶,1-Positive暇藏,1往往是我們比較關(guān)注的類別。
比如現(xiàn)在有10000個人濒蒋,預(yù)測患癌癥的情況盐碱,1代表患癌癥,0代表未患癌癥沪伙,相應(yīng)的混淆矩陣:
真實\預(yù)測 | 0 | 1 |
---|---|---|
0 | 9978 | 12 |
1 | 2 | 8 |
該矩陣表示有9978個人實際沒有患癌癥預(yù)測結(jié)果也是沒有患癌癥瓮顽,有12個人實際沒有患癌癥但預(yù)測結(jié)果是患癌癥;有2個人患了癌癥預(yù)測結(jié)果是沒患围橡,有8個人患了癌癥預(yù)測結(jié)果也是患癌癥趣倾。
精準(zhǔn)率與召回率
基于混淆矩陣,我們有兩個新的衡量分類算法性能的指標(biāo)——精準(zhǔn)率和召回率某饰。精準(zhǔn)率precision的計算公式為:
精準(zhǔn)率是我們預(yù)測我們關(guān)注的事件儒恋,它相應(yīng)的有多準(zhǔn)確。對于上面癌癥預(yù)測的例子黔漂,相應(yīng)的精準(zhǔn)率計算為:它表示預(yù)測結(jié)果為1中預(yù)測正確(實際也為1)的概率诫尽,在有偏數(shù)據(jù)中,1通常是我們比較關(guān)注的對象炬守,因此叫精準(zhǔn)率牧嫉,比如癌癥預(yù)測中,癌癥是我們真正關(guān)注的對象减途。本例精準(zhǔn)率的含義是我們每做出100次患病的預(yù)測酣藻,有40次是準(zhǔn)確的。
和精準(zhǔn)率相對應(yīng)的召回率recall的計算公式為:
召回率是我們關(guān)注的事件真實的發(fā)生了鳍置,在真實發(fā)生的我們關(guān)注的事件中辽剧,我們成功預(yù)測了多少。
對于癌癥預(yù)測的例子税产,相應(yīng)的召回率計算為:含義是每有100個癌癥患者怕轿,通過現(xiàn)在的機器學(xué)習(xí)算法偷崩,我們能成功的找出其中的80個患者。
為什么說精準(zhǔn)率和召回率是比準(zhǔn)確率要優(yōu)秀的評價指標(biāo)呢撞羽,仍然考慮最初的例子阐斜,有10000個人,癌癥病發(fā)率為0.01%诀紊,現(xiàn)在有一個算法谒出,不管怎樣都預(yù)測他是健康的,這樣的準(zhǔn)確率是99.99%邻奠,但是盡管準(zhǔn)確率高笤喳,實際是一點幫助都沒有的。相應(yīng)的精準(zhǔn)率精準(zhǔn)率和召回率呢惕澎?首先給出此時的混淆矩陣:
真實\預(yù)測 | 0 | 1 |
---|---|---|
0 | 9999 | 0 |
1 | 1 | 0 |
計算得到精準(zhǔn)率為是沒有意義的莉测,對于沒有意義的精準(zhǔn)率直接定義為它可能的最小值也就是0颜骤。召回率唧喉,可以看到對于我們都知道的沒有意義的算法,準(zhǔn)確率能達(dá)到99%以上忍抽,而精準(zhǔn)率和召回率卻都是最低值八孝,這就是精準(zhǔn)率和召回率的意義。
實現(xiàn)精準(zhǔn)率與召回率
在手寫數(shù)字?jǐn)?shù)據(jù)集上進(jìn)行測試鸠项,不過由于手寫數(shù)字本身是10個類別且每個類別數(shù)量是差不多的干跛,這里我們?nèi)斯⑵渥優(yōu)閮蓚€類別(標(biāo)簽等于9為類1,標(biāo)簽不等于9的為類0)以達(dá)到skewed data的效果:
import numpy as np
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target.copy()
'''人工加入偏斜'''
y[digits.target==9]=1
y[digits.target!=9]=0
'''10分類變?yōu)?分類祟绊,用Logistic分類'''
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X_train,y_train)
log_reg.score(X_test,y_test)
在Logistic回歸下準(zhǔn)確率為97.5%楼入,不過這并不能說明什么,因為不等于9的本身就在全部數(shù)據(jù)中占有90%的比例牧抽,就算不用機器學(xué)習(xí)算法全部預(yù)測為類1嘉熊,準(zhǔn)確率也有90%,于是考慮精準(zhǔn)率和召回率扬舒,定義混淆矩陣計算函數(shù):
'''計算混淆矩陣各項'''
def TN(y_true, y_predict):
assert len(y_true)==len(y_predict)
return np.sum((y_true==0)&(y_predict==0))
def FP(y_true,y_predict):
assert len(y_true)==len(y_predict)
return np.sum((y_true==0)&(y_predict==1))
def FN(y_true,y_predict):
assert len(y_true)==len(y_predict)
return np.sum((y_true==1)&(y_predict==0))
def TP(y_true,y_predict):
assert len(y_true)==len(y_predict)
return np.sum((y_true==1)&(y_predict==1))
'''混淆矩陣'''
def confusion_matrix(y_true,y_predict):
return np.array([
[TN(y_true,y_predict),FP(y_true,y_predict)],
[FN(y_true,y_predict),TP(y_true,y_predict)]
])
'''Logistic分類的混淆矩陣'''
confusion_matrix(y_test,y_log_predict)
相應(yīng)的混淆矩陣:
有了混淆矩陣阐肤,再定義精準(zhǔn)率和召回率計算函數(shù):
'''精準(zhǔn)率'''
def precision_score(y_true,y_predict):
tp = TP(y_true,y_predict)
fp = FP(y_true,y_predict)
'''分母為0'''
try:
return tp/(tp+fp)
except:
return 0.0
'''召回率'''
def recall_score(y_true,y_predict):
tp = TP(y_true,y_predict)
fn = FN(y_true,y_predict)
'''分母為0'''
try:
return tp/(tp+fn)
except:
return 0.0
調(diào)用計算函數(shù),得到精準(zhǔn)率和召回率為:
精準(zhǔn)率和召回率看起來還是不錯的讲坎,在實際中它們有時精準(zhǔn)率小有時召回率小孕惜,具體如何平衡它們,以及它們?nèi)绾卧u價模型將在下篇介紹晨炕。
同樣衫画,對于這些操作,我們寫的是模擬sklearn的邏輯的瓮栗,sklearn中也封裝好了相應(yīng)的模塊碧磅,接下來使用sklearn中的混淆矩陣和準(zhǔn)確率召回率計算:
得到了同樣的結(jié)果。