Python機器學習筆記:常用評估模型指標的用法


  在機器學習中,性能指標(Metrics)是衡量一個模型好壞的關鍵,通過衡量模型輸出y_predict和y_true之間的某種“距離”得出的。

  對學習器的泛化性能進行評估,不僅需要有效可行的試驗估計方法,還需要有衡量模型泛化能力的評估價標准,這就是性能度量(performance measure)。性能度量反映了任務需求,在對比不同模型的能力時,使用不同的性能度量往往會導致不的評判結果;這意味着模型的“好壞”是相對的,什么樣的模型是好的,不僅取決於算法和數據,還決定於任務需求。

  性能指標往往使我們做模型時的最終目標,如准確率,召回率,敏感度等等,但是性能指標常常因為不可微分,無法作為優化的loss函數,因此采用如cross-entropy,rmse等“距離”可微函數作為優化目標,以期待在loss函數降低的時候,能夠提高性能指標。而最終目標的性能指標則作為模型訓練過程中,作為驗證集做決定(early stoping或model selection)的主要依據,與訓練結束后評估本次訓練出的模型好壞的重要標准。

  在使用機器學習算法的過程中,針對不同的場景需要不同的評價指標,常用的機器學習算法包括分類,回歸,聚類等幾大類型,在這里對常用的指標進行一個簡單的總結,小編總結了前人的很多博客,知乎等,方便自己學習。當然,需要的同學們也可以看一下。

  下圖是不同機器學習算法的評價指標:

   下面是機器學習算法評估指標的Sklearn方法:

#  *************准確率*************
# 1,accuracy_score

# 准確率
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3,9,9,8,5,8]
y_true = [0, 1, 2, 3,2,6,3,5,9]

accuracy_score(y_true, y_pred)
Out[127]: 0.33333333333333331

accuracy_score(y_true, y_pred, normalize=False)  # 類似海明距離,每個類別求准確后,再求微平均
Out[128]: 3

# 2, metrics
from sklearn import metrics
metrics.precision_score(y_true, y_pred, average='micro')  # 微平均,精確率
Out[130]: 0.33333333333333331

metrics.precision_score(y_true, y_pred, average='macro')  # 宏平均,精確率
Out[131]: 0.375

metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro')  # 指定特定分類標簽的精確率
Out[133]: 0.5

#  *************召回率*************
metrics.recall_score(y_true, y_pred, average='micro')
Out[134]: 0.33333333333333331

metrics.recall_score(y_true, y_pred, average='macro')
Out[135]: 0.3125

#  *************F1*************
metrics.f1_score(y_true, y_pred, average='weighted')  
Out[136]: 0.37037037037037035

#  *************F2*************
# 根據公式計算
from sklearn.metrics import precision_score, recall_score
def calc_f2(label, predict):
    p = precision_score(label, predict)
    r = recall_score(label, predict)
    f2_score = 5*p*r / (4*p + r)
    return f2_score

#  *************混淆矩陣*************
from sklearn.metrics import confusion_matrix
confusion_matrix(y_true, y_pred)

Out[137]: 
array([[1, 0, 0, ..., 0, 0, 0],
       [0, 0, 1, ..., 0, 0, 0],
       [0, 1, 0, ..., 0, 0, 1],
       ..., 
       [0, 0, 0, ..., 0, 0, 1],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 1, 0]])

#  *************ROC*************
# 1,計算ROC值
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
roc_auc_score(y_true, y_scores)

# 2,ROC曲線
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)

#  *************海明距離*************
from sklearn.metrics import hamming_loss
y_pred = [1, 2, 3, 4]
y_true = [2, 2, 3, 4]
hamming_loss(y_true, y_pred)
0.25

#  *************Jaccard距離*************
import numpy as np
from sklearn.metrics import jaccard_similarity_score
y_pred = [0, 2, 1, 3,4]
y_true = [0, 1, 2, 3,4]
jaccard_similarity_score(y_true, y_pred)
0.5
jaccard_similarity_score(y_true, y_pred, normalize=False)
2

#  *************可釋方差值(Explained variance score)************
from sklearn.metrics import explained_variance_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
explained_variance_score(y_true, y_pred)  

#  *************平均絕對誤差(Mean absolute error)*************
from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred)

#  *************均方誤差(Mean squared error)*************
from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)

