模型評估和性能度量

2021-03-02 Chance的知識庫

  在數據挖掘領域,我們會根據任務的類型、難度以及實際需求來建立不同的模型,最終建立的模型雖然類型迥異,但建模過程卻遵循著一套科學且成熟的評估和度量思想。模型評估方法主要是為了通過分配訓練集和測試集來估算模型在未知數據集中的泛化能力,以此調整參數或選擇模型;性能度量主要是通過設立的不同指標,從各方面衡量模型的性能,如模型預測的精確性等。大白話來說,就是如何評價機器學習模型好不好。

由於各類方法和指標的概念較多,因此現實中許多人錯誤理解或使用相關概念,從而造成了一些事與願違的案例。因此本文將主要介紹常用的方法和指標,在易混淆的地方加以說明,並介紹相關基於Python的工具。需要注意的是,本文涉及到相關概念的數學表達,原理和性質的推導不講介紹。

1 評估方法1.1留出法

  一般來說,我們更在乎的是模型在未知數據集上的表現,即模型的泛化能力。為了能夠估計模型的泛化能力,可以將數據集按比例簡單地劃分為訓練集(training set)驗證集(validation set),其中該比例常取$2:1$或$4:1$,這就是留出法(hold-out)。但需要注意的是,在樣本劃分後需要保證訓練集和測試集的樣本分布和原始數據集的樣本分布一致,因此常基於分層抽樣(stratified sampling)的原則來劃分樣本。

註:測試數據更多地是指模型在實際使用中遇到的數據,為了和模型評估中使用的測試集進行區分,一般會把模型評估用的測試集叫做驗證集(validation set)

  核心代碼如下:

# 適合快速分配訓練集和測試集from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3, random_state=0)

1.2 交叉驗證

  由於留出法僅對樣本按比例隨機劃分一次,將導致模型評估的結果具有較大隨機性,因此在實際中常使用交叉驗證來評估模型。交叉驗證(cross validation)也稱為k折交叉驗證(k-fold cross validation),即將數據集劃分為k個互斥子集,每次使用k-1個子集的併集作為訓練集,餘下的一個子集作為驗證集,這就構成了k組訓練/驗證集,從而可以進行k次訓練和驗證。最終取k次驗證的均值作為評估結果。其中,k常取5或10,10折交叉驗證的過程如下圖所示。

  特別地,令k=n(n為數據集樣本數)的交叉驗證稱為留一法(Leave-One-Out,簡稱LOO),即有多少樣本就進行多少次訓練和驗證,並且每次只留下一個樣本做驗證。該方法的優勢在於無需擔心樣本隨機劃分帶來的誤差,因為每次劃分都是唯一的。一般來說,留一法的評估結果被認為是比較準確的。但是當數據集較大時,使用留一法需要訓練的模型過多,導致計算開銷巨大。

  核心代碼如下:

# K折交叉驗證from sklearn.model_selection import KFoldkf = KFold(n_splits=5) #5折交叉for train_index, test_index in kf.split(X):  X_train, X_test = X[train_index], X[test_index]  y_train, y_test = y[train_index], y[test_index]

1.3 自助法

  自助法(bootstrapping)可以避免因樣本分配規模的不同而造成的偏差,以自助採樣(bootstrap sampling)為基礎,對包含n個樣本的源數據集進行有放回的n次採樣以獲得同等規模的訓練集。在這m次採樣中都不被抽到的概率大約為0.368,也即源數據集中有大約1/3的樣本是訓練集中沒有的。因此,我們可以採用這部分樣本作為驗證集,所得的結果稱為包外估計(out-of-bag estimate)

  該方法適用於數據量小且難以劃分訓練/驗證集的情況。由於自助法能產生多個不同訓練集,所以對集成學習也大有好處。但需要注意的是,自助法改變了數據集的分布,由此引入了一些額外的誤差。因此數據量充足時,建議使用留出法或交叉驗證法。

  核心代碼如下:

# mini demoimport numpy as npnp.random.seed(1212)die_vals = np.array([1, 2, 3, 4, 5, 6])# 有放回抽樣np.random.choice(die_vals, size=10)

2 度量指標2.1 回歸問題指標2.1.1 RSS

  殘差平方和(Residual sum of square,RSS)描述了估計量和被估計量之間的差異,是每個樣本點殘差的總和,形式如下:  

import numpy as npnp.sum((y_pred - y_true) ** 2)

2.1.2 MSE

  均方誤差(mean-square error,MSE)是RSS的期望,其形式如下:  

  核心代碼如下:

from sklearn.metrics import mean_squared_errormean_squared_error(y_true, y_pred)

2.1.3 RMSE

  均方根誤差(root-mean-square error,RMSE)是MSE的開放形式,其形式如下: 

  核心代碼如下:

import numpy as npfrom sklearn.metrics import mean_squared_errornp.sqrt(mean_squared_error(y_true, y_pred))

2.1.4 MAE

  平均絕對誤差(Mean Absolute Error,MAE)對誤差採用絕對值的方式表達,其形式為: 

  核心代碼如下:

from sklearn.metrics import mean_absolute_errormean_absolute_error(y_true, y_pred)

2.1.5 $R^2$

  確定係數R-Square($R^2$)度量因變量的變異中可由自變量解釋部分所佔的比例,以此來判斷回歸模型的解釋力,形式為: 

from sklearn.metrics import r2_scorer2_score(y_true,y_pred)

2.2 分類問題指標2.2.1 Confusion matrix

  混淆矩陣(confusion matrix)常用於監督學習中,矩陣的每一列代表一個類的實例預測,每一行表示一個實際的類的實例,其可以方便地看出機器是否將兩個不同的類混淆了(比如說把一個類錯當成了另一個)。

  假設處理一個二分類問題,按照模型預測值和真實值可以把測試樣本劃分為四種情形:真正例(true positive),假正例(false positive),真反例(true negative),假反例(false negative)。混淆矩陣的表示如下:

真實情況預測結果正例反例正例TP(真正例)FN(假反例)反例FP(假正例)TN(真反例)

註:positive和negative指的是模型預測的類別,true和false是結合真實情況,對預測類別的一個評判。如真實情況是positive,預測也是positive,那麼則是TP(true positive);如果預測是negative,那麼則是FN(false negative)。

  核心代碼如下:

from sklearn.metrics import confusion_matrixconfusion_matrix(y_true, y_pred)

2.2.2 Accuracy

  在分類任務中,通常把分對的樣本數佔樣本總數的比例稱為精度(accuracy),是一個全局的指標,形式如下: 

  核心代碼如下:

from sklearn.metrics import accuracy_scoreaccuracy_score(y_true, y_pred)

2.2.3 Precision

  查準率,又稱準確率(precision),用于衡量模型避免錯誤的能力,分母是模型預測的正例數目,其形式為: 

from sklearn.metrics import precision_scoreprecision_score(y_true, y_pred)

2.2.4 Recall

  查全率,又稱召回率(recall),用于衡量模型避免缺漏的能力,分母是測試樣本真正包含的正例數目,其形式為: 

  核心代碼如下:

from sklearn.metrics import recall_scorerecall_score(y_true, y_pred)

2.2.5 F1 Score

  F1 Score,是查準率和查全率的調和平均,用於綜合考慮這兩個性能度量。 

有時候我們對查準率,查全率的需求是不同的。比方說廣告推薦,要儘量避免打擾用戶,因此查準率更重要;而逃犯檢索,因為漏檢的危害很大,所以查全率更重要。這時就需要使用 

   

  核心代碼如下:

from sklearn.metrics import f1_scoref1_score(y_true, y_pred)

2.2.6 ROC

  很多時候,使用模型對測試樣本進行預測得到的是一個實值或者概率,需要進一步設置閾值(threshold),然後把預測值和閾值進行比較才能獲得最終預測的標記,如邏輯回歸等模型。

  ROC,全稱受試者工作特徵(Receiver Operating Characteristic)。先定義兩個重要的計算量:真正例率(True Positive Rate,簡稱TPR)假正例率(False Positive Rate,簡稱FPR)

 

