分類模型的評估(三)
在前兩篇文章里(《分類模型的評估(一)》和《分類模型的評估(二)》),針對二分類問題,我們分別討論了
- 評估某個給定分類結果的指標:查准率(Precision)、查全率(Recall)以及F-score
- 綜合評估分類模型整體效果的指標:ROC曲線-AUC值
這篇文章將藉助一個具體的例子來討論上述指標的代碼實現(使用Python)
一、什麼是Python
Python是一門計算機編程語言,它在數據科學領域的應用極其廣泛,具體的江湖地位可用圖1來表示。
限於篇幅,Python的安裝和語法介紹在此就不展開了,有需要的同學可以參考這個網頁。
其實我在這裡單列一節出來講Python,主要是為了展示我畫的圖1。
二、數據集以及模型簡介
為了更具體地討論實現,我們使用美國個人收入的普查數據來搭建模型(源自美國加州大學歐文分校,點擊這裡下載)。數據中具體的變數以及說明如表1所示。
需要被預測的年收入分類(label)是一個二元變數,因此使用邏輯回歸來解決這個二分類問題。另外為了建模方便,我們在這裡只使用數值型自變數。
另外本篇文章的完整代碼這裡
三、Precision,Recall以及F-score
針對一個給定的預測結果,Precision,Recall以及F-score的實現十分簡單,如下所示。其中參數「pred」是模型的預測結果、「label」是真實結果、beta是F-score的beta權重。
import numpy as npdef PrecisionRecallFscore(pred, label, beta=1): """ 計算預測結果的Precision, Recall以及Fscore """ bins = np.array([0, 0.5, 1]) tp, fp, fn, tn = np.histogram2d(label, pred, bins=bins)[0].flatten() precision = tp / (tp + fp) recall = tp / (tp + fn) fscore = (1 + beta ** 2) * precision * recall / (beta ** 2 * precision + recall) return precision, recall, fscore
由於邏輯回歸的直接預測結果是類別1的概率,即 ,而最終預測結果與人為選擇的閾值 有關,具體的如公式(1)所示。
那麼這三個指標隨著 的變動情況如圖2所示。圖中的結果與《分類模型的評估(一)》中的討論是一致的。
另外對於一個給定的閾值 ,比如 ,不同的 會使得F-score有不同的側重點,如圖3所示。
四、ROC曲線和AUC值
對於邏輯回歸模型,ROC曲線和AUC值的實現代碼也很簡單,如下所示。其中參數「predProb」是預測的類別1的概率,參數「label」是真實結果。可以看到這份代碼不僅針對邏輯回歸,對其他評分模型也是適用的。
from sklearn import metricsdef AUC(predProb, label): """ 計算False positive rate, True positive rate和AUC """ # 得到False positive rate和True positive rate fpr, tpr, _ = metrics.roc_curve(label, predProb) # 得到AUC auc = metrics.auc(fpr, tpr) return fpr, tpr, auc
將模型結果表示出來就如圖4所示。
五、廣告時間
這篇文章的大部分內容參考自我的新書《精通數據科學:從線性回歸到深度學習》,歡迎大家購買。
另外歡迎大家觀看我的公開課,懇請大家批評與指正。
數據科學「內戰」:統計 vs. 機器學習推薦閱讀:
※一文概覽用於數據集增強的生成對抗網路架構
※機器學習筆記005 | 更加接近現實情況的預測
※機器學習基石筆記15-16:小結和雜談
※機器學習基石筆記2:感知器學習演算法(PLA)