一. ROC曲線概念
二分類問題在機器學習中是一個很常見的問題,經常會用到。ROC (Receiver Operating Characteristic) 曲線和 AUC (Area Under the Curve) 值常被用來評價一個二值分類器 (binary classifier) 的優劣,Sklearn中對這一函數給出了使用方法:
sklearn.metrics.
roc_curve
(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
輸入:其中y_true為真實標簽,y_score為預測概率,或稱為置信度。pos_label為正類樣本標簽,一般為1。
輸出:fpr(假正率、1-特效性)、tpr(真正率、靈敏度)、thresholds(閾值)
假正率 = 預測為正類的負樣本/所有負類樣本,越小越好。
真正率 = 預測為正類的正樣本/所有正類樣本,越大越好。
通過sklearn的一個實例來分析計算方法:
>>> import numpy as np >>> from sklearn import metrics >>> y = np.array([1, 1, 2, 2]) >>> scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2) >>> fpr array([ 0. , 0.5, 0.5, 1. ]) >>> tpr array([ 0.5, 0.5, 1. , 1. ]) >>> thresholds array([ 0.8 , 0.4 , 0.35, 0.1 ])
首先負類為1,正類標簽為2。thresholds為將預測結果scores從大到小排列的結果。這里的thresholds指的是大於等於這個閾值為正類,負責為負類。所以通過改變不同的閾值,預測結果也將發生變化,所以根據4組thresholds得到4組fpr、tpr數據,然后以fpr為橫坐標,以tpr為縱坐標,即得到ROC曲線,ROC曲線下的面積是AUC。
那么首先當閾值為0.8,此時預測結果即為【1,1,1,2】,真實結果為【1,1,2,2】,所以:
fpr = 0/2 = 0
tpr = 1/2 = 0.5
同理可以得到其余3組結果,那么根據這4組坐標可以在圖上畫出ROC曲線。那么如何計算AUC呢?
-
sklearn.metrics.
roc_auc_score
(y_true, y_score, average=’macro’, sample_weight=None)[source] - 利用該函數,輸入真實label和預測結果可以得到AUC值。
二. ROC曲線的意義
ROC觀察模型正確地識別正例的比例與模型錯誤地把負例數據識別成正例的比例之間的權衡。TPR的增加以FPR的增加為代價。ROC曲線下的面積是模型准確率的度量。
既然已經這么多評價標准,為什么還要使用 ROC 和 AUC 呢?因為 ROC 曲線有個很好的特性:當測試集中的正負樣本的分布變化的時候,ROC 曲線能夠保持不變。在實際的數據集中經常會出現類不平衡(class imbalance)現象,即負樣本比正樣本多很多(或者相反),而且測試數據中的正負樣本的分布也可能隨着時間變化。下圖是 ROC 曲線和Precision-Recall曲線的對比:
在上圖中,(a)和(c)為 ROC 曲線,(b)和(d)為 Precision-Recall 曲線。(a)和(b)展示的是分類其在原始測試集(正負樣本分布平衡)的結果,(c)和(d)是將測試集中負樣本的數量增加到原來的 10 倍后,分類器的結果。可以明顯的看出,ROC 曲線基本保持原貌,而 Precision-Recall 曲線則變化較大。
參考:
機器學習之分類性能度量指標 : ROC曲線、AUC值、正確率、召回率