一、什么是ROC曲線
對於分類模型,常見的模型評價指標有精確率、召回率以及ROC曲線等,看名字不太好理解,下面來仔細分析。
混淆矩陣:
表中結果分為四類:
真正樣 TP(True Positive):預測為正樣本的正樣本,預測正確體現在True,預測值體現在Positive。
假負樣 FN(False Negative):預測為負樣本的正樣本,預測錯誤體現在False,預測值體現在Negative。
真負樣 TN(True Negative):預測為負樣本的負樣本。
假負樣 FP(False Negative):預測為正樣本的負樣本。
以此為基礎可以得出下列指標:
真正率 TPR(True Positive Rate)又稱“敏感性”、“靈敏性”、“召回率”或者“查全率”(Sensitivity):預測正確的正樣本/正樣本總數
假負率 FNR(False Negative Rate):預測錯誤的正樣本/正樣本總數
真負率TNR(True Negative Rate)又稱特異性(Specificity):預測正確的負樣本/負樣本總數
假正率FPR(False Positive Rate):預測錯誤的負樣本/負樣本總數
最后由混淆矩陣能得到下列指標:
准確率(Accuracy):分類正確的樣本數/樣本總數
錯誤率(Error):分類錯誤的樣本數/樣本總數
精確率(Precision):
又稱查准率,能夠體現模型分類為正樣本的數量中分類正確的比例,分母靠預測值決定。
正樣本的預測數/被預測為正樣本的數量(包含錯誤預測為正樣本的負樣本)
召回率Recall(敏感度):
又稱查全率,即上述的TPR。
分類正確的樣本書/正樣本的數量
那么按照西瓜書中的解釋,精確率就是挑出的西瓜中有多少比例是好瓜,召回率就是所有好瓜中有多少比例被挑出來。
F-Measure是Precision和Recall加權調和平均
當參數a=1時,就是最常見的F1:
也就是:F1 = 2 * 召回率 * 准確率/ (召回率+准確率)
E值 是Precision和Recall加權平均值,b>1表示更重視P
不妨舉這樣一個例子:
某池塘有1400條鯉魚,300只蝦,300只鱉。現在以捕鯉魚為目的。撒一大網,逮着了700條鯉魚,200只蝦,100只鱉。那么,這些指標分別如下:
不妨看看如果把池子里的所有的鯉魚、蝦和鱉都一網打盡,這些指標又有何變化:
由此可見,准確率是評估捕獲的成果中目標成果所占得比例;召回率,顧名思義,就是從關注領域中,召回目標類別的比例;而F值,則是綜合這二者指標的評估指標,用於綜合反映整體的指標。
總結:
精確率和召回率是一對矛盾的度量,如果希望精確率提高,那么可以讓模型閾值提高,減少FP數量,但是同樣會降低TP數量因為要求更嚴格了,會導致召回率降低,因為有一些本可以預測為正樣本的樣本被閾值卡在了外面。故而精確率precision又稱為查准率,突出的就是一個准字,召回率recall又稱查全率,突出一個全字。
ROC曲線
ROC的全稱是Receiver Operating Characteristic Curve,中文名字叫“受試者工作特征曲線”
首先是由二戰中的電子工程師和雷達工程師發明的,用來偵測戰場上的敵軍載具(飛機、船艦),也就是信號檢測理論。之后很快就被引入了心理學來進行信號的知覺檢測。此后被引入機器學習領域,用來評判分類、檢測結果的好壞。
從圖中可以看出,ROC曲線的橫坐標為FPR(假正率),縱坐標為TPR(真正率)
縱軸:真正率(擊中率)true positive rate ,TPR,稱為靈敏度。所有實際正例中,正確識別的正例比例。
橫軸:假正率(虛報率)false positiverate, FPR,稱為(1-特異度)。所有實際負例中,錯誤得識別為正例的負例比例。
舉個簡單的例子:
有10張圖片其中貓8張(Positive) 狗2張(Negative),通過模型產生了10個預測結果,其中預測為貓的有9張,狗1張。那么TP=8 FN=0 TN=1 FP=1 即TPR=1 FPR=0.5 (0.5,1)就是ROC曲線上的一個點。
如何通過ROC曲線判斷模型好壞?
有了ROC曲線需要對模型有一個定量的分析,這里就需要引入AUC(Area under ROC Curve)面積,AUC指的就是ROC曲線下方的面積,計算AUC只需要沿着ROC的橫軸做積分即可,真實場景下ROC曲線一般在y=x直線的上方,所以AUC的取值一般在0.5~1之間,AUC值越大說明模型的性能越好。
如何ROC曲線?
當我們改變模型的閾值,預測結果中的TP FN TN FP都會相應的改變,即每一個閾值都會有一組(TPR, FPR)對應,ROC曲線就是不斷的移動分類器的閾值來產生曲線上的關鍵點。
舉個例子:(https://www.zhihu.com/question/22844912/answer/246037337)
圖中是一個二分類模型的輸出結果,一共20個樣本,輸出的概率就是模型判定為正樣本的概率,第二列是真實label
如果我們指定閾值為0.9,那么只有第一個樣本會被定為正樣本,其他樣本都定位負樣本,可以算出TPR=0.1 FRP=0,所以(0,0.1)是ROC曲線上的一點,這樣繼續改變閾值(截斷點)就可以得到更多的關鍵點,最后連接所有的關鍵點就能得到ROC曲線。
二、如何通過代碼畫出ROC曲線?
現在我們知道ROC曲線上的一組組(FPR,TPR)值是通過改變閾值得到,那么具體在程序中是如何實現的?
首先我們需要了解sklearn.metrics中的roc_curve方法(metrics是度量、指標,curve是曲線)roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=None)
roc_curve函數中參數含義:
y_true:簡單來說就是label,范圍在(0,1)或(-1,1)的二進制標簽,若非二進制則需提供pos_label。
y_score:模型預測的類別概率值。
pos_label:label中被認定為正樣本的標簽。若label=[1,2,2,1]且pos_label=2,則2為positive,其他為negative。
sample_weight:采樣權重,可選擇一部分來計算。
drop_intermediate:可以去掉一些對ROC曲線不好的閾值,使得曲線展現的性能更好。
返回值:(tpr,fpr,thershold)
tpr:根據不同閾值得到一組tpr值。
fpr:根據不同閾值的到一組fpr值,與tpr一一對應。(這兩個值就是繪制ROC曲線的關鍵)
thresholds:選擇的不同閾值,按照降序排列。
有了以上參數和返回值的基礎,舉個例子來驗證一下:
輸出結果:
分析:
代碼中故意將label設置為非二進制,展示了pos_label這個參數的用處,如果pos_label設置錯誤程序會報錯,大家可以自己嘗試,y_label是標簽,y_pre和y_labe相對應是模型預測為label的概率值,當pos_label=2則標簽為2的看作正樣本,標簽為1的看做負樣本。
我們都知道ROC曲線是需要通過改變閾值來獲取一組組(fprp, tpr),那么roc_curve方法中是如何選取閾值?
從輸出結果可以看到,第三列代表返回值thersholds記錄的就是roc_curve所選取的閾值,其閾值就是將y_pre降序排列並依次選取,如果選取的閾值對fpr和tpr值無影響則忽略,輸出結果中沒有記錄閾值為0.8時情況。
需要注意的是,輸出結果第一行therholds=1.9,這個值很奇怪,乍一看不知道為什么會出現這個值。這里我們閱讀sklearn官網的原文對therholds這個參數的解釋:Decreasing thresholds on the decision function used to compute fpr and tpr. thresholds[0] represents no instances being predicted and is arbitrarily set to max(y_score) + 1.
thresholds[0] 表示沒有任何預測的實例 並且被設置為max(y_score) + 1,這樣就知道1.9其實是y_pre中最大的0.9 +1,再簡單點來說,第一行其實就是ROC曲線的起點(0,0)。
到這里roc_curve方法的用法應該已經非常清楚了,畫ROC曲線之前還有一個評估模型優劣重要的值AUC需要得到。
算AUC的方法很簡單,使用auc方法即可。
最后就是畫出ROC曲線了,完整代碼如下:
輸出結果:
三、python實現LOOCV並畫ROC曲線(以sklearn中的iris數據為例)
用的是Adaboost算法
代碼如下:
<圖中鏈接:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics>
參考鏈接:https://blog.csdn.net/AugustMe/article/details/94717440
https://blog.csdn.net/hesongzefairy/article/details/104302499
https://blog.csdn.net/hesongzefairy/article/details/104295431
https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc_crossval.html#sphx-glr-auto-examples-model-selection-plot-roc-crossval-py
https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#sphx-glr-auto-examples-model-selection-plot-roc-py
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html?highlight=roc_curve#sklearn.metrics.roc_curve
https://www.zhihu.com/question/22844912/answer/246037337
https://my.oschina.net/u/3702502/blog/1841599
https://blog.csdn.net/jiandanjinxin/article/details/51840829
https://blog.csdn.net/xiahouzuoxin/article/details/43165253
https://blog.csdn.net/zuyuanzhu/article/details/21516397
https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics