數據挖掘:模型評估指標

數據挖掘:模型評估

一般在比賽中,我們會看到對於迴歸(分類)問題,不同的比賽會有不同的評價指標。我們在訓練模型時,不能只記住迴歸問題用均方誤差,而不去在意比賽目標的評價指標,這樣我們往往會得到比較差的結果,南轅北轍。

一、爲什麼會有這麼多衡量的指標

因爲具體場景不同,比賽會有不同的偏向。比如,同一個問題,M1和M2分類的準確率不一樣,這時,就需要看具體的要求,如果側重M1多一些,那麼在優化時,就應該對M1進行側重優化。
在這裏插入圖片描述

常見的一些評價指標。
在這裏插入圖片描述
這裏貼出網上寫的比較好的模型評估的文章,由於本人的知識量有限,無法做出較好的總結,因此先參考別人的。等以後對這塊更加熟悉後,再做補充。
機器學習模型的評價指標和方法
機器學習模型評價(Evaluating Machine Learning Models)-主要概念與陷阱
機器學習模型相關評價指標最全總結
模型評估常用指標
另外,本篇文章也是來自菜菜機器學習

二、迴歸問題評估指標

迴歸類與分類型算法的模型評估其實是相似的法則——找真實標籤和預測值的差異。迴歸類算法中,我們有兩種不同的角度來看待迴歸的效果:
第一,我們是否預測到了正確的數值
第二,我們是否擬合到了足夠的信息。
這兩種角度,分別對應着不同的模型評估指標。

否預測到了正確的數值:MSE和MAE

RSS殘差平方和,是預測值與真實值之間的差異,也就是從第一種角度來評估我們迴歸的效力,所以RSS既是我們的損失函數,也是我們迴歸類模型的模型評估指標之一。但是,RSS有着致命的缺點:它是一個無界的和,可以無限地大,(樣本越多,殘查平方和越大)。
爲了應對這種狀況,sklearn中使用RSS的變體,均方誤差MSE(mean squared error)來衡量我們的預測值和真實值的差異(這樣就消除了由於樣本因素而對模型評估的影響。),得到有了平均誤差。就可以將其和標籤的取值範圍在一起比較,以此獲得一個較爲可靠的評估依據。(得到每一個樣本上的平均誤差,跟均值比較看相差有多少)在sklearn當中,我們有兩種方式調用這個評估指標,

  1. 是使用sklearn專用的模型評估模塊metrics裏的類mean_squared_error,
  2. 是調用交叉驗證的類cross_val_score並使用裏面的scoring參數來設置使用均方誤差。
    在這裏插入圖片描述

1. 均方誤差爲負
cross_val_score(reg,X,y,cv=10,scoring=“neg_mean_squared_error”)
因爲均方誤差本身是一種誤差,損失。所以被sklearn劃分爲模型的一種損失(loss)。在sklearn當中,所有的損失都使用負數表示,因此均方誤差也被顯示爲負數了。真正的均方誤差MSE的數值,其實就是neg_mean_squared_error去掉負號的數字。
metrics裏可以調出正的均方誤差。

MAE:Mean absolute error,絕對均值誤差
在這裏插入圖片描述
其表達的概念與均方誤差完全一致,不過在真實標籤和預測值之間的差異外我們使用的是L1範式(絕對值)。現實使用中,MSE和MAE選一個來使用就好了。(MAE比MSE對異常值更加不敏感,有較好的魯棒性
在sklearn當中,我們使用命令from sklearn.metrics import mean_absolute_error來調用MAE。
也可以使用交叉驗證中的scoring = “neg_mean_absolute_error”,以此在交叉驗證時調用MAE。

是否擬合了足夠的信息
對於迴歸類算法而言,只探索數據預測是否準確是不足夠的。除了數據本身的數值大小之外,我們還希望我們的模型能夠捕捉到數據的”規律“,比如數據的分佈規律,單調性等等,而是否捕獲了這些信息並無法使用MSE來衡量。
這個圖裏,如果用MSE來衡量,那麼均方誤差會很小,但從圖上看,很明顯這個擬合是不正確的,數據變化的趨勢沒有擬合。因此不能光從MSE上對迴歸數據進行評估。
在這裏插入圖片描述

我們使用方差來衡量數據上的信息量。如果方差越大,代表數據上的信息量越多,而這個信息量不僅包括了數值的大小,還包括了我們希望模型捕捉的那些規律。爲了衡量模型對數據上的信息量的捕捉,我們定義了R^2來幫助我們:
在這裏插入圖片描述
其中分子是MSE,分母是方差,由於都跟樣本的倒數有關,所以約掉了。方差的
本質是任意一個y值和樣本均值的差異,差異越大,這些值所帶的信息越多。
在R^2中,分子是真實值和預測值之差的差值(衡量差異程度),也就是我們的模型沒有捕獲到的信息總量,分母是真實標籤所帶的信息量,所以其衡量的是1 - 我們的模型沒有捕獲到的信息量佔真實標籤中所帶的信息量的比例,所以, R^2越接近1越好。
sklearn中可以使用三種方式來調用,

  1. 是直接從metrics中導入r2_score,輸入預測值和真實值後打分。
  2. 是直接從線性迴歸LinearRegression的接口score來進行調用。(所有迴歸模型都有這個接口)
  3. 是在交叉驗證中,輸入"r2"來調用。
from sklearn.metrics import r2_score
r2_score(yhat,Ytest)
r2 = reg.score(Xtest,Ytest)
r2

然而這兩種結果不一樣。。。

2. 相同的評估指標不同的結果

在我們的分類模型的評價指標當中,我們進行的是一種 if a == b的對比,這種判斷和if b == a其實完全是一種概念,所以我們在進行模型評估的時候,從未踩到我們現在在的這個坑裏。
然而看R2的計算公式,R2明顯和分類模型的指標中的accuracy或者precision不一樣,R2涉及到的計算中對預測值和真實值有極大的區別,必須是預測值在分子,真實值在分母,所以我們在調用metrcis模塊中的模型評估指標的時候,必須要檢查清楚,指標的參數中,究竟是要求我們先輸入真實值還是先輸入預測值。(在給R^2參數時,要注意輸入的是分子【預測值】還是分母【真實值】,輸入的順序不同,結果也不一樣。

3. 負的 R^2
TSS=ESS+RSS不是永遠成立的。
在這裏插入圖片描述
在這裏插入圖片描述
關於2()/TSS,()內的公式是否等於0.需要查看線性迴歸的有關假設條件:

  1. 因變量和自變量之間具有線性關係
  2. 在重複抽樣中,自變量的取值是固定的,即假設x是非隨機的
  3. 誤差項是一個期望爲0的隨機變量。
  4. 對所有x,誤差項的方差都相同
  5. 誤差項服從正態分佈.
    其中3條件若不滿足,則()內的公式就不會爲0.
    在這裏插入圖片描述

在這裏插入圖片描述
當R^2爲負時,首先看建模過程和數據處理過程是否正確,也許你已經傷害了數據本身,也許你的建模過程是存在bug的。如果是集成模型的迴歸,檢查你的弱評估器的數量是否不足,隨機森林,提升樹這些模型在只有兩三棵樹的時候很容易出現負的 。如果你檢查了所有的代碼,也確定了你的預處理沒有問題,但你的 R^2 也還是負的,那這就證明線性迴歸模型不適合你的數據。

另外還有

三、分類問題評估指標

在用準確率衡量分類問題時,對於少數類樣本的情況無法進行正常捕捉。(比如,80個正,20個負,如果都預測爲正,那麼就會有80%的準確率,但這毫無意義,對於信用卡詐騙等,我們更關心少數類樣本,因此無法用準確率去衡量)我們往往在尋找捕獲少數類的能力將多數類判錯後需要付出的成本的平衡如果一個模型在能夠儘量捕獲少數類的情況下,還能夠儘量對多數類判斷正確,則這個模型就非常優秀了。爲了評估這樣的能力,我們將引入新的模型評估指標:混淆矩陣和ROC曲線

混淆矩陣
混淆矩陣是二分類問題的多維衡量指標體系,在樣本不平衡時極其有用。在混淆矩陣中,我們將少數類認爲是正例,多數類認爲是負例。(真實值永遠寫在前面)
在這裏插入圖片描述
我們有六個不同的模型評估指標,這些評估指標的範圍都在[0,1]之間,以11和00爲分子的指標都是越接近1越好,以01和10爲分子的指標都是越接近0越好。

3.1 捕捉少數類的藝術:精確度,召回率和F1 score

模型整體效果:準確率
準確率Accuracy,就是所有預測正確的所有樣本除以總樣本,通常來說越接近1越好。
在這裏插入圖片描述

捕捉少數類的藝術:精確度,召回率和F1 score

精確度Precision,又叫查準率,表示所有被我們預測爲是少數類的樣本中,真正的少數類所佔的比例
在這裏插入圖片描述
精確度越低,則代表我們誤傷了過多的多數類(在我們預測爲少數類的樣本中,既有多數類又有少數類,所以,如果我們的精確度很低,那麼就說明有很多本來是多數類的被我們誤傷成了少數類,如果我們對多數類判誤的代價比較高,即我們希望有很多多數類被判正確,那麼我們就不應該誤傷多數類,要追求高精確度)。精確度越低,我們對多數類的判斷就會越錯誤。當然了,如果我們的目標是不計一切代價捕獲少數類,那我們並不在意精確度。在意多數類是否被判斷正確,選擇精確度。

召回率Recall,又被稱爲敏感度(sensitivity),真正率,查全率
表示所有真實爲1的樣本中,被我們預測正確的樣本所佔的比例。
在這裏插入圖片描述
只跟少數類有關。召回率越高,代表我們儘量捕捉出了越多的少數類(這個的前提是所有的類別都爲真實的少數類,所以,召回率越高,代表真實的少數類中,我們預測對的比例越大,即捕捉到了更多的少數類),召回率越低,代表我們沒有捕捉出足夠的少數類。

召回率和精確度是此消彼長的(少數類跟多數類之間很多時候是交疊在一起的,在捕捉少數類的同時,也會誤傷一些多數類),兩者之間的平衡代表了捕捉少數類的需求和儘量不要誤傷多數類的需求的平衡。 是誤傷多數類的成本高,還是無法捕捉少數類的成本更高,這之間需要根據業務進行衡量。

爲了同時兼顧精確度和召回率,我們創造了兩者的調和平均數作爲考量兩者平衡的綜合性指標,稱之爲F1measure。兩個數之間的調和平均傾向於靠近兩個數中比較小的那一個數,因此我們追求儘量高的F1 measure,能夠保證我們的精確度和召回率都比較高。F1 measure在[0,1]之間分佈,越接近1越好。
在這裏插入圖片描述

3.2 判錯多數類的考量:特異度與假正率

**特異度(Specificity)**表示所有真實爲0的樣本中,被正確預測爲0的樣本所佔的比例。
在這裏插入圖片描述

特異度衡量了一個模型將多數類判斷正確的能力,而1 - specificity就是一個模型將多數類判斷錯誤的能力,這種能力被計算如下,並叫做假正率(False Positive Rate)。(假正率:有多少多數類被判錯了。精確度:有多少少數類被判對了。)

在這裏插入圖片描述

sklearn中由混淆矩陣衍生出的六個模型評估指標:
在這裏插入圖片描述

3.3 ROC曲線以及其相關問題

在我們的六個評估指標中,最重要的是召回率,然後是精確率,以及假正率FPR。

假正率有一個非常重要的應用:我們在追求較高的Recall的時候,Precision會下降,就是說隨着更多的少數類被捕捉出來,會有更多的多數類被判斷錯誤,但我們很好奇,隨着Recall的逐漸增加,模型將多數類判斷錯誤的能力如何變化呢?我們希望理解,我每判斷正確一個少數類,就有多少個多數類會被判斷錯誤假正率(在多數類中,有多少多數類被判錯了)正好可以幫助我們衡量這個能力的變化。(Recall越大,少數類被捕捉的也就越多,同時,也會誤傷到更多的多數類,誤傷意味着有更多的多數類被判錯誤,而FPR是衡量多數類中,有多少多數類被判錯誤,所以FPR也會隨着Recall增加而增加。如果Recall比FPR增加的快,證明判斷出一個少數類的代價不是很大;如果FPR比Recall增加的快,那就說明判斷出一個少數類要犧牲更多的多數類)

相對的,Precision無法判斷這些判斷錯誤的多數類在全部多數類中究竟佔多大的比例,所以無法在提升Recall的過程中也顧及到模型整體的Accuracy。因此,我們可以使用Recall和FPR之間的平衡,來替代Recall和Precision之間的平衡,讓我們衡量模型在儘量捕捉少數類的時候,誤傷多數類的情況如何變化,這就是我們的ROC曲線衡量的平衡

ROC曲線,全稱The Receiver Operating Characteristic Curve。這是一條以不同閾值下的假正率FPR爲橫座標,不同閾值下的召回率Recall爲縱座標的曲線

概率(probability)與閾值(threshold)
概率:樣本點判別爲某一類的概率
閾值:人爲設定的數,若概率大於閾值,則會被設定爲某一類。

要理解概率與閾值,最容易的狀況是來回憶一下我們用邏輯迴歸做分類的時候的狀況。邏輯迴歸的predict_proba接口對每個樣本生成每個標籤類別下的似然(類概率)。對於這些似然,邏輯迴歸天然規定,當一個樣本所對應的這個標籤類別下的似然大於0.5的時候,這個樣本就被分爲這一類。在這個過程中,0.5就被稱爲閾值。
通過不斷調整閾值,可以達到不同Recall和FPR。通常來說,降低閾值能夠提升Recall.

但是注意,並不是升高閾值,就一定能夠增加或者減少Recall,一切要根據數據的實際分佈來進行判斷。而要體現閾值的影響,首先必須的得到分類器在少數類下的預測概率。對於邏輯迴歸這樣天生生成似然的算法和樸素貝葉斯這樣就是在計算概率的算法,自然非常容易得到概率,但對於一些其他的分類算法,比如決策樹,比如SVM,他們的分類方式和概率並不相關。

決策樹有葉子節點,一個葉子節點上可能包含着不同類的樣本。假設一個樣本被包含在葉子節點a中,節點a包含10個樣本,其中6個爲1,4個爲0,則1這個正類在這個葉子節點中的出現概率就是60%,類別0在這個葉子節點中的出現概率就是40%。對於所有在這個葉子節點中的樣本而言,節點上的1和0出現的概率,就是這個樣本對應的取到1和0的概率,大家可以去自己驗證一下。但是思考一個問題,由於決策樹可以被畫得很深,在足夠深的情況下,決策樹的每個葉子節點上可能都不包含多個類別的標籤了,可能一片葉子中只有唯一的一個標籤,即葉子節點的不純度爲0,此時此刻,對於每個樣本而言,他們所對應的“概率”就是0或者1了。這個時候,我們就無法調節閾值來調節我們的Recall和FPR了
所以,如果我們有概率需求,我們還是會優先追求邏輯迴歸或者樸素貝葉斯。不過其實,SVM也可以生成概率。

SVM實現概率預測:重要參數probability,接口predict_proba以及
decision_function

越靠近決策邊界的點,判別爲某一類的概率越模糊,而越遠離邊界,判別爲某一類的概率就越大。點到決策邊界的距離衡量了樣本歸屬於某一類別的可能性。接口decision_function返回的值也因此被我們認爲是SVM中的置信度(confidence)。SVC有重要參數probability。
在這裏插入圖片描述

建立ROC曲線的根本目的是找尋Recall和FPR之間的平衡,讓我們能夠衡量模型在儘量捕捉少數類的時候,誤傷多數類的情況會如何變化
ROC曲線如果是凹的,那麼把正負類調整一下就行。越接近中間的線,越糟糕。
在這裏插入圖片描述
橫座標是FPR,代表着模型將多數類判斷錯誤的能力,縱座標Recall,代表着模型捕捉少數類的能力,所以ROC曲線代表着,隨着Recall的不斷增加,FPR如何增加。
我們希望隨着Recall的不斷提升,FPR增加得越慢越好,這說明我們可
以儘量高效地捕捉出少數類,而不會將很多地多數類判斷錯誤
。所以,我們希望看到的圖像是,縱座標急速上升,橫座標緩慢增長,也就是在整個圖像左上方的一條弧線。這代表模型的效果很不錯,擁有較好的捕獲少數類的能力。
僅從曲線判斷不太靠譜,需要一個數值來衡量曲線靠近左上角的程度。AUC面積,它代表了ROC曲線下方的面積,這個面積越大,代表ROC曲線越接近左上角,模型就越好。AUC面積的計算比較繁瑣,因此,我們使用sklearn來幫助我們。

sklearn中的ROC曲線和AUC面積
在sklearn中,我們有幫助我們計算ROC曲線的橫座標假正率FPR,縱座標Recall和對應的閾值的類sklearn.metrics.roc_curve。同時,我們還有幫助我們計算AUC面積的類sklearn.metrics.roc_auc_score。

在無法獲取模型概率的情況下,其實不必強行使用概率,如果有置信度,那也使可以完成我們的ROC曲線。

利用ROC曲線找出最佳閾值
ROC曲線反
應的是recall增加的時候FPR如何變化,也就是當模型捕獲少數類的能力變強的時候,會誤傷多數類的情況是否嚴重。我們的希望是,模型在捕獲少數類的能力變強的時候,儘量不誤傷多數類,也就是說,隨着recall的變大,FPR的大小越小越好。所以我們希望找到的最有點,其實是Recall和FPR差距最大的點。這個點,又叫做約登指數。

在這裏插入圖片描述

四、聚類問題評估指標

不同於分類模型和迴歸,聚類算法的模型評估不是一件簡單的事。
在分類中,有直接結果(標籤)的輸出,並且分類的結果有正誤之分,所以我們使用預測的準確度,混淆矩陣,ROC曲線等等指標來進行評估,但無論如何評估,都是在”模型找到正確答案“的能力。
而回歸中,由於要擬合數據,我們有SSE均方誤差,有損失函數來衡量模型的擬合程度。但這些衡量指標都不能夠使用於聚類。

4.1 真實標籤已知

在這裏插入圖片描述
在這裏插入圖片描述

4.2 真實標籤未知

聚類,是完全依賴於評價簇內的稠密程度(簇內差異小)和簇間的離散程度(簇外差異大)來評估聚類的效果。其中輪廓係數是最常用的聚類算法的評價指標。(希望b越大越好,a越小越好。)取值範圍爲(-1,1),s大於0,說明聚類效果還可以,越接近1,聚類效果就越好。越接近0,說明這兩個簇沒有什麼區別,可以合併爲一個簇。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
另外,可用卡林斯基-哈拉巴斯指數(Calinski-Harabaz Index,簡稱CHI,也被稱爲方差比標準),戴維斯-布爾丁指數(Davies-Bouldin)以及權變矩陣(Contingency Matrix)等。
其中sklearn.metrics.calinski_harabaz_score (X, y_pred)比較常用,由於是矩陣運算,比較快。
們通常會繪製輪廓係數分佈圖和聚類後的數據分佈圖來選擇我們的最佳n_clusters。代碼請參考上面的機器學習菜菜。
學習曲線不能解決輪廓係數在聚類上的問題,因爲如果不分析每一類聚出來的效果,很難說最高的輪廓係數的值就是最佳聚類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章