來自:https://blog.csdn.net/shenxiaoming77/article/details/72627882
來自:https://blog.csdn.net/u010705209/article/details/53037481
在分類模型中,roc曲線和auc曲線作為衡量一個模型擬合程度的指標。
分類模型評估:
| 指標 | 描述 | Scikit-learn函數 |
| Precision | AUC | from sklearn.metrics import precision_score |
| Recall | 召回率 | from sklearn.metrics import recall_score |
| F1 | F1值 | from sklearn.metrics import f1_score |
| Confusion Matrix | 混淆矩陣 | from sklearn.metrics import confusion_matrix |
| ROC | ROC曲線 | from sklearn.metrics import confusion_matrix |
| AUC | ROC曲線下的面積 | from sklearn.metrics import auc |
回歸模型評估:
| 指標 | 描述 | Scikit-learn函數 |
| Mean Square Error (MSE, RMSE) | 平均方差 | from sklearn.metrics import mean_squared_error |
| Absolute Error (MAE, RAE) | 絕對誤差 | from sklearn.metrics import mean_absolute_error, median_absolute_error |
| R-Squared | R平方值 | from sklearn.metrics import r2_score |
roc和auc定義
roc全稱是“受試者工作特征”(recevier operating characteristic)。roc曲線的面積就是auc(area under the curve)。auc用於衡量“二分類問題”機器學習算法性能(泛化能力)。
1. 了解roc首先了解混淆矩陣:
例如用一個分類模型來判別一個水果是蘋果還是梨,混淆矩陣將會模型的預測結果總結成如下表所示的表格。
| 模型預測結果 | 模型預測結果 | ||
| 蘋果 | 梨 | ||
| 真是結果 | 蘋果 | 10 | 2 |
| 真是結果 | 梨 | 3 | 15 |
通過上述表格可以看出,樣本的數量一共是10+2+3+15=3010+2+3+15=30個樣本。其中蘋果有10+2=1210+2=12個,梨有3+15=183+15=18個。該模型預測的蘋果的數量是10+3=1310+3=13個,有1010個是預測正確的,33個是預測錯誤的。該模型預測的梨的數量是2+15=172+15=17個,其中有1515個是預測正確的,22個是預測錯誤的。
混淆矩陣
對於一個二分類的模型,其模型的混淆矩陣是一個2×22×2的矩陣。如下圖所示:
| Predicted condition | Predicted condition | ||
| positive | negative | ||
| True condition | positive | True Positive | True Negative |
| True condition | negative | False Positive | False Negative |
混淆矩陣比模型的精度的評價指標更能夠詳細地反映出模型的”好壞”。模型的精度指標,在正負樣本數量不均衡的情況下,會出現容易誤導的結果
- True Positive:真正類(TP),樣本的真實類別是正類,並且模型預測的結果也是正類。
- False Negative:假負類(FN),樣本的真實類別是正類,但模型將其預測成為負類。
- False Positive:假正類(FP),樣本的真實類別是負類,但模型將其預測成正類。
- True Negative:真負類(TN),樣本的真實類別是負類,並且模型將其預測成為負類。
混淆矩陣中,衍生出各種評價的指標。

精度:
模型預測正確的個數 / 樣本的總個數,

一般情況下,模型的精度越高,說明模型的效果越好。
召回率:
模型預測為正類的樣本的數量,占總的正類樣本數量的比值。

Recall越高,說明有更多的正類樣本被模型預測正確,模型的效果越好。
TPR:
樣本中的真實正例類別總數即TP+FN。TPR即True Positive Rate,TPR = TP/(TP+FN)。
FPR:
同理,樣本中的真實反例類別總數為FP+TN。FPR即False Positive Rate,FPR=FP/(TN+FP)。
截斷點:
還有一個概念叫”截斷點”。機器學習算法對test樣本進行預測后,可以輸出各test樣本對某個類別的相似度概率。比如t1是P類別的概率為0.3,一般我們認為概率低於0.5,t1就屬於類別N。這里的0.5,就是”截斷點”。
總結一下,對於計算ROC,最重要的三個概念就是TPR, FPR, 截斷點。
截斷點取不同的值,TPR和FPR的計算結果也不同。將截斷點不同取值下對應的TPR和FPR結果畫於二維坐標系中得到的曲線,就是ROC曲線。橫軸用FPR表示。
2. sklearn計算roc
sklearn給出了一個計算roc的例子:
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)
通過計算,得到的結果(TPR, FPR, 截斷點)為
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 ]) #截斷點
將結果中的FPR與TPR畫到二維坐標中,得到的ROC曲線如下(藍色線條表示),ROC曲線的面積用AUC表示(淡黃色陰影部分)。

詳細計算過程:
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
(1). 分析數據
y是一個一維數組(樣本的真實分類)。數組值表示類別(一共有兩類,1和2)。我們假設y中的1表示反例,2表示正例。即將y重寫為:
y_true = [0, 0, 1, 1]
score即各個樣本屬於正例的概率。
(2). 針對score,將數據排序
| 樣本 | 預測屬於P的概率(score) | 真實類別 |
| y[0] | 0.1 | N |
| y[2] | 0.35 | P |
| y[1] | 0.4 | N |
| y[3] | 0.8 | P |
(3). 將截斷點依次取值為score值
將截斷點依次取值為0.1, 0.35, 0.4, 0.8時,計算TPR和FPR的結果。
3.1. 截斷點為.01
說明只要score>=0.1,它的預測類別就是正例。
此時,因為4個樣本的score都大於等於0.1,所以,所有樣本的預測類別都為P。
scores = [0.1, 0.4, 0.35, 0.8] y_true = [0, 0, 1, 1] y_pred = [1, 1, 1, 1]

TPR = TP/(TP+FN) = 1
FPR = FP/(TN+FP) = 1
3.2. 截斷點為0.35
說明只要score>=0.35,它的預測類別就是P。
此時,因為4個樣本的score有3個大於等於0.35。所以,所有樣本的預測類有3個為P(2個預測正確,1一個預測錯誤);1個樣本被預測為N(預測正確)。
scores = [0.1, 0.4, 0.35, 0.8] y_true = [0, 0, 1, 1] y_pred = [0, 1, 1, 1]

TPR = TP/(TP+FN) = 1
FPR = FP/(TN+FP) = 0.5
3.3. 截斷點為0.4
說明只要score>=0.4,它的預測類別就是P。
此時,因為4個樣本的score有2個大於等於0.4。所以,所有樣本的預測類有2個為P(1個預測正確,1一個預測錯誤);2個樣本被預測為N(1個預測正確,1一個預測錯誤)。
scores = [0.1, 0.4, 0.35, 0.8] y_true = [0, 0, 1, 1] y_pred = [0, 1, 0, 1]

TPR = TP/(TP+FN) = 0.5
FPR = FP/(TN+FP) = 0.5
3.4. 截斷點為0.8
說明只要score>=0.8,它的預測類別就是P。所以,所有樣本的預測類有1個為P(1個預測正確);3個樣本被預測為N(2個預測正確,1一個預測錯誤)。
scores = [0.1, 0.4, 0.35, 0.8] y_true = [0, 0, 1, 1] y_pred = [0, 0, 0, 1]

TPR = TP/(TP+FN) = 0.5
FPR = FP/(TN+FP) = 0
(4). 心得
用下面描述表示TPR和FPR的計算過程,更容易記住
- TPR:真實的正例中,被預測正確的比例
- FPR:真實的反例中,被預測正確的比例