其中,TPR為召回率。在繪製ROC曲線時,縱軸為TPR,橫軸為FPR。首先按預測值對樣本進行排序,然後按序逐個把樣本預測為正例,並計算此時的TPR和FPR,然後在圖上畫出該點,並與前一個點連線。如下圖:

  有兩個值得注意的特例:

•經過 (0,1) 點的曲線,這代表所有正例都在反例之前出現(否則會先出現假正例從而無法經過 (0,1) 點),這是一個理想模型,我們可以設置一個閾值,完美地分割開正例和反例。•對角線,這對應於隨機猜測模型,可以理解為真正例和假正例輪換出現,即每預測對一次接下來就預測錯一次,可以看作是隨機猜測的結果。

註:ROC適用於數據類別平衡時的模型評價。當數據類別不平衡時,可以繪製P-R(precision-recall)曲線。

  核心代碼如下:

import numpy as npfrom sklearn.metrics import roc_curvefpr, tpr, thresholds = roc_curve(y_true, y_pred, pos_label=2)

2.2.7 AUC

  若一個模型的ROC曲線完全包住了另一個模型的ROC曲線,我們就認為這個模型更優。但是如果兩條曲線發生交叉,要怎麼判斷呢?比較合理的判據是AUC(Area Under ROC Curve),即ROC曲線下的面積,其形式為: 

from sklearn.metrics import roc_auc_scoreroc_auc_score(y_true, y_pred)

2.2.8 IoU

  在目標檢測任務中,不僅要識別出圖像中目標對象的類別,還要識別出其在圖像中的位置,並常用矩形框(bounding box)表示。其中,識別類別歸屬於分類問題,可以使用常規分類任務的指標衡量模型的性能,如何高效地評價模型對位置預測的能力呢?答案是IoU(Intersection of Union)(對於IOU有很多改進的算法,本文僅介紹最naive的)。

  IoU可以通過判斷預測框(predicted bounding box)真實框(ground-truth bounding box)的貼合程度來評判模型對位置預測的好壞,如下圖所示,IoU即為兩個矩形框的交集與併集的比值,所以其值範圍為 

  通過預測框的類別和IoU,可以計算混淆矩陣,以某一個類目標為例(即假設是一個二分類問題),如下圖所示:

混淆矩陣的四個值如下:

TP(True Positive):表示預測框正確地與標籤框匹配了,兩者間的IoU大於0.5,如上圖中右邊的虛線框。•FP(False Positive):表示將背景預測成了目標物體,如左下方的虛線框,該預測框與真實框的IoU一般不會大於0.5。•FN(False Negative):表示需要模型檢測出的物體,模型沒有檢測出,如左邊的小貓。•TN(True Negative):表示本身是背景,模型也沒有檢測出,這種情況在目標檢測中通常不需要考慮。

  核心代碼如下:

def get_area(box):    return (box[3] - box[1]) * (box[2] - box[0])def iou(boxA, boxB):    left_max = max(boxA[0], boxB[0])    top_max = max(boxA[1], boxB[1])    right_min = min(boxA[2], boxB[2])    bottom_min = min(boxA[3], boxB[3])    inner_area = get_area((left_max, top_max, right_min, bottom_min))    areaA = get_area(boxA)    areaB = get_area(boxB)    iou = inner_area / (areaA + areaB - inner_area)    return iou

2.2.9 mAP

  有了上述混淆矩陣的基礎後,可以使用一個更make sense的指標衡量模型檢測的能力,即mAP(mean Average Precision)。其中,AP指的是一個類別的檢測精度,mAP則是多個類別的平均精度。要計算mAP,首先得計算個類別AP指標,在此之前,得明確兩個概念:

Dets:預測框中的物體類別、邊框位置的4個預測值、該物體的得分;•GTs:真實框中的物體類別、邊框位置的4個真實值。

  AP指標的計算步驟如下圖所示:

得到FP和TP的數量後,可以計算模型的召回率(Recall,R)和準確率(Precision,P),計算過程如下式: 