#  *************中值絕對誤差(Median absolute error)*************
from sklearn.metrics import median_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
median_absolute_error(y_true, y_pred)

#  *************R方值,確定系數*************
from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)

  

一,分類

  分類是機器學習中的一類重要問題,很多重要的算法都在解決分類問題,例如決策樹,支持向量機等,其中二分類問題是分類問題中的一個重要的課題。

  常見的分類模型包括:邏輯回歸、決策樹、朴素貝葉斯、SVM、神經網絡等,模型評估指標包括以下幾種:

1. TPR、FPR&TNR(混淆矩陣)

  在二分類問題中,即將實例分成正類(positive)或負類(negative)。對一個二分問題來說,會出現四種情況。如果一個實例是正類並且也被 預測成正類,即為真正類(True positive),如果實例是負類被預測成正類,稱之為假正類(False positive)。相應地,如果實例是負類被預測成負類,稱之為真負類(True negative),正類被預測成負類則為假負類(false negative)。

  TP(True  positive):將正類預測為正類數;

  TN(True  negative):將負類預測為負類數;

  FP(False  positive):將負類預測為正類數(誤報 Type I  error);

  FN(False negative):將正類預測為負類數(漏報 Type II error);

  在評估一個二分類模型的效果時,我們通常會用一個稱為混淆矩陣(confusion matrix)的四格表來表示,即如下表所示,1代表正類,0代表負類:

  預測1 預測0
實際1 True Positive(TP) False Negative(FN)
實際0 False Positive(FP) True Negative(TN)

 

  從列聯表引入兩個新名詞。其一是真正類率(true positive rate ,TPR), 計算公式為

TPR = TP / (TP + FN)

  刻畫的是分類器所識別出的 正實例占所有正實例的比例。

  另外一個是負正類率(false positive rate, FPR),計算公式為

FPR = FP / (FP + TN)

  計算的是分類器錯認為正類的負實例占所有負實例的比例。

  還有一個真負類率(True Negative Rate,TNR),也稱為specificity,計算公式為

TNR = TN /(FP + TN) = 1 - FPR

from sklearn.metrics import confusion_matrix
# y_pred是預測標簽
y_pred, y_true =[1,0,1,0], [0,0,1,0]
confusion_matrix(y_true=y_true, y_pred=y_pred)

 

2,精確率Precision、召回率Recall和F1值

  精確率(正確率)召回率是廣泛用於信息檢索和統計學分類領域的兩個度量值,用來評價結果的質量。其中精度是檢索出相關文檔數與檢索出的文檔總數的比率,衡量的是檢索系統的查准率;召回率是指檢索出的相關文檔數和文檔庫中所有的相關文檔數的比率,衡量的是檢索系統的查全率

  一般來說,Precision就是檢索出來的條目(比如:文檔、網頁等)有多少是准確的,Recall就是所有准確的條目有多少被檢索出來了,兩者的定義分別如下:

Precision = 提取出的正確信息條數 /  提取出的信息條數     

Recall = 提取出的正確信息條數 /  樣本中的信息條數    

   精准度(又稱查准率)和召回率(又稱查全率)是一對矛盾的度量。一般來說,查准率高時,查全率往往偏低,而查全率高時,查准率往往偏低。所以通常只有在一些簡單任務中,才可能使得查准率和查全率都很高。

from sklearn.metrics import classification_report
# y_pred是預測標簽
y_pred, y_true =[1,0,1,0], [0,0,1,0]
print(classification_report(y_true=y_true, y_pred=y_pred))

  

3. 綜合評價指標F-measure

  Precision和Recall指標有時候會出現的矛盾的情況,這樣就需要綜合考慮他們,最常見的方法就是在Precision和Recall的基礎上提出了F1值的概念,來對Precision和Recall進行整體評價。F1的定義如下:

F1值  = 正確率 * 召回率 * 2 / (正確率 + 召回率) 

  F-Measure是Precision和Recall加權調和平均

  當參數α=1時,就是最常見的F1。因此,F1綜合了P和R的結果,當F1較高時則能說明試驗方法比較有效。

 

4. 應用場景:

  准確率和召回率是互相影響的,理想情況下肯定是做到兩者都高,但是一般情況下准確率高、召回率就低,召回率低、准確率高,當然如果兩者都低,那是什么地方出問題了。當精確率和召回率都高時,F1的值也會高。在兩者都要求高的情況下,可以用F1來衡量。

    1. 地震的預測
      對於地震的預測,我們希望的是RECALL非常高,也就是說每次地震我們都希望預測出來。這個時候我們可以犧牲PRECISION。情願發出1000次警報,把10次地震都預測正確了;也不要預測100次對了8次漏了兩次。
    2. 嫌疑人定罪
      基於不錯怪一個好人的原則,對於嫌疑人的定罪我們希望是非常准確的。及時有時候放過了一些罪犯(recall低),但也是值得的。

  不妨舉這樣一個例子:

  某池塘有1400條鯉魚,300只蝦,300只鱉。現在以捕鯉魚為目的。撒一大網,逮着了700條鯉魚,200只蝦,100只鱉。那么,這些指標分別如下:

  正確率 = 700 / (700 + 200 + 100) = 70%

  召回率 = 700 / 1400 = 50%

  F1值 = 70% * 50% * 2 / (70% + 50%) = 58.3%

  不妨看看如果把池子里的所有的鯉魚、蝦和鱉都一網打盡,這些指標又有何變化:

  正確率 = 1400 / (1400 + 300 + 300) = 70%

  召回率 = 1400 / 1400 = 100%

  F1值 = 70% * 100% * 2 / (70% + 100%) = 82.35%        

  由此可見,正確率是評估捕獲的成果中目標成果所占得比例;召回率,顧名思義,就是從關注領域中,召回目標類別的比例;而F值,則是綜合這二者指標的評估指標,用於綜合反映整體的指標。

  當然希望檢索結果Precision越高越好,同時Recall也越高越好,但事實上這兩者在某些情況下有矛盾的。比如極端情況下,我們只搜索出了一個結果,且是准確的,那么Precision就是100%,但是Recall就很低;而如果我們把所有結果都返回,那么比如Recall是100%,但是Precision就會很低。因此在不同的場合中需要自己判斷希望Precision比較高或是Recall比較高。如果是做實驗研究,可以繪制Precision-Recall曲線來幫助分析。

  代碼補充:

from sklearn.metrics import precision_score, recall_score, f1_score

# 正確率  (提取出的正確信息條數 / 提取出的信息條數)
print('Precision: %.3f' % precision_score(y_true=y_test, y_pred=y_pred))

# 召回率 (提出出的正確信息條數 / 樣本中的信息條數)
print('Recall: %.3f' % recall_score(y_true=y_test, y_pred=y_pred))

# F1-score  (正確率*召回率*2 /(正確率+召回率))
print('F1: %.3f' % f1_score(y_true=y_test, y_pred=y_pred))

 

5. ROC曲線和AUC

  AUC是一種模型分類指標,且僅僅是二分類模型的評價指標。AUC是Area Under Curve的簡稱,那么Curve就是ROC(Receiver Operating Characteristic),翻譯為"接受者操作特性曲線"。也就是說ROC是一條曲線,AUC是一個面積值。

  ROC曲線應該盡量偏離參考線,越靠近左上越好

  AUC:ROC曲線下面積,參考線面積為0.5,AUC應大於0.5,且偏離越多越好

5.1 為什么引入ROC曲線?

  Motivation1:在一個二分類模型中,對於所得到的連續結果,假設已確定一個閥值,比如說 0.6,大於這個值的實例划歸為正類,小於這個值則划到負類中。如果減小閥值,減到0.5,固然能識別出更多的正類,也就是提高了識別出的正例占所有正例 的比類,即TPR,但同時也將更多的負實例當作了正實例,即提高了FPR。為了形象化這一變化,引入ROC,ROC曲線可以用於評價一個分類器。

  Motivation2:在類不平衡的情況下,如正樣本90個,負樣本10個,直接把所有樣本分類為正樣本,得到識別率為90%。但這顯然是沒有意義的。單純根據Precision和Recall來衡量算法的優劣已經不能表征這種病態問題。

  繪制ROC曲線

import matplotlib.pyplot as plt 
from sklearn.metrics import roc_curve, auc
# y_test:實際的標簽, dataset_pred:預測的概率值。
fpr, tpr, thresholds = roc_curve(y_test, dataset_pred)
roc_auc = auc(fpr, tpr)  
#畫圖,只需要plt.plot(fpr,tpr),變量roc_auc只是記錄auc的值,通過auc()函數能計算出來  
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()

  

5.2 什么是ROC曲線?

  ROC(Receiver Operating Characteristic)翻譯為"接受者操作特性曲線"。曲線由兩個變量1-specificity 和 Sensitivity繪制. 1-specificity=FPR,即負正類率。Sensitivity即是真正類率,TPR(True positive rate),反映了正類覆蓋程度。這個組合以1-specificity對sensitivity,即是以代價(costs)對收益(benefits)。顯然收益越高,代價越低,模型的性能就越好。

       此外,ROC曲線還可以用來計算“均值平均精度”(mean average precision),這是當你通過改變閾值來選擇最好的結果時所得到的平均精度(PPV)。

  • x 軸為假陽性率(FPR):在所有的負樣本中,分類器預測錯誤的比例

  • y 軸為真陽性率(TPR):在所有的正樣本中,分類器預測正確的比例(等於Recall)

  為了更好地理解ROC曲線,我們使用具體的實例來說明:

  如在醫學診斷中,判斷有病的樣本。那么盡量把有病的揪出來是主要任務,也就是第一個指標TPR,要越高越好。而把沒病的樣本誤診為有病的,也就是第二個指標FPR,要越低越好。

  不難發現,這兩個指標之間是相互制約的。如果某個醫生對於有病的症狀比較敏感,稍微的小症狀都判斷為有病,那么他的第一個指標應該會很高,但是第二個指標也就相應地變高。最極端的情況下,他把所有的樣本都看做有病,那么第一個指標達到1,第二個指標也為1。

  我們以FPR為橫軸,TPR為縱軸,得到如下ROC空間。

 

  我們可以看出,左上角的點(TPR=1,FPR=0),為完美分類,也就是這個醫生醫術高明,診斷全對。點A(TPR>FPR),醫生A的判斷大體是正確的。中線上的點B(TPR=FPR),也就是醫生B全都是蒙的,蒙對一半,蒙錯一半;下半平面的點C(TPR<FPR),這個醫生說你有病,那么你很可能沒有病,醫生C的話我們要反着聽,為真庸醫。上圖中一個閾值,得到一個點。現在我們需要一個獨立於閾值的評價指標來衡量這個醫生的醫術如何,也就是遍歷所有的閾值,得到ROC曲線。

  假設下圖是某醫生的診斷統計圖,為未得病人群(上圖)和得病人群(下圖)的模型輸出概率分布圖(橫坐標表示模型輸出概率,縱坐標表示概率對應的人群的數量),顯然未得病人群的概率值普遍低於得病人群的輸出概率值(即正常人診斷出疾病的概率小於得病人群診斷出疾病的概率)。

  豎線代表閾值。顯然,圖中給出了某個閾值對應的混淆矩陣,通過改變不同的閾值 1.0 \rightarrow 0 ,得到一系列的混淆矩陣,進而得到一系列的TPR和FPR,繪制出ROC曲線。

  閾值為1時,不管你什么症狀,醫生均未診斷出疾病(預測值都為N),此時綠色和紅色區域的面積為 0,因此 FPR=TPR=0 ,位於左下。隨着閾值的減小,紅色和綠色區域增大,紫色和藍色區域減小。閾值為 0 時,不管你什么症狀,醫生都診斷結果都是得病(預測值都為P),此時綠色和紅色區域均占整個區域,即紫色和藍色區域的面積為 0,此時 FPR=TPR=1 ,位於右上。

 

  還是一開始的那幅圖,假設如下就是某個醫生的診斷統計圖,直線代表閾值。我們遍歷所有的閾值,能夠在ROC平面上得到如下的ROC曲線。

  曲線距離左上角越近,證明分類器效果越好。

 

  如上,是三條ROC曲線,在0.23處取一條直線。那么,在同樣的低FPR=0.23的情況下,紅色分類器得到更高的PTR。也就表明,ROC越往上,分類器效果越好。我們用一個標量值AUC來量化它。

