摘要:
如何預(yù)測(cè)新冠確診病人數(shù)嗎?AI算法模型師之四件評(píng)估“法器”!
導(dǎo)語(yǔ)
在AI領(lǐng)域,針對(duì)機(jī)器學(xué)習(xí)、自然語(yǔ)言處理等算法模型的評(píng)估(evaluation)是一項(xiàng)非常重要的工作,在海量數(shù)據(jù)中,為使算法模型趨向更準(zhǔn)確,需要借助評(píng)估方法對(duì)算法模型進(jìn)行評(píng)估,然后才能對(duì)模型進(jìn)行針對(duì)性的優(yōu)化、提升算法效率。
本文小編介紹四種評(píng)估方法,它們就像法師(數(shù)據(jù)科學(xué)家)使用的法器一樣,有著對(duì)算法模型評(píng)判的奇妙法力,同時(shí)能產(chǎn)生算法模型的評(píng)估打分結(jié)果,為后續(xù)算法模型的優(yōu)化提供依據(jù)。這四大法器分別是:準(zhǔn)確率(Accuracy)、精確率(Precision)、召回率(Recall)和綜合評(píng)價(jià)指標(biāo)(F1-Measure)。要當(dāng)好一個(gè)合格的算法師,我們需要熟練掌握這些法器,下面我們逐一摩挲一下它們。
1評(píng)估法器一:百發(fā)百中箭——準(zhǔn)確率評(píng)估
古時(shí)射箭技藝高超的射手一般都被稱(chēng)為“神射手”,“神射手”射出的箭能夠“百步穿楊”、中靶率基本是百發(fā)百中,這個(gè)就是準(zhǔn)確率的概念。而在機(jī)器學(xué)習(xí)中,對(duì)于算法模型預(yù)測(cè)的準(zhǔn)確率,也是看其能夠百發(fā)幾中的概率。本文介紹的第一個(gè)評(píng)估法器就是:Accuracy,即準(zhǔn)確率評(píng)估,它是對(duì)模型預(yù)測(cè)的正確數(shù)量所占總預(yù)測(cè)數(shù)量的比例進(jìn)行評(píng)估的一項(xiàng)指標(biāo)。
新冠疫情爆發(fā)期,對(duì)病患的核算檢測(cè)進(jìn)行確診是一項(xiàng)重要工作,我們可以用大數(shù)據(jù)AI算法進(jìn)行新冠肺炎感染病患的進(jìn)行預(yù)測(cè)。在預(yù)測(cè)中,可以使用準(zhǔn)確率公式來(lái)表達(dá)新冠肺炎預(yù)測(cè)是否感染的正確及錯(cuò)誤:
其中:TP=預(yù)測(cè)新冠確診病人數(shù),并判斷正確;TN=預(yù)測(cè)健康人數(shù),并判斷正確;FP=預(yù)測(cè)新冠確診病人數(shù),但判斷錯(cuò)誤;FN=預(yù)測(cè)健康人數(shù),但判斷錯(cuò)誤。
我們可以舉例,假設(shè)對(duì)20人進(jìn)行新冠肺炎的確診情況進(jìn)行預(yù)測(cè),該數(shù)據(jù)實(shí)際情況和使用二元分類(lèi)算法模型(即判斷要么確診新冠、要么為健康)預(yù)測(cè)如下:
以上,黃色——TP=2,預(yù)測(cè)與實(shí)際都為新冠感染患者人數(shù)(預(yù)測(cè)正確)
藍(lán)色——TN=14,預(yù)測(cè)與實(shí)際都為健康人數(shù)(預(yù)測(cè)正確)
紅色——FP=1,預(yù)測(cè)為新冠感染患者,實(shí)際是健康的人數(shù)(預(yù)測(cè)錯(cuò)誤)
白色——FN=3,預(yù)測(cè)為健康人員,實(shí)際是新冠感染患者人數(shù)(預(yù)測(cè)錯(cuò)誤)
針對(duì)上述數(shù)據(jù)集進(jìn)行預(yù)測(cè)的模型準(zhǔn)確率,計(jì)算如下:
從該計(jì)算結(jié)果來(lái)看,預(yù)測(cè)的結(jié)果表現(xiàn)是還算可以的,分類(lèi)準(zhǔn)確率達(dá)到80%。那么是不是我們選用的算法模型就是比較出色的模型呢?
我們可以仔細(xì)分析一下數(shù)據(jù)情況,深入理解一下模型預(yù)測(cè)的效果:
20人中,15人健康,剩余5人感染了新冠肺炎,模型預(yù)測(cè)健康的人數(shù)14人,比率高達(dá)93.3%,效果不錯(cuò);但是感染了新冠的實(shí)際總?cè)藬?shù)為5,錯(cuò)誤的預(yù)測(cè)其中3人為健康,比率達(dá)到了3/5=60%,說(shuō)明從這個(gè)角度預(yù)測(cè)準(zhǔn)確率才有40%,錯(cuò)誤率較高,模型實(shí)際上是達(dá)不到預(yù)測(cè)的精確要求的。
這樣,對(duì)模型的評(píng)估只使用這個(gè)準(zhǔn)確率評(píng)估法器肯定是還不夠的,算法師還需要祭出后面要說(shuō)的新法器——精確率、召回率評(píng)估法器。
2評(píng)估法器二:諸葛神機(jī)弩——精確率評(píng)估
對(duì)于上述進(jìn)行新冠肺炎患者預(yù)測(cè)的數(shù)據(jù)集,其分類(lèi)是不太平衡的,即確診人員和健康人員的分布比較不均衡,數(shù)量差異較大。算法師如果只使用一項(xiàng)準(zhǔn)確率法器來(lái)判斷模型是否有效并不合理。
在三國(guó)戰(zhàn)爭(zhēng)中,為了成批地精確打擊敵人,諸葛亮發(fā)明了諸葛神機(jī)弩,其命中率高、打擊面大,是讓敵人聞風(fēng)喪膽的戰(zhàn)爭(zhēng)利器,使用精確率(Precision)法器來(lái)評(píng)估模型,也可以比喻為算法師的諸葛神機(jī)弩。
精確率(也稱(chēng)查準(zhǔn)率)的公式是:
其中:TP=預(yù)測(cè)新冠確診病人數(shù),并判斷正確;FP=預(yù)測(cè)的新冠確診病人數(shù),但判斷錯(cuò)誤。
我們還是采用前面的數(shù)據(jù)集來(lái)對(duì)精確率進(jìn)行評(píng)估,計(jì)算如下:
即模型在對(duì)上述數(shù)據(jù)集預(yù)測(cè)出新冠肺炎感染者的精確率是66.67%。
3評(píng)估法器三:回頭望月斬——召回率評(píng)估
算法師除了以上描述的法器,還可以使用一個(gè)妙技:回頭望月斬——進(jìn)行召回率評(píng)估?;仡^望月斬通常會(huì)在武功對(duì)決里出現(xiàn),一般指一個(gè)招式用老的瞬間,在敵人背后出其不意地回頭使出一招,打擊敵人。在這里,我們可以形容分類(lèi)算法模型對(duì)所有錯(cuò)誤和正確的預(yù)測(cè)中預(yù)測(cè)正確的比例(也可以理解為對(duì)模型錯(cuò)誤預(yù)測(cè)的回顧和評(píng)估),通俗也可以稱(chēng)為“查全率”。
其中:TP=預(yù)測(cè)新冠確診病人數(shù),并判斷正確;FN=預(yù)測(cè)為健康、但實(shí)際為新冠感染者人數(shù)。
我們還是采用前面的數(shù)據(jù)集來(lái)對(duì)召回率進(jìn)行評(píng)估,計(jì)算如下:
即對(duì)上述數(shù)據(jù)集,模型能正確預(yù)測(cè)出所有新冠肺炎感染者的比率只有40%。
因此,算法師要達(dá)到全面評(píng)估模型的有效性,必須同時(shí)檢查精確率和召回率,但是兩者的提升是有矛盾的,提高模型的精確率就會(huì)降低其召回率,反之亦然。因此算法師還需要利用一個(gè)更高端的評(píng)估法器來(lái)進(jìn)行綜合評(píng)估——F1綜合評(píng)估法。
評(píng)估法器四:精準(zhǔn)組合拳——F1綜合評(píng)估
國(guó)家在調(diào)控宏觀經(jīng)濟(jì)時(shí),經(jīng)常采用一系列調(diào)控組合拳。武功高手通常打出一套讓人應(yīng)接不暇的組合拳,虛中有實(shí)、實(shí)中有虛,會(huì)讓對(duì)手無(wú)法接招并取勝。算法師在評(píng)估模型時(shí),也可以采用類(lèi)似的評(píng)估組合,本文推薦一個(gè)常用的綜合評(píng)估法器:F1綜合評(píng)估法(F1-Measure),又稱(chēng)F1-Score,是精確率(實(shí)招)和召回率(虛招)的加權(quán)調(diào)和平均,算是模型評(píng)估的一套精準(zhǔn)組合拳,也可以比喻為一個(gè)組合了前兩種評(píng)估法器的大法器。
其中,P為精確率(Precision), R為召回率(Recall)。
(注:F1綜合評(píng)估是統(tǒng)計(jì)學(xué)中F-Measure在權(quán)重參數(shù)=1時(shí)的一個(gè)特例,即精確率與召回率權(quán)重一致,本文限于篇幅,只對(duì)評(píng)估常用的F1評(píng)估進(jìn)行描述。)
繼續(xù)利用上述的數(shù)據(jù)集,根據(jù)前面計(jì)算出的精確率和召回率,便可得出其F1值如下:
結(jié)果是0.5,在模型評(píng)估中,當(dāng)這個(gè)值較高時(shí),說(shuō)明算法模型的效果比較理想,目前看來(lái)這個(gè)分值反映出模型效果比較一般。
4評(píng)估法器四:綜合實(shí)戰(zhàn)
為了讓讀者更好地理解四件法器的功效,我們?nèi)匀皇褂蒙鲜龅念A(yù)測(cè)新冠感染者的數(shù)據(jù)集,通過(guò)python實(shí)戰(zhàn)演練一下。
#基于numpy實(shí)現(xiàn)模型評(píng)估,加載numpy
#設(shè)Corondata_real是實(shí)際的數(shù)據(jù)集,數(shù)值為1代表新冠感染者,數(shù)值為0代表健康人員
Corondata_real= np.array([0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1])
print('實(shí)際數(shù)據(jù)集:{}'.format(Corondata_real))
#設(shè)Corondata_pred是預(yù)測(cè)結(jié)果數(shù)據(jù),數(shù)值為1預(yù)測(cè)新冠感染者,數(shù)值為0代表預(yù)測(cè)健康人員
Corondata_pred= np.array([0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0])
print('預(yù)測(cè)結(jié)果數(shù)據(jù)集:{}'.format(Corondata_pred))
實(shí)際數(shù)據(jù)集:[01 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1]
預(yù)測(cè)結(jié)果數(shù)據(jù)集:[01 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0]
#預(yù)測(cè)與實(shí)際都為新冠感染患者人數(shù)(預(yù)測(cè)正確),truepositive
TP=np.sum(np.logical_and(np.equal(Corondata_real,1),np.equal(Corondata_pred,1)))
print('預(yù)測(cè)與實(shí)際都為新冠感染患者人數(shù)(預(yù)測(cè)正確):{}'.format(TP))
#預(yù)測(cè)與實(shí)際都為健康人數(shù)(預(yù)測(cè)正確),falsepositive
FP=np.sum(np.logical_and(np.equal(Corondata_real,0),np.equal(Corondata_pred,1)))
print('預(yù)測(cè)與實(shí)際都為健康人數(shù)(預(yù)測(cè)正確):{}'.format(FP))
#預(yù)測(cè)為新冠感染患者,實(shí)際是健康的人數(shù)(預(yù)測(cè)錯(cuò)誤),truenegative
TN=np.sum(np.logical_and(np.equal(Corondata_real,1),np.equal(Corondata_pred,0)))
print('預(yù)測(cè)為新冠感染患者,實(shí)際是健康的人數(shù)(預(yù)測(cè)錯(cuò)誤):{}'.format(TN))
#預(yù)測(cè)為健康人員,實(shí)際是新冠感染患者人數(shù)(預(yù)測(cè)錯(cuò)誤),falsenegative
FN=np.sum(np.logical_and(np.equal(Corondata_real,0),np.equal(Corondata_pred,0)))
print('預(yù)測(cè)為健康人員,實(shí)際是新冠感染患者人數(shù)(預(yù)測(cè)錯(cuò)誤):{}'.format(FN))
預(yù)測(cè)與實(shí)際都為新冠感染患者人數(shù)(預(yù)測(cè)正確):2
預(yù)測(cè)與實(shí)際都為健康人數(shù)(預(yù)測(cè)正確):1
預(yù)測(cè)為新冠感染患者,實(shí)際是健康的人數(shù)(預(yù)測(cè)錯(cuò)誤):3
預(yù)測(cè)為健康人員,實(shí)際是新冠感染患者人數(shù)(預(yù)測(cè)錯(cuò)誤):14
3、計(jì)算準(zhǔn)確率、精確率、召回率、F1綜合評(píng)分
#利用sklearn.metrics的各類(lèi)評(píng)估方法庫(kù),計(jì)算準(zhǔn)確率、精確率、召回率、F1綜合評(píng)分
fromsklearn.metrics import accuracy_score, precision_score, recall_score,f1_score
a_score= accuracy_score(Corondata_real, Corondata_pred)
p_score= precision_score(Corondata_real, Corondata_pred)
r_score= recall_score(Corondata_real, Corondata_pred)
f1_score= f1_score(Corondata_real, Corondata_pred)
print('準(zhǔn)確率評(píng)分:{:.2%}'.format(a_score))
print('精確率評(píng)分:{:.2%}'.format(p_score))
print('召回率評(píng)分:{:.2%}'.format(r_score))
print('F1綜合評(píng)分:{:.2}'.format(f1_score))
4、擴(kuò)展——classification_report評(píng)分報(bào)告庫(kù)
針對(duì)模型評(píng)估,在sklearn.metrics中內(nèi)置了一個(gè)函數(shù)classification_report,可以同時(shí)統(tǒng)計(jì)出幾種評(píng)分方法的評(píng)分,能夠一目了然地看出模型的效果。
#導(dǎo)入classification_report評(píng)分報(bào)告庫(kù)
fromsklearn.metrics import classification_report
#用classification_report對(duì)模型評(píng)分,分別給出precision、recall、f1-score、support的分值
print(classification_report(Corondata_real,Corondata_pred))
precision recall f1-score support
microavg 0.80 0.80 0.80 20
macroavg 0.75 0.67 0.69 20
weightedavg 0.78 0.80 0.78 20
上述結(jié)果對(duì)精度(Precision)、召回率(Recall)、f1分?jǐn)?shù)(f1-score)、support四項(xiàng)指標(biāo)的分值以列表形式概覽展示。這也對(duì)模型評(píng)估起到了很大的幫助。
結(jié)尾四件評(píng)估法器之小結(jié)
根據(jù)以上對(duì)四件評(píng)估法器的實(shí)戰(zhàn)演練,我們可以小結(jié)如下:
對(duì)于模型評(píng)估,本文推薦的四件評(píng)估法器都能夠?qū)δP痛虺龇种?,但各有千秋,均能體現(xiàn)出模型的一定效果。在實(shí)戰(zhàn)中,算法模型師可以采用這四件法器多方面進(jìn)行評(píng)估,以方便后續(xù)對(duì)模型進(jìn)行優(yōu)化。
本文介紹的是較為普遍常用的評(píng)估方法,對(duì)模型進(jìn)行評(píng)分還可以有很多其它的方法,例如交叉驗(yàn)證法、ROC(Receiver Operating Characteristic Curve)、AUC(Area Under Curve)、R2分?jǐn)?shù)等,限于篇幅,我們?cè)谶@里不再展開(kāi),讀者可以在網(wǎng)上搜索查看。