遍歷每一個預測框時,可以生成對應的P與R(注意要累計),這兩個值可以組成一個點(R, P),將所有的點繪製成曲線,即形成了P-R曲線,AP即使P-R曲線下的面積,其形式為 

  AP代表了曲線面積,綜合考量了不同召回率下的準確率,不會對召回率或準確率其中一個有偏好。此外,每個類別的AP指標都是獨立的,將每個類別的AP取平均後即可得到mAP。

  核心代碼如下:

import numpy as npdef calc_ap(prec, rec):    mrec = np.array([0, rec, 1])    mpre = np.array([0, prec, 0])    for i in range(mrec.size - 2, -1, -1):        mpre[i] = max(mpre[i], mpre[i+1]);    idx1 = np.where(mrec[1 : ]   != mrec[0 : 2])    idx2 = [x + 1 for x in idx1]    ap = sum((mrec.take(idx2) - mrec.take(idx1)) * mpre.take(idx2))    print "ap = " + str(ap)    return apmAP = sum(ap)/N

2.3 偏差和方差

  除了估計算法的泛化性能,我們往往還希望知道為什麼有這樣的性能?這時一個有用的工具就是偏差-方差分解(bias-variance decomposition)

知乎上面有兩個問題都有不錯的答案,不妨先看看:[1] 機器學習中的Bias(偏差),Error(誤差),和Variance(方差)有什麼區別和聯繫?;[2] 偏差和方差有什麼區別?。

  對學習算法的期望泛化錯誤率進行拆解,最終會發現能拆解為三個項(需要推導): 

方差(variance)偏差(bias)噪聲(noise): 

•方差:使用同規模的不同訓練集進行訓練時帶來的性能變化,刻畫數據擾動帶來的影響;•偏差:學習算法的期望預測與真實結果的偏離程度,刻畫算法本身的擬合能力;•噪聲:當前任務上任何算法所能達到的期望泛化誤差的下界(即不可能有算法取得更小的誤差),刻畫問題本身的難度

  也即是說,泛化性能是有學習算法的擬合能力,數據的充分性以及問題本身的難度共同決定的。給定一個任務,噪聲是固定的,我們需要做的就是儘量降低偏差和方差。

  但是這兩者其實是有衝突的,這稱為偏差-方差窘境(bias-variance dilemma)。給定一個任務,我們可以控制算法的訓練程度(如決策樹的層數)。在訓練程度較低時,擬合能力較差,因此訓練數據的擾動不會讓性能有顯著變化,此時偏差主導泛化錯誤率;在訓練程度較高時,擬合能力很強,以至於訓練數據自身的一些特性都會被擬合,從而產生過擬合問題,訓練數據的輕微擾動都會令模型產生很大的變化,此時方差主導泛化錯誤率。

  注意,將泛化性能完美地分解為方差、偏差、噪聲這三項僅在基於均方誤差的回歸任務中得以推導出,分類任務由於損失函數的跳變性導致難以從理論上推導出分解形式,但已經有很多方法可以通過實驗進行估計了。

參考:

1.《機器學習》周志華2.模型評估和選擇3.《深度學習之PyTorch物體檢測實戰》董洪義

相關焦點

  • 機器學習模型評估指標: 準確率, F1-score, AUC
    選擇恰當的評估指標,可以使模型訓練和測試事半功倍。本文介紹分類模型評估的幾個常用指標。理解並能熟練使用這幾個指標對模型進行評估,基本可以應對初中級的數據建模工作。錯誤率 (error rate) 即預測錯誤的樣本佔總樣本的比率;準確率 (accuracy) 則是預測正確的樣本佔總樣本的比率;兩者之和為1100個真實的測試樣本中有80個正例,20個反例,模型預測結果全是正例,則該模型的錯誤率和準確率分別是多少?
  • 你知道這11個重要的機器學習模型評估指標嗎?
    評估指標解釋了模型的性能。評估指標的一個重要方面是它們區分模型結果的能力。我見過很多分析師和數據科學家不費心檢查他們的模型的魯棒性。一旦他們完成了模型的構建,他們就會匆忙地將其應用到不可見的數據上。這是一種錯誤的方法。你的動機不是簡單地建立一個預測模型。它是關於創建和選擇一個模型,使其對樣本外的數據具有高精度。因此,在計算預測值之前,檢查模型的準確性是至關重要的。
  • 比較目標檢測模型性能的統計量,了解一下?
    每個模型的好壞是通過評價它在某個數據集上的性能來判斷的,這個數據集通常被叫做「驗證/測試」數據集。這個性能由不同的統計量來度量,包括準確率( accuracy )、精確率( precision )、召回率( recall )等等。選擇我們會根據某個特定的應用場景來選擇相應的統計量。而對每個應用來說,找到一個可以客觀地比較模型好壞的度量標準至關重要。
  • 如何評估模型的好壞?
    我告訴他,單純地進行模型比較是沒有意義的,每一個模型都有自己的適用場景,都有自己的優勢和弱勢,要評估模型的好壞,需要放在一個特定的數據場景下。一句話,模型的好壞不是由人來說了算的,是由數據(應用場景)說了算!需要使用真實數據對該模型進行評估,你才能判斷說,在這種應用場景下,採用哪個模型會更好。
  • 【乾貨】Python機器學習項目實戰2——模型選擇,超參數調整和評估(附代碼)
    數據清理和格式化 2. 探索性數據分析 3. 特徵工程和特徵選擇 4. 在性能指標上比較幾種機器學習模型 5. 對最佳模型執行超參數調整 6. 在測試集合中評估最佳模型 7. 解釋模型結果 8. 得出結論。在第一篇文章中,我們對數據進行了清理和結構化,進行了探索性的數據分析,開發了一組用於我們模型的特徵,並建立了一個基準(baseline)來衡量性能。
  • 機器學習實戰:模型評估和優化
    我們希望自己的機器學習模型在新數據(未被標註過的)上取得儘可能高的準確率。換句話說,也就是我們希望用訓練數據訓練得到的模型能適用於待測試的新數據。正是這樣,當實際開發中訓練得到一個新模型時,我們才有把握用它預測出高質量的結果。因此,當我們在評估模型的性能時,我們需要知道某個模型在新數據集上的表現如何。
  • 機載武器系統作戰效能綜合評估方法
    機載武器自主飛行任務剖面通常包括使用方案、環境條件、飛行時間、突防對象和打擊目標等。機載武器自主飛行任務剖面對機載武器飛行可靠性、命中概率、突防概率和毀傷概率等有較大的影響。3 作戰效能綜合評估3.1 作戰效能模型武器系統的效能是指在特定條件下,武器系統被用來執行規定任務所能達到預期可能目標的度量。
  • 系統IO性能評估、優化和監控原理
    一、評估 IO 能力的前提評估一個系統IO能力的前提是需要搞清楚這個系統的IO模型是怎麼樣的。那麼IO模型是什麼,為什麼要提煉IO模型呢?(一) IO模型在實際的業務處理過程中,一般來說IO比較混雜,比如說讀寫比例、IO尺寸等等,都是有波動的。
  • 在機器學習回歸問題中,你應該使用哪種評估指標?
    )和均方根誤差(MAE)評估指標,而不用考慮太多。R²是一個相對度量,所以您可以使用它來與在相同數據上訓練的其他模型進行比較。你可以用它來大致了解一個模型的性能。我們看看R軸是怎麼計算的。向前!➡️這是一種表示R的方法。
  • 乾貨|OpenVINO 模型性能評估工具—DL Workbench 的介紹與使用
    下載完成後顯示如下圖,會生成一個帶token的本地服務地址,每次重新啟動後地址連結都是變化的,因為token是隨機生成的,到這一步就安裝完成了。下載完成後雙擊將該模型添加到配置中,並配置工作檯為當地工作檯,運行環境為cpu,以及導入的數據集,完成後會看到頁面左上角的全部配置參數。
  • 除了專家模型,這兩大模型也被普遍應用於信用評估
    預測模型旨在評估未知借款者將來是否還款的信用價值,將潛在借款者的特徵值輸入模型,從模型中輸出信用價值評估,從而可對潛在借款人進行信用評估。一般的評級方法可以分為專家經驗判斷法、參數模型和非參數模型。所謂的專家經驗判斷,就是相關專家根據主觀經驗進行打分,後兩種方法都是根據模型進行客觀的計算。
  • 機器學習|模型的評估:交叉檢驗Cross Validation和ROC曲線
    ,可以從有限的數據中獲得儘可能多的有效信息,流程:選取模型參數→導入訓練數據(training set)→建模→用驗證數據(validation set)測試模型效果。交叉驗證過程不能接觸Testing data,該無標籤數據只能使用一次模型,不能反饋結果回去再修改模型。
  • A-SPICE過程評估模型
    3.3.過程評估模型過程評估模型提供了用於識別過程結果和過程屬性結果(成果)在項目和組織單位實例化過程中是否存在的指標
  • 【可靠性知識】詳談一種複雜系統可靠性與安全性評估方法
    第二個問題是一個質量彈簧阻尼模型,在阻尼係數、彈性常數、激勵的幅度和頻率等參數不確定時,如何對系統的穩態放大係數進行量化表示。提出這一問題的背景是,在核試驗禁止之後,由於缺乏充分的實驗數據,對系統的認識中存在著大量的不確定性,美國庫存核武器的安全性、可靠性和性能評估面臨挑戰,新武器的研製能否滿足性能指標缺乏充分的驗證。
  • ACL最佳論文提出最新NLP模型測試方法,最佳論文提名也不可小覷
    最佳論文:Beyond Accuracy: Behavioral Testing of NLP Models with CheckList論文連結:https://arxiv.org/abs/2005.04118儘管測量模型的準確性一直是評估模型泛化能力的主要方法,但它通常會高估NLP模型的性能。
  • 磁碟 IO 和網絡 IO 該如何評估、監控、性能定位和優化?
    一、評估 IO 能力的前提評估一個系統IO能力的前提是需要搞清楚這個系統的IO模型是怎麼樣的。那麼IO模型是什麼,為什麼要提煉IO模型呢?(一) IO模型在實際的業務處理過程中,一般來說IO比較混雜,比如說讀寫比例、IO尺寸等等,都是有波動的。所以我們提煉IO模型的時候,一般是針對某一個特定的場景來建立模型,用於IO容量規劃以及問題分析。
  • NLP實戰篇之tf2訓練與評估
    本文是基於tensorflow2.2.0版本,介紹了模型的訓練與評估。簡單文本分類模型示例 如下面代碼所示,根據【NLP實戰篇之tensorflow2.0快速入門】獲取一個完整的文本分類示例,其中包含數據獲取、數據簡單預處理、模型構建、訓練與評估。
  • 評估多重共線性 - vif
    簡言之, 就是自變量之間的相關性, 在線性模型裡有個假設: 自變量之間不相關或者相關性較低. 用邏輯回歸這種廣義線性模型的時候也要評估多重共線性, 如果相關性過大就需要刪減變量. 但是我就只會用兩兩相關性pearson係數去篩選變量, 工作後認識了vif但是還沒用過.
  • 系統效能評估到體系貢獻度評估?
    武器系統效能是對武器系統在規定條件下和在規定時間內滿足一組特定任務要求程度的度量。武器系統效能評估的基本方法有專家評定法、試驗統計法、作戰模擬法、指數法、解析法等多種。將武器系統放在體系條件下考慮效能問題時,裝備效能評估研究需要以體系對抗為背景,從體系對抗出發開展在體系條件下軍事裝備的效能分析與評估,以適應高技術軍事裝備的發展狀況,高效、準確地評價其效能。
  • Meta Learning 1: 基於度量的方法
    以下圖的圖像分類任務為例,我們的使用場景是已知一個2分類的訓練集,每個類只有4張照片,用這個訓練集訓練神經網絡模型,使模型可以對這2個類別對應的新照片進行準確識別。(為了展示方便,本文的大部分例子和配圖會是圖像分類,文本分類的原理是與之相通的。)