5.3 什么是AUC?

  AUC值為ROC曲線所覆蓋的區域面積,顯然,AUC越大,分類器分類效果越好。

  AUC = 1,是完美分類器,采用這個預測模型時,不管設定什么閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。

  0.5 < AUC < 1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。

  AUC = 0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。

  AUC < 0.5,比隨機猜測還差;但只要總是反預測而行,就優於隨機猜測。

  以下為ROC曲線和AUC值得實例:

 

  AUC的物理意義:假設分類器的輸出是樣本屬於正類的socre(置信度),則AUC的物理意義為,任取一對(正、負)樣本,正樣本的score大於負樣本的score的概率。

  AUC的物理意義正樣本的預測結果大於負樣本的預測結果的概率。所以AUC反應的是分類器對樣本的排序能力。

  另外值得注意的是,AUC對樣本類別是否均衡並不敏感,這也是不均衡樣本通常用AUC評價分類器性能的一個原因。

  下面從一個小例子解釋AUC的含義:小明一家四口,小明5歲,姐姐10歲,爸爸35歲,媽媽33歲建立一個邏輯回歸分類器,來預測小明家人為成年人概率,假設分類器已經對小明的家人做過預測,得到每個人為成人的概率。

  1. AUC更多的是關注對計算概率的排序,關注的是概率值的相對大小,與閾值和概率值的絕對大小沒有關系

  例子中並不關注小明是不是成人,而關注的是,預測為成人的概率的排序。

5.4 怎樣計算AUC?

  第一種方法:AUC為ROC曲線下的面積,那我們直接計算面積可得。面積為一個個小的梯形面積之和。計算的精度與閾值的精度有關。

  第二種方法:根據AUC的物理意義,我們計算正樣本score大於負樣本的score的概率。取N*M(N為正樣本數,M為負樣本數)個二元組,比較score,最后得到AUC。時間復雜度為O(N*M)。

  第三種方法:與第二種方法相似,直接計算正樣本score大於負樣本的概率。我們首先把所有樣本按照score排序,依次用rank表示他們,如最大score的樣本,rank=n(n=N+M),其次為n-1。那么對於正樣本中rank最大的樣本,rank_max,有M-1個其他正樣本比他score小,那么就有(rank_max-1)-(M-1)個負樣本比他score小。其次為(rank_second-1)-(M-2)。最后我們得到正樣本大於負樣本的概率為

  時間復雜度為O(N+M)。

from sklearn.metrics import roc_auc_score
# y_test:實際的標簽, dataset_pred:預測的概率值。
roc_auc_score(y_test, dataset_pred)

  

二,回歸

  在回歸中,我們想根據連續數據來進行預測。例如,我們有包含不同人員的身高、年齡和性別的列表,並想預測他們的體重。或者,我們可能有一些房屋數據,並想預測某所住宅的價值。手頭的問題在很大程度上決定着我們如何評估模型。

  以下為一元變量和二元變量的線性回歸示意圖:

  那么怎么來衡量回歸模型的好壞呢?

  我們首先想到的是采用殘差(實際值與預測值的差值)的均值來衡量,即:

  那么問題來了:使用殘差的均值合理嗎?

  當實際值分布在擬合曲線兩側時候,對於不同樣本而言有正有負,相互抵消,因此我們想到采用預測值和真實值之間的距離來衡量。

2.1 平均絕對誤差(MAE)

  既然使用了MAE,那他有什么不足?

  MAE雖然較好的衡量回歸模型的好壞,但是絕對值的存在導致函數不光滑,在某些點上不能求導,可以考慮將絕對值改為殘差的平方,這就是均方誤差。

from sklearn.metrics import mean_squared_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)

  

2.2 平均平方誤差(MSE)

  那么還有沒有比MSE更合理一些的指標?

  MSE和方差的性質比較類似,與我們的目標變量的量綱不一致,為了保證量綱一致性,我們需要對MSE進行開方,得到RMSE。

from sklearn.metrics import mean_squared_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)

  

2.3 均方根誤差(RMSE)

  RMSE雖然廣為使用,但是其存在一些缺點,因為它是使用平均誤差,而平均值對異常點(outliers)較敏感,如果回歸器對某個點的回歸值很不理性,那么它的誤差則較大,從而會對RMSE的值有較大影響,即平均值是非魯棒的。

  開方之后的MSE稱為RMSE,是標准差的表兄弟,如下式所示:

  RMSE有沒有不足的地方,有沒有規范化(無量綱化的指標)?

  上面的幾種衡量標准的取值大小與具體的應用場景有關系,很難定義統一的規則來衡量模型的好壞。比如說利用機器學習算法預測上海的房價RMSE在2000元,我們是可以接受的,但是當四五線城市的房價RMSE為2000元,我們還可以接受嗎?下面介紹的決定系數就是一個無量綱化的指標。

lr.score(test_x,test_y)#越接近1越好,負的很差
from sklearn.metrics import mean_squared_error
mean_squared_error(test_y,lr.predict(test_x))#mse
np.sqrt(mean_squared_error(test_y,lr.predict(test_x)))

  

2.4 決定系數

  變量之所以有價值,就是因為變量是變化的。什么意思呢?比如說一組因變量為[0, 0, 0, 0, 0],顯然該因變量的結果是一個常數0,我們也沒有必要建模對該因變量進行預測。假如一組的因變量為[1, 3, 7, 10, 12],該因變量是變化的,也就是有變異,因此需要通過建立回歸模型進行預測。這里的變異可以理解為一組數據的方差不為0。

  決定系數又稱為 R^2 score,反應因變量的全部變異能通過回歸關系被自變量解釋的比例。

\text{SST} = \sum \limits_i^m(y_i - \bar y)^2 \qquad \text{SST = total sum of squares}

\text{SSR} = \sum \limits_i^m(\hat y_i - \bar y)^2 \qquad \text{SSR = sum of due to regression}

\text{SSE} = \sum \limits_i^m(\hat y_i - y_i)^2 \qquad \text{SSE = sum of due to erros}

 

\text{SST = SSR + SSE}

 

R^2(y,\hat{y})= \frac{\rm SSR}{\rm SST} 
  如果結果是0,就說明模型預測不能預測因變量。 
  如果結果是1。就說明是函數關系。 
  如果結果是0-1之間的數,就是我們模型的好壞程度。

  化簡上面的公式 ,分子就變成了我們的均方誤差MSE,下面分母就變成了方差:
\begin{align}R^2(y,\hat{y}) &= 1 - \frac{\rm SSE}{\rm SST} \\&=1-\frac{\sum\limits_{i=1}^{m}(y_i-\hat{y}_i)^2}{\sum\limits_{i=1}^{m}(y_i-\bar{y})^2} \\&=1-\frac{\sum\limits_{i=1}^{m}(y_i-\hat{y}_i)^2/m}{\sum\limits_{i=1}^{m}(y_i-\bar{y})^2/m} \\&= 1 - \frac{\rm MSE(\hat y, y)}{\rm Var(y)} \end{align}\\

 

   以上的評估指標有沒有缺陷,如果有,該如何改進呢?

  以上的評估指標是基於誤差的均值對進行評估的,均值對異常點(outliers)較敏感,如果樣本中有一些異常值出現,會對以上指標的值有較大影響,即均值是非魯棒的。

from sklearn.metrics import r2_score
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)

  

2.5 解決評估指標魯棒性問題

我們通常用一下兩種方法解決評估指標的魯棒性問題:

  • 剔除異常值

設定一個相對誤差 \frac{|y_i-\hat{y_i}|}{y_i} ,當該值超過一定的閾值時,則認為其是一個異常點,剔除這個異常點,將異常點剔除之后。再計算平均誤差來對模型進行評價。

  • 使用誤差的分位數來代替,

如利用中位數來代替平均數。例如 MAPE:


MAPE=median(|y_i-\hat{y_i}|/y_i) \\ 
  MAPE是一個相對誤差的中位數,當然也可以使用別的分位數。

2.6 解釋變異

三,聚類

  常見的聚類模型有KMeans、密度聚類、層次聚類等,主要從簇內的稠密成都和簇間的離散程度來評估聚類的效果,評估指標包括:

1 . 蘭德指數

  蘭德指數(Rand index)需要給定實際類別信息C,假設K是聚類結果,a表示在CK中都是同類別的元素對數,b表示在CK中都是不同類別的元素對數,則蘭德指數為:

     

  其中數據集中可以組成的總元素對數,RI取值范圍為[0,1],值越大意味着聚類結果與真實情況越吻合。

  對於隨機結果,RI並不能保證分數接近零。為了實現“在聚類結果隨機產生的情況下,指標應該接近零”,調整蘭德系數(Adjusted rand index)被提出,它具有更高的區分度:

     

  具體計算方式參見Adjusted Rand index

  ARI取值范圍為[1,1],值越大意味着聚類結果與真實情況越吻合。從廣義的角度來講,ARI衡量的是兩個數據分布的吻合程度。

2. 互信息

  互信息(Mutual Information)也是用來衡量兩個數據分布的吻合程度。假設UU與VV是對NN個樣本標簽的分配情況,則兩種分布的熵(熵表示的是不確定程度)分別為:

  

  利用基於互信息的方法來衡量聚類效果需要實際類別信息,MI與NMI取值范圍為[0,1],AMI取值范圍為[1,1],它們都是值越大意味着聚類結果與真實情況越吻合。

3. 輪廓系數

3.1 輪廓系數概念

  輪廓系數(Silhouette coefficient)是聚類效果好壞的一種評價方式。最早由Peter J . Rousseeuw 在1986年提出。它結合內聚度和分離度兩種因素。可以用來在相同原始數據的基礎上用來評價不同的算法,或者算法不同運行方式對聚類結果所產生的影響。

  輪廓稀疏適用於實際類別信息未知的情況。對於單個樣本,設aa是與它同類別中其他樣本的平均距離,bb是與它距離最近不同類別中樣本的平均距離,輪廓系數為:

    

  對於一個樣本集合,它的輪廓系數是所有樣本輪廓系數的平均值。

  輪廓系數取值范圍是[1,1]

 

 

3.2 輪廓系數計算過程

  假設我們已經通過一定算法啊,將待分類數據進行了聚類。常用的比如使用K-Means,將待分類數據分為了K個簇。對於簇中的每個向量。分別計算他們的輪廓系數。

  對於其中的一個點 i 來說:

    計算 a(i) = average(i 向量到所有它屬於的簇中其他點的距離)

    計算 b(i) = min(i 向量到它相鄰最近的一簇內的所有點的平均距離)

  那么i 向量輪廓系數就為:

 

   可見,輪廓系數的值是介於 [-1, 1],越趨近於1 代表內聚度和分離度都相對較近。

  將所有點的輪廓系數求平均,就是該聚類結果總的輪廓系數。

  a(i) :i 向量到同一簇內其他點不相似程度的平均值

  b(i):i向量到其他簇的平均不相似程度的最小值

3.3 輪廓系數使用注意事項

  上面說到的“距離”,指的是不相似度(區別於相似度)。“距離”值越大,代表不相似度程度越高

  歐式距離就滿足這個條件,而Tanimoto  Measure 則用作相似度度量

  當簇內只有一點時,我們定義輪廓系數 s(i)  為 0

3.4 Python實現輪廓系數的計算

  我們這里使用Python實現輪廓系數,代碼如下:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn import metrics

filename = 'data.txt'

beer = pd.read_csv(filename, sep=' ')
features = beer[['calories', 'sodium', 'alcohol', 'cost']]
scaler = StandardScaler()
features = scaler.fit_transform(features)

km1 = KMeans(n_clusters=3)
clf1 = km1.fit(features)
beer['scaled_cluster'] = clf1.labels_
sort_res = beer.sort_values('scaled_cluster')
cluster_centers1 = clf1.cluster_centers_
group_res = beer.groupby('scaled_cluster').mean()
score_scaled = metrics.silhouette_score(features, beer.scaled_cluster)
print(score_scaled)

 

四,信息檢索

  信息檢索評價是對信息檢索系統性能(主要滿足用戶信息需求的能力)進行評估,與機器學習也有較大的相關性。

總結

  上面介紹了非常多的指標,實際應用中需要根據具體問題選擇合適的衡量指標。那么具體工作中如何快速使用它們呢?優秀的Python機器學習開源項目Scikit-learn實現了上述絕指標的大多數,使用起來非常方便。

 

信息檢索參考資料(還有一些未補充到):
http://wenku.baidu.com/view/1c6fb7d7b9f3f90f76c61b74.html
http://en.wikipedia.org/wiki/Precision_and_recall
http://www.cnblogs.com/eyeszjwang/articles/2368087.html

 https://en.wikipedia.org/wiki/F1_score

 

還可以參考:

https://www.cnblogs.com/harvey888/p/6964741.html

 https://baike.baidu.com/item/%E8%BD%AE%E5%BB%93%E7%B3%BB%E6%95%B0/17361607?fr=aladdin


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM