估計器評分方法 :估計器提供了一種score方法,該方法為其要解決的問題提供默認的評估標準。在此章節上沒有討論該方法的使用,但每個估計器的文檔章節中都對此方法進行了討論。
評分參數 :使用交叉驗證(例如 model_selection.cross_val_score和 model_selection.GridSearchCV)的模型評估工具依賴於一個內部評分策略。這在「評分參數:定義模型評估規則」的章節中進行了討論。
度量函數 :metrics實現了一些函數用於以某種特殊目的評估模型預測誤差。這些度量指標在分類度量,多標籤排名(Multilabel ranking)度量,回歸度量和聚類度量的各章節中都有詳細的介紹。最後,虛擬估計器(Dummy estimators)可以用來獲取這些度量的基準值,這對進行隨機預測很有用。
也可以看看: 對於「成對」度量指標,是在樣本之間的而不是在估計量或者預測值之間,請參閱成對度量,親和力(Affinities)和內核部分。1. scoring 參數:定義模型評估準則模型選擇和評估使用工具,例如 model_selection.GridSearchCV和 model_selection.cross_val_score,接受一個scoring參數,該參數控制著估計器的評估過程中使用什麼樣的度量指標。1.1. 一般情況: 使用預定義的值對於最常見的用例,您可以為scoring參數指定一個評分器對象(scorer object)。下表顯示了所有可能的值。所有評分器對象均遵循以下約定:
較高的返回值優先於較低的返回值 。因此,度量模型和數據之間的距離度量指標,例如metrics.mean_squared_error可以作為neg_mean_squared_error,返回變負的指標值。
>>> from sklearn import svm, datasets>>> from sklearn.model_selection import cross_val_score>>> X, y = datasets.load_iris(return_X_y=True)>>> clf = svm.SVC(random_state=0)>>> cross_val_score(clf, X, y, cv=5, scoring='recall_macro')array([0.96..., 0.96..., 0.96..., 0.93..., 1. ])>>> model = svm.SVC()>>> cross_val_score(model, X, y, cv=5, scoring='wrong_choice')Traceback (most recent call last):ValueError: 'wrong_choice' is not a valid scoring value. Use sorted(sklearn.metrics.SCORERS.keys()) to get valid options.注意: 通過ValueError異常列舉出來的那些值對應於度量預測精度的函數,它們會在下面的小節中介紹。用於這些函數的評分器對象被存放在sklearn.metrics.SCORERS字典中。1.2.利用度量函數metric自定義評分策略sklearn.metrics模塊還提供了一組簡單的函數,當給定真值和預測值的時候用來度量一個預測錯誤:以_score結尾的函數返回一個值進行最大化,該值越高代表預測越好。以_error或_loss結尾的函數返回一個值進行最小化,值越低代表預測越好。當我們使用函數make_scorer把這種越小越好的度量轉換成評分對象的時候,就需要設置參數greater_is_better為False(這個參數默認是True,對這個參數下面還會解釋)。以下各節詳細介紹了可用於各種機器學習任務的度量指標。許多度量(metrics)指標沒有被命名以使得它們被用作scoring值,有時是因為它們需要額外的參數,例如fbeta_score。在這種情況下,您需要生成一個適當的評分對象,最簡單方法是調用make_scorer生成一個用於評分的可調用對象。該函數將度量(metrics)指標轉換為可用於模型評估的可調用對象。一個典型的用法是從庫中封裝一個已經存在的具有非默認值參數的度量(metric)函數,例如fbeta_score函數的beta參數:>>> from sklearn.metrics import fbeta_score, make_scorer>>> ftwo_scorer = make_scorer(fbeta_score, beta=2)>>> from sklearn.model_selection import GridSearchCV>>> from sklearn.svm import LinearSVC>>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]},... scoring=ftwo_scorer, cv=5)第二個用法是使用make_scorer,從一個簡單的python函數構建一個完全自定義的評分對象,該函數可以接收多個參數:您想使用的python函數(下面的示例中的my_custom_loss_func )您的python函數返回分數(greater_is_better=True默認值)還是損失(loss)(greater_is_better=False)。如果損失(loss),則評分器對象對python函數的輸出取負號,這符合交叉驗證約定,即評分器返回越高的值預測越好。如果你要定義的是一個分類評分度量(metrics),還要確認您的python函數是否具有連續的決策確定性(decision certainties) (needs_threshold=True)。默認值為False。任意的附加參數,例如f1_score函數中的beta或labels。下面是構建一個自定義評分器的例子,並且使用了參數greater_is_better:>>> import numpy as np>>> def my_custom_loss_func(y_true, y_pred):... diff = np.abs(y_true - y_pred).max()... return np.log1p(diff)...>>> # score將會對my_custom_loss_func函數的返回值取反,>>> # 這將會是 np.log(2), 也就是0.693。>>> # X 和 y 的值的定義在下面。>>> score = make_scorer(my_custom_loss_func, greater_is_better=False)>>> X = [[1], [1]]>>> y = [0, 1]>>> from sklearn.dummy import DummyClassifier>>> clf = DummyClassifier(strategy='most_frequent', random_state=0)>>> clf = clf.fit(X, y)>>> my_custom_loss_func(clf.predict(X), y)0.69...>>> score(clf, X, y)-0.69...1.3. 實現自己的評分對象您可以從頭開始構建自己的評分對象,而無需使用make_scorer來生成更加靈活的模型評分器(model scorers)。如果一個python可調用對象被叫做評分器(scorer),那麼它需要符合以下兩個規則所指定的協議:可以使用參數(estimator, X, y)來調用它,其中estimator是要被評估的模型,X是驗證數據,y是真實目標變量 (在有監督情況下)或None(在無監督情況下)。它返回一個浮點數,該浮點數作為參考來量化estimator的預測質量。同樣,按照慣例,越高的數字越好, 所以如果您的評分器(scorer)返回損失(loss),那麼這個返回值應該被取負號 。注意: 在n_jobs > 1的函數中使用自定義評分器 雖然在定義調用函數的同時,自定義評分函數應該與默認的joblib後端(loky)一起使用,但從另一個模塊導入它將會是更可靠的方法,並且它是獨立於joblib後端工作的。例如,在下面的示例中,要給n_jobs傳入一個大於1的值,custom_scoring_function函數將保存在用戶創建的模塊(custom_scorer_module.py)中並可以這樣導入:>>> from custom_scorer_module import custom_scoring_function >>> cross_val_score(model,... X_train,... y_train,... scoring=make_scorer(custom_scoring_function, greater_is_better=False),... cv=5,... n_jobs=-1)1.4. 使用多度量(metric)指標評估Scikit-learn還允許在GridSearchCV,RandomizedSearchCV和cross_validate中進行多度量指標的評估。這有兩種方法可以為scoring參數指定多個評分指標:把多個度量(metrics)指標的名字以字符串列表的方式作為參數傳給scoring: >>> scoring = ['accuracy', 'precision']以字典的形式把評分器的名稱映射到評分函數上,然後把該字典作為參數傳給scoring: >>> from sklearn.metrics import accuracy_score>>> from sklearn.metrics import make_scorer>>> scoring = {'accuracy': make_scorer(accuracy_score),... 'prec': 'precision'}要注意的是字典的值既可以是評分函數也可以是sklearn預定義的度量(metric)指標的名字字符串。目前,只有那些返回單個得分值的評分函數可以被傳到字典中,那些有多個返回值的評分函數不被允許傳入。如果非要這麼做的話,必須對其進行封裝使其只有單個返回值:>>> from sklearn.model_selection import cross_validate>>> from sklearn.metrics import confusion_matrix>>> # 一個簡單的toy二分類數據集>>> X, y = datasets.make_classification(n_classes=2, random_state=0)>>> svm = LinearSVC(random_state=0)>>> def tn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 0]>>> def fp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 1]>>> def fn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 0]>>> def tp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 1]>>> scoring = {'tp': make_scorer(tp), 'tn': make_scorer(tn),... 'fp': make_scorer(fp), 'fn': make_scorer(fn)}>>> cv_results = cross_validate(svm.fit(X, y), X, y, cv=5, scoring=scoring)>>> # 獲得測試集true positive的得分>>> print(cv_results['test_tp'])[10 9 8 7 8]>>> # 獲得測試集false negative的得分>>> print(cv_results['test_fn'])[0 1 2 3 2]2. 分類問題的度量指標sklearn.metrics模塊實現了多種損失(loss),評分(score)和工具(utility)函數,來度量分類器性能。一些度量指標可能需要對正類(positive class),置信度值(confidence values)或二元決策值(binary decisions values)進行概率估計。大多數實現都允許每個樣本通過sample_weight參數為整體得分(overall score)提供加權貢獻(weighted contribution)。這裡面的一部分度量指標僅僅限於在二分類的情況下使用:
下面的這些指標可以用在二分類和多標籤(不是多分類)問題中:
2.1. 從二分類問題到多類或多標籤問題在下面的小節中,我們會逐個講解這些函數,包括一些常用API的註解和度量指標的數學定義。有些度量指標基本上是為二分類任務所服務的(例如f1_score,roc_auc_score)。在這些情況下,默認情況下僅評估正類(positive label),假定把正類標記為1(儘管可以通過pos_label參數進行配置)。將二分類指標擴展應用於多分類或多標籤問題時,數據將被視為二分問題的集合,每個類都有一個二分類指標,然後可以使用多種策略在整個類中計算所有二分類指標的平均值,這些不同的計算平均值的策略在某些特定場景中可能會用到。如果可用,您應該使用average參數來選擇某個平均策略。"macro"簡單地計算二分類指標的平均值,賦予每個類別相同的權重。在不常見的類別是重要的問題上,宏觀平均(macro-averaging)可能是突出其性能的一種方法。另一方面,所有類別同樣重要的假設通常是不真實的, 因此宏觀平均(macro-averaging)將過度強調不常見的類別的典型的低性能。"weighted"通過計算其在真實數據樣本中的存在來對每個類的得分進行加權的二分指標平均值來計算類不平衡。"micro" 使每個樣本類別對總體指標的貢獻均等(樣本權重的結果除外),不是將每個類別的度量指標求和,而是將構成每個類別指標的紅利(dividends)和除數求和,計算總體商。在多標籤設置中,宏觀平均可能是優先選擇的,包括要忽略多數類的多分類。"samples"僅適用於多標籤問題。它不計算每個類別的指標,而是計算評估數據中的每個樣本的真實和預測類別的指標,並返回加權平均。選擇average=None將返回一個數組與每個類的得分。雖然將多類數據作為一個類標籤數組(array of class labels)提供給度量指標,就像二分類目標一樣,但如果多標籤數據指定為標識矩陣(indicator matrix),其中如果樣本i具有標號j ,則[i, j]具有值1,否則為值0。2.2. 準確度得分(Accuracy score)accuracy_score函數計算準確度,也就是計算正確預測的比例(默認)或數量(normalize=False)。在多標籤分類中,該函數返回子集的準確度。對某個樣本的預測標籤的整個集合與該樣本真正的標籤集合嚴格匹配,那么子集準確率就是1.0,反之,子集準確率為0.0。如果 是第 個樣本的預測值,並且 _是對應的真實值,則在 個樣本上估計的正確預測的比例的定義如下:>>> import numpy as np>>> from sklearn.metrics import accuracy_score>>> y_pred = [0, 2, 1, 3]>>> y_true = [0, 1, 2, 3]>>> accuracy_score(y_true, y_pred)0.5>>> accuracy_score(y_true, y_pred, normalize=False)2>>> accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))0.5有關使用數據集的排列準確度得分用法的案例,請參閱測試排列對分類得分的重要性。2.3. 平衡準確度得分(Balanced accuracy score)balanced_accuracy_score函數計算平衡準確度,從而避免對不平衡數據集進行過高的性能估計。它是每個類別的召回得分的宏觀平均值,或者是原始準確度,其中,每個樣本均根據其真實類別的逆向流行度(inverse prevalence)進行加權。因此,對於平衡的數據集,該函數的得分與準確度得分是相等的。在二分類情況下,平衡準確度等於靈敏度 (真正率(rue positive rate))和特異性(真負率(true negative rate))的算術平均值 ,或者等於用二分類的預測結果而非分數的ROC曲線下的面積。如果分類器在兩個類上都表現的一樣好,該函數就會退化為傳統的準確度(即正確預測數量除以總的預測數量)。作為對比,如果傳統的準確度比較好,僅僅是因為分類器利用了一個不均衡測試集,此時平衡準確度將會近似地下降到 。得分的範圍是0到1,或者當使用adjusted=True時,得分範圍會被縮放到從 到1(包括1),隨機條件下得分為0。如果 是第 個樣本的真值,並且 是對應的樣本權重,然後我們調整樣本權重到:其中, 是指標函數。給定樣本 的預測值 ,平衡準確度定義為:使用adjusted=True,平衡準確度報告了來自的相關增加。在二分類情況下,這也稱為* Youden's J statistic *或informedness 。**注意:**這裡的多類定義似乎是二分類中使用的度量指標的最合理擴展,儘管在文獻中還沒有達成共識:我們的定義:[Mosley2013],[Kelleher2015]和[Guyon2015],其中 [Guyon2015]採用調整後的版本,以確保隨機預測的得分為0,完美的預測得分為1..[Mosley2013]中所描述的類平衡準確度:計算每個類的準確度和召回率之間的最小值。然後將這些值在全部的類上取平均值,以獲得平衡準確度。[Urbanowicz2015]中所描述的平衡準確度:計算每個類別的敏感性和特異性的平均值,然後在全部的類上取平均值。Guyon2015(1,2) I. Guyon, K. Bennett, G. Cawley, H.J. Escalante, S. Escalera, T.K. Ho, N. Macià, B. Ray, M. Saeed, A.R. Statnikov, E. Viegas, Design of the 2015 ChaLearn AutoML Challenge, IJCNN 2015.Mosley2013(1,2) L. Mosley, A balanced approach to the multi-class imbalance problem, IJCV 2010.Kelleher2015 John. D. Kelleher, Brian Mac Namee, Aoife D』Arcy, Fundamentals of Machine Learning for Predictive Data Analytics: Algorithms, Worked Examples, and Case Studies, 2015.Urbanowicz2015 Urbanowicz R.J., Moore, J.H. ExSTraCS 2.0: description and evaluation of a scalable learning classifier system, Evol. Intel. (2015) 8: 89.2.4. Cohen的kappa(Cohen’s kappa)cohen_kappa_score函數計算cohen_kappa_score的統計信息。這個度量指標旨在比較由不同人類標註者給出的標籤,而不是去比較分類器預測和真值。kappa得分(請參閱文檔)是一個介於-1到1之間的數字,得分超過0.8通常被認為是好的一致(good agreement),得分為0或者小於0意味著不一致(no agreement)。Kappa得分既可以用於二分類也可用於多分類,但是不能用於多標籤問題,並且不能針對兩個以上的注釋器(annotators)進行計算該得分。>>> from sklearn.metrics import cohen_kappa_score>>> y_true = [2, 0, 2, 2, 0, 1]>>> y_pred = [0, 0, 2, 2, 0, 2]>>> cohen_kappa_score(y_true, y_pred)0.42857142857142862.5. 混淆矩陣(Confusion matrix)confusion_matrix函數通過計算混淆矩陣來評估分類結果的準確度。混淆矩陣的每一行對應於真實類< https://en.wikipedia.org/wiki/Confusion_matrix >(維基百科和其他參考文獻可能對軸(axes)有不同的約定。)根據定義,在混淆矩陣中, 中存儲著實際上應該在 組中的觀測,但是卻被預測到了 組裡面去的這些觀測的數量。這裡有一個例子:>>> from sklearn.metrics import confusion_matrix>>> y_true = [2, 0, 2, 2, 0, 1]>>> y_pred = [0, 0, 2, 2, 0, 2]>>> confusion_matrix(y_true, y_pred)array([[2, 0, 0], [0, 0, 1], [1, 0, 2]])plot_confusion_matrix可以用來直觀地表示一個混淆矩陣,如混淆矩陣案例所示,它創建了下圖:該normalize參數允許報告(report)比率而不是計數。可以用3種不同的方式對混淆矩陣進行歸一化:'pred','true'和'all',然後將計數除以每個列,行或整個矩陣的總和。>>> y_true = [0, 0, 0, 1, 1, 1, 1, 1]>>> y_pred = [0, 1, 0, 1, 0, 1, 0, 1]>>> confusion_matrix(y_true, y_pred, normalize='all')array([[0.25 , 0.125], [0.25 , 0.375]])對於二分類問題, 我們可以得到真負(true negatives),假正(false positives),假負(false negatives)和真正(true positives) 的數量:>>> y_true = [0, 0, 0, 1, 1, 1, 1, 1]>>> y_pred = [0, 1, 0, 1, 0, 1, 0, 1]>>> tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()>>> tn, fp, fn, tp(2, 1, 2, 3)有關使用混淆矩陣評估分類器輸出質量的案例,請參見混淆矩陣。有關使用混淆矩陣對手寫數字進行分類的案例,請參閱手寫數字識別。有關使用混淆矩陣對文本文檔進行分類的案例,請參見使用稀疏特徵對文本文檔進行分類。2.6. 分類報告(Classification report)classification_report函數生成一個文本報告,其中顯示了主要的分類指標。這是一個帶有自定義target_names 標籤和推斷標籤(inferred labels)的小示例:>>> from sklearn.metrics import classification_report>>> y_true = [0, 1, 2, 2, 0]>>> y_pred = [0, 0, 2, 1, 0]>>> target_names = ['class 0', 'class 1', 'class 2']>>> print(classification_report(y_true, y_pred, target_names=target_names)) precision recall f1-score support class 0 0.67 1.00 0.80 2 class 1 0.00 0.00 0.00 1 class 2 1.00 0.50 0.67 2 accuracy 0.60 5 macro avg 0.56 0.50 0.49 5weighted avg 0.67 0.60 0.59 5有關手寫數字識別的分類報告用法的案例,請參閱識別手寫數字。有關文本文檔分類報告用法的案例,請參閱使用稀疏特徵分類文本文檔。有關使用嵌套交叉驗證的網格搜索的分類報告用法案例,請參閱使用帶有交叉驗證的網格搜索進行參數估計。2.7. 漢明損失(Hamming loss)hamming_loss計算兩組樣本之間的平均漢明損失或漢明距離。如果 是給定樣本的第 個標籤的預測值, _是對應的真值, 是類或標籤的數量,則兩個樣本之間的漢明損失 定義如下:>>> 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>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))0.75在多分類中,漢明損失相當於y_true和y_pred之間的漢明距離,這於零一損失(Zero one loss)函數類似。但是,雖然零一損失懲罰的是不與真值集合嚴格匹配的預測集合,但是漢明損失懲罰的是獨立的標籤(individual labels)。因此,漢明損失以零一損失為上界,其取值區間在[0, 1]。預測真實標籤的一個合適的子集或超集將會給出一個範圍在(0,1)之間的漢明損失。2.8. 精度,召回率和F度量指標(Precision, recall and F-measures)直觀地講,精度(precision)指的是分類器不會把負樣本標記為正樣本的能力,召回率(recall)指的是分類器找到數據集中所有的正樣本的能力。在 F度量指標 ( 和 度量指標)可被解釋為精度和召回率的加權調和均值。一個 度量指標在取值為1的時候達到它的最好值,而取值為0的時候達到最差得分。當 時, 和 是等價的,而且這時候精度和召回率在 的計算中是同等重要的。precision_recall_curve函數通過不斷改變決策閾值,從真實標籤和分類器給出的一個得分中計算一條精度-召回率曲線。average_precision_score函數根據預測得分計算平均精度(average precision)(AP)。該值在0到1之間,越高越好。AP定義為:其中 和 是第n個閾值處的精度和召回率。對於隨機預測,AP是正樣本的比例。參考文獻[Manning2008]和[Everingham2010]提出了AP的兩種可替代變體對精度-召回率曲線進行內插。當前,average_precision_score函數未實現任何內插的變體版本。參考文獻[Davis2006]和[Flach2015]描述了為什麼精度-召回率曲線上的點的線性內插提供了一個過於樂觀(overly-optimistic)的分類器性能度量。在函數auc中使用梯形規則(trapezoidal rule)計算曲線下面積的時候,這個線性內插會被使用。下面這些函數允許分析精度,召回率和F度量指標的得分:
注意,precision_recall_curve函數只能在二分類的情形下使用。average_precision_score函數僅適用於二進位分類和多標籤指示器(multilabel indicator)的情況。plot_precision_recall_curve函數繪製的精度調用如下圖所示。示例: 有關在文本稀疏分類中使用f1_score的案例,請參見使用稀疏特徵對文本文檔進行分類。有關在帶有交叉驗證的網格搜索的參數估計中使用precision_score和recall_score的案例,請參見使用帶有交叉驗證的網格搜索的參數估計。有關在評估分類器輸出質量中使用precision_recall_curve案例,請參見精度-召回(Precision-Recall)。Manning2008 C.D. Manning, P. Raghavan, H. Schütze, Introduction to Information Retrieval, 2008.Everingham2010 M. Everingham, L. Van Gool, C.K.I. Williams, J. Winn, A. Zisserman, The Pascal Visual Object Classes (VOC) Challenge, IJCV 2010.Davis2006 J. Davis, M. Goadrich, The Relationship Between Precision-Recall and ROC Curves, ICML 2006.Flach2015 P.A. Flach, M. Kull, Precision-Recall-Gain Curves: PR Analysis Done Right, NIPS 2015.2.8.1. 二分類在一個二分類任務中,詞語『』正(positive)』』和『』負(negative)』』指的是分類器的預測,詞語『』真(true)』』和『』假(false)』』指的是預測是否和來自外部判斷相互對應。有了上述詞彙的定義,我們就可以給出下面這個表:
在這種情況下,我們可以定義精度(precision),召回率(recall)和F量度指標(F-measure)的概念:>>> from sklearn import metrics>>> y_pred = [0, 1, 0, 0]>>> y_true = [0, 1, 0, 1]>>> metrics.precision_score(y_true, y_pred)1.0>>> metrics.recall_score(y_true, y_pred)0.5>>> metrics.f1_score(y_true, y_pred)0.66...>>> metrics.fbeta_score(y_true, y_pred, beta=0.5)0.83...>>> metrics.fbeta_score(y_true, y_pred, beta=1)0.66...>>> metrics.fbeta_score(y_true, y_pred, beta=2)0.55...>>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5)(array([0.66..., 1. ]), array([1. , 0.5]), array([0.71..., 0.83...]), array([2, 2])) >>> import numpy as np>>> from sklearn.metrics import precision_recall_curve>>> from sklearn.metrics import average_precision_score>>> y_true = np.array([0, 0, 1, 1])>>> y_scores = np.array([0.1, 0.4, 0.35, 0.8])>>> precision, recall, threshold = precision_recall_curve(y_true, y_scores)>>> precisionarray([0.66..., 0.5 , 1. , 1. ])>>> recallarray([1. , 0.5, 0.5, 0. ])>>> thresholdarray([0.35, 0.4 , 0.8 ])>>> average_precision_score(y_true, y_scores)0.83...2.8.2. 多分類和多標籤分類在多分類和多標籤分類任務中,可以將精度,召回率和F量度指標的概念分別應用於每個標籤。有很多方法可以把所有標籤上的結果組合起來,這可以通過設置參數average為 average_precision_score(僅多標籤),f1_score,fbeta_score,precision_recall_fscore_support,precision_score和recall_score來實現。如所以上所描述的那樣。但請注意如果所有標籤都包括了,在多類分類的設置「micro」 平均策略,將會使產生的精度,召回率和F量度指標都跟準確度(accuracy)一樣。還要注意的是「加權(weighted)」平均策略會產生一個取值範圍不在精度和召回率之間的F量度指標得分。 (約定在處理 的時候有所不同,此實現使用 ,並且 也是類似的)
>>> from sklearn import metrics>>> y_true = [0, 1, 2, 0, 1, 2]>>> y_pred = [0, 2, 1, 0, 0, 1]>>> metrics.precision_score(y_true, y_pred, average='macro')0.22...>>> metrics.recall_score(y_true, y_pred, average='micro')0.33...>>> metrics.f1_score(y_true, y_pred, average='weighted')0.26...>>> metrics.fbeta_score(y_true, y_pred, average='macro', beta=0.5)0.23...>>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5, average=None)(array([0.66..., 0. , 0. ]), array([1., 0., 0.]), array([0.71..., 0. , 0. ]), array([2, 2, 2]...))對於帶有一個「negative class」的多分類任務,不包括某些標籤是可能的:>>> metrics.recall_score(y_true, y_pred, labels=[1, 2], average='micro')... # 除了0, 沒有標籤被正確召回(recalled)。0.0類似的,可以在宏平均中考慮數據樣本中不存在的標籤。>>> metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro')0.166...2.9. Jaccard相似係數得分(Jaccard similarity coefficient score)jaccard_score函數計算成對的標籤集之間的Jaccard相似係數的平均值,也稱為Jaccard索引。給定第 樣本,以及關於樣本的真正的標籤集合 和預測出的標籤集合 ,Jaccard相似係數定義為:jaccard_score工作方式就像precision_recall_fscore_support一樣,它作為天生就設置好的度量指標,它適用於二分類的目標,並且通過使用average,使自身擴展適用於多標籤和多分類(見 上文)。>>> import numpy as np>>> from sklearn.metrics import jaccard_score>>> y_true = np.array([[0, 1, 1],... [1, 1, 0]])>>> y_pred = np.array([[1, 1, 1],... [1, 0, 0]])>>> jaccard_score(y_true[0], y_pred[0])0.6666...在帶有二分類標籤指示器(binary label indicators)的多標籤情況下:>>> jaccard_score(y_true, y_pred, average='samples')0.5833...>>> jaccard_score(y_true, y_pred, average='macro')0.6666...>>> jaccard_score(y_true, y_pred, average=None)array([0.5, 0.5, 1. ])將多分類問題進行二值化並像處理多標籤問題一樣處理:>>> y_pred = [0, 2, 1, 2]>>> y_true = [0, 1, 2, 2]>>> jaccard_score(y_true, y_pred, average=None)array([1. , 0. , 0.33...])>>> jaccard_score(y_true, y_pred, average='macro')0.44...>>> jaccard_score(y_true, y_pred, average='micro')0.33...2.10. 合頁損失(Hinge loss)hinge_loss函數使用合頁損失(僅考慮預測誤差的單邊獨立指標)來計算模型與數據之間的平均距離 。(在支持向量機等最大間隔分類器中使用了合頁損失。)如果類標籤被編碼為+1和-1, :是真值,並且用decision_function預測得到 作為輸出的決策,那麼合頁損失定義如下:如果標籤超過兩個,則hinge_loss使用Crammer&Singer的多類變體(multiclass variant)。這是描述它的論文。如果 是對真實標籤預測出的決策,並且 是所有其他標籤的預測中的最大值,其中預測出的決策是決策函數的輸出,那麼多個類的合頁損失定義如下:這是一個例子演示在二分類問題中,如何將hinge_loss函數與svm分類器一起使用:>>> from sklearn import svm>>> from sklearn.metrics import hinge_loss>>> X = [[0], [1]]>>> y = [-1, 1]>>> est = svm.LinearSVC(random_state=0)>>> est.fit(X, y)LinearSVC(random_state=0)>>> pred_decision = est.decision_function([[-2], [3], [0.5]])>>> pred_decisionarray([-2.18..., 2.36..., 0.09...])>>> hinge_loss([-1, 1, 1], pred_decision)這是一個例子說明在多分類問題中,如何將hinge_loss函數與svm分類器一起使用:>>> X = np.array([[0], [1], [2], [3]])>>> Y = np.array([0, 1, 2, 3])>>> labels = np.array([0, 1, 2, 3])>>> est = svm.LinearSVC()>>> est.fit(X, Y)LinearSVC()>>> pred_decision = est.decision_function([[-1], [2], [3]])>>> y_true = [0, 2, 3]>>> hinge_loss(y_true, pred_decision, labels)0.56...2.11. 對數損失(Log loss)對數損失(Log loss),又被稱為邏輯回歸損失(logistic regression loss)或者交叉熵損失(cross-entropy loss),定義在概率估計上。它通常用於多項式邏輯回歸(multinomial logistic regression)和神經網絡以及期望最大化(expectation-maximization)的一些變體中,並且可用於評估分類器的概率輸出(predict_proba)而不是其離散預測值。對於二分類問題,並伴有真實類標籤 以及 一個概率估計 ,則每個樣本的對數損失是給定真實標籤時分類器的負對數似然函數(negative log-likelihood):上面的公式可以按下述方法擴展到多分類的情形。首先把一個樣本集合的真實類標籤編碼成 1-of-K 二進位指示矩陣: ,也就是說,如果樣本 有標籤 ,而標籤 又是取自於 個類標籤的集合中,那麼就讓 。再令 是概率的估計值的矩陣,並有 。那麼 整個樣本集上的對數損失就定義如下:為了能看清楚上面的公式是如何對二分類對數損失進行推廣的,請注意在二分類情況下, 和 ,因此在 上擴展內部和就可以得到二分類對數損失。log_loss函數根據真實標籤和概率矩陣來計算對數損失,這是由估計器的predict_proba 方法返回的。>>> from sklearn.metrics import log_loss>>> y_true = [0, 0, 1, 1]>>> y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]]>>> log_loss(y_true, y_pred)0.1738...在y_pred中的第一個預測是[.9, .1],這意味著第一個樣本的標籤是0的概率達到了90%。對數損失是非負的。2.12. 馬修斯相關係數(Matthews correlation coefficient)matthews_corrcoef函數用於計算二分類的馬修斯相關係數(Matthews correlation coefficient)(MCC)。下面引用維基百科的相關解釋:「馬修斯相關係數(Matthews correlation coefficient)在機器學習中用作二分類的質量度量。它以真假正負(true and false positives and negatives)為考慮,並且被廣泛認為是一個均衡的度量,即使是在各個類的樣本集大小差別極大時候也可以使用。MCC本質上是一個取值範圍在-1到+1的相關係數,「0」代表了平均隨機預測,」-1」 代表了反轉預測。該統計信息也稱為phi係數。在二分類情況下, , , 和 分別指的是true positives,true negatives,false positives和false negatives的數量,MCC就定義為:在多類情況下,給定 個類的confusion_matrix 之後。馬修斯相關係數可以這樣定義,為了簡化定義,我們用以下這些中間變量: 類 實際發生的次數當有兩種以上類標籤時,MCC的值將不再在-1到+1之間。它的最小值將是一個介於-1到0之間的數,具體數值取決於真實類標籤的數量和分布。它的最大值總是+1。下面是說明matthews_corrcoef函數用法的小例子:>>> from sklearn.metrics import matthews_corrcoef>>> y_true = [+1, +1, +1, -1]>>> y_pred = [+1, -1, +1, +1]>>> matthews_corrcoef(y_true, y_pred)-0.33...2.13. 多標籤混淆矩陣multilabel_confusion_matrix函數計算每個類(默認)或每個樣本(samplewise = True)的多標籤混淆矩陣,以評估分類的準確度。multilabel_confusion_matrix還將多類數據視為多標籤,這是一種轉換,通常用於評估具有二分類指標(例如精度,召回率等)的多類問題(multiclass problems)。在計算每個類的多標籤混淆矩陣 時,類 的true negatives數是 ,false negatives是 ,true positives是 ,false positives是 。這是一個示例來說明如何使用多標籤指示器矩陣(multilabel indicator matrix)作為輸入的multilabel_confusion_matrix函數:>>> from sklearn.metrics import multilabel_confusion_matrix>>> y_true = np.array([[1, 0, 1],... [0, 1, 0]])>>> y_pred = np.array([[1, 0, 0],... [0, 1, 1]])>>> multilabel_confusion_matrix(y_true, y_pred)array([[[1, 0], [0, 1]], [[1, 0], [0, 1]], [[0, 1], [1, 0]]])>>> multilabel_confusion_matrix(y_true, y_pred, samplewise=True)array([[[1, 0], [1, 1]],<BLANKLINE> [[1, 1], [0, 1]]])這是一個示例來說明如何使用多類(multiclass)作為輸入的multilabel_confusion_matrix 函數:>>> y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]>>> y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]>>> multilabel_confusion_matrix(y_true, y_pred,... labels=["ant", "bird", "cat"])array([[[3, 1], [0, 2]], [[5, 0], [1, 0]], [[2, 1], [1, 2]]])以下是一些示例說明如何使用多標籤指標矩陣作為輸入的multilabel_confusion_matrix函數來計算每個類別的召回率(或靈敏度),特異性(specificity),失敗率(fall out)和未命中率(miss rate)。計算每個類別的召回率(也稱為true positive rate或靈敏度):>>> y_true = np.array([[0, 0, 1],... [0, 1, 0],... [1, 1, 0]])>>> y_pred = np.array([[0, 1, 0],... [0, 0, 1],... [1, 1, 0]])>>> mcm = multilabel_confusion_matrix(y_true, y_pred)>>> tn = mcm[:, 0, 0]>>> tp = mcm[:, 1, 1]>>> fn = mcm[:, 1, 0]>>> fp = mcm[:, 0, 1]>>> tp / (tp + fn)array([1. , 0.5, 0. ])計算每個類別的特異性(specificity )(也稱為true negative rate):>>> tn / (tn + fp)array([1. , 0. , 0.5])計算每個類別的失敗(fall out)率(也稱為false positive rate):>>> fp / (fp + tn)array([0. , 1. , 0.5])計算每個類別的未命中率(miss rate)(也稱為false negative rate):>>> fn / (fn + tp)array([0. , 0.5, 1. ])2.14. ROC(Receiver operating characteristic)roc_curve函數計算ROC曲線。引用維基百科:「一個接收器工作特性(ROC),或簡單點叫做ROC曲線,是一幅圖,這幅圖展示了一個二分類器系統在它的判別閾值不斷變化時D 性能。這條曲線上坐標點的縱軸取值是真正的正樣本的比例(TPR= true positive rate)。這條曲線上坐標點的橫軸取值是負樣本中假的正樣本的比例(FPR = false positive rate)。當不斷改變二分類器的閾值的時候,上述TPR和FPR就會跟著發生變化。這樣每一個閾值都會對應一對坐標點(TPR,FPR),只要不斷改變閾值就會產生一條曲線。TPR也被稱之為靈敏度(sensitivity),而FPR是1減去特異性(specificity)或TNR」此函數需要真實的二進位值和目標分數,它們可以是正類的概率估計值,置信度值或二元決策(binary decisions)。這是一個有關如何使用roc_curve函數的小例子:>>> import numpy as np>>> from sklearn.metrics import roc_curve>>> 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)>>> fprarray([0. , 0. , 0.5, 0.5, 1. ])>>> tprarray([0. , 0.5, 0.5, 1. , 1. ])>>> thresholdsarray([1.8 , 0.8 , 0.4 , 0.35, 0.1 ])roc_auc_score函數計算ROC曲線下的面積,該面積也用AUC或AUROC表示。通過計算ROC曲線下的面積,可將曲線信息匯總為一個數值。有關更多信息,請參閱Wikipedia上的AUC文章。>>> 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)0.75在多標籤分類中,roc_auc_score函數被擴展到計算所有標籤上的平均值,如上所述。與子集準確度,漢明損失或F1得分等度量指標相比,ROC不需要為每個標籤優化閾值。roc_auc_score函數也可以用於多分類。當前支持兩種平均策略:「一對一(one-vs-one)」算法計算成對的ROC AUC得分的平均值,「一對多(one-vs-rest)」算法計算每個類別相對於所有其他類別的ROC AUC得分的平均值。在這兩種情況下,預測標籤都以數組的形式提供,該數組的值範圍為0到n_classes,並且得分對應於樣本屬於特定類別的概率估計。一對一(OvO)和一對多(OvR)算法支持統一加權(average='macro')和流行度(prevalence)(average='weighted')。一對一(One-vs-one)算法 :計算類的所有可能成對組合的平均AUC。[HT2001]定義了一個統一加權的多類AUC度量指標:其中, 是類別的數量, 是正類 和負類 的AUC得分。一般來說,在多類情況下, 。通過將關鍵字參數multiclass設置為'ovo'和將關鍵字參數average設置為'macro'來使用此算法。[HT2001]中的多類AUC度量指標可以擴展到由權重進行加權:其中, 是類別的數量。通過將關鍵字參數設置multiclass為'ovo'和將關鍵字參數average設置為'weighted'來使用此算法。如[FC2009]中所述,該選項將返回權重加權平均值。一對多(One-vs-rest)算法 :計算每個類相對於其他類 的AUC[PD2000]。該算法在功能上與多標籤情況相同。要啟用此算法,請將關鍵字參數multiclass設置為'ovr'。像OvO一樣,OvR支持兩種平均類型:'macro' [F2006]和 'weighted' [F2001]。在false positive rate不被容忍的情況下,roc_auc_score函數的參數max_fpr可被用來把ROC曲線累加到一個給定的限制。有關使用ROC評估分類器輸出質量的案例,請參閱接收器工作特性(ROC)。有關使用ROC使用交叉驗證來評估分類器輸出質量的案例,請參閱具有交叉驗證的接收器工作特性(ROC)。有關使用ROC對物種分布進行建模的案例,請參閱物種分布建模。HT2001(1,2) Hand, D.J. and Till, R.J., (2001). A simple generalisation of the area under the ROC curve for multiple class classification problems. Machine learning, 45(2), pp.171-186.[FC2009] Ferri, Cèsar & Hernandez-Orallo, Jose & Modroiu, R. (2009). An Experimental Comparison of Performance Measures for Classification. Pattern Recognition Letters. 30. 27-38.[PD2000] Provost, F., Domingos, P. (2000). Well-trained PETs: Improving probability estimation trees (Section 6.2), CeDER Working Paper #IS-00-04, Stern School of Business, New York University.[F2006] Fawcett, T., 2006. An introduction to ROC analysis. Pattern Recognition Letters, 27(8), pp. 861-874.[F2001] Fawcett, T., 2001. Using rule sets to maximize ROC performance In Data Mining, 2001. Proceedings IEEE International Conference, pp. 131-138.2.15. 零一損失(Zero one loss)zero_one_loss函數在 上計算0-1分類損失( )的和或均值。默認情況下,該函數會在樣本上進行歸一化。如果想要獲得 的和,把 normalize設為False。在多標籤分類問題中,zero_one_loss函數給一個子集評分為1,如果這個子集的真實標籤與預測嚴格匹配,反之如果有任何一處不匹配則評分為0。默認情況下,函數返回不完美預測子集的百分比。如果想要獲得這些不完美預測子集的數量,只需要把參數normalize設置成False。如果 是第 個樣本的預測值, _是對應的真值,那麼0-1損失 定義如下:>>> from sklearn.metrics import zero_one_loss>>> y_pred = [1, 2, 3, 4]>>> y_true = [2, 2, 3, 4]>>> zero_one_loss(y_true, y_pred)0.25>>> zero_one_loss(y_true, y_pred, normalize=False)在帶有二元標籤指示器(binary label indicators)的多標籤情況下,第一個標籤集[0,1]出現錯誤:>>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))0.5 >>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)), normalize=False)1有關在交叉驗證進行遞歸特徵消除中使用零一損失的案例,請參見使用交叉驗證進行遞歸特徵消除。2.16. Brier得分損失brier_score_loss函數計算二分類的Brier得分。引用維基百科:Brier得分是一個用於度量概率性預測準確率的合適的評分函數。它可以被用到某些任務中,在這些任務裡面預測必須分配概率到一個由互斥離散輸出組成的集合上。該函數返回實際輸出和可能輸出預測概率之間的平均平方差得分。實際輸出必須是1或0(true或false),而實際輸出的預測概率可以是一個介於0和1之間的數。Brier得分損失也是一個介於0到1之間的數,而且得分越低(也就是平均平方誤差)則預測越精確。它可被認為是對一組概率性預測「校準(calibration)」的度量。>>> import numpy as np>>> from sklearn.metrics import brier_score_loss>>> y_true = np.array([0, 1, 1, 0])>>> y_true_categorical = np.array(["spam", "ham", "ham", "spam"])>>> y_prob = np.array([0.1, 0.9, 0.8, 0.4])>>> y_pred = np.array([0, 1, 1, 0])>>> brier_score_loss(y_true, y_prob)0.055>>> brier_score_loss(y_true, 1 - y_prob, pos_label=0)0.055>>> brier_score_loss(y_true_categorical, y_prob, pos_label="ham")0.055>>> brier_score_loss(y_true, y_prob > 0.5)0.0有關使用Brier分數損失來執行分類器概率校準的示例,請參閱分類器的概率校準。G. Brier, Verification of forecasts expressed in terms of probability, Monthly weather review 78.1 (1950)3. 多標籤排名指標(ranking metrics)在多標籤學習中,每個樣本可以有任意個與之相關聯的真實標籤。目標是給予真實標籤更高的分數和更好的排名。3.1. 覆蓋誤差coverage_error函數計算最終預測中必須包含的標籤平均數量,以便預測所有真實標籤。如果你想知道你平均需要預測多少最高分的標籤(top-scored-labels)而不漏掉任何一個真實標籤,這個函數是很有用的。因此,這個指標的最佳值是真實標籤的平均數量。我們的實現得分比Tsoumakas等人2010年給出的得分高1分。這將擴展處理一個實例具有0個真標籤的退化情況。>>> import numpy as np>>> from sklearn.metrics import coverage_error>>> y_true = np.array([[1, 0, 0], [0, 0, 1]])>>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])>>> coverage_error(y_true, y_score)2.53.2. 標籤排名平均精度(Label ranking average precision)label_ranking_average_precision_score 函數實現 label ranking average precision(LRAP)。此度量與average_precision_score 函數相關,但基於標籤排名的概念,而不是精確度和召回率。標籤排名平均精度(LRAP)在樣本上的平均值回答了以下問題:對於每個真實標籤,高排名標籤中的哪一部分是真標籤?如果您能夠給與每個樣本相關聯的標籤更好的排名,則此性能指標將更高。得到的分數總是嚴格大於0,最佳值為1。如果每個樣本只有一個相關標籤,則標籤排名平均精度等於平均倒數排名。>>> import numpy as np>>> from sklearn.metrics import label_ranking_average_precision_score>>> y_true = np.array([[1, 0, 0], [0, 0, 1]])>>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])>>> label_ranking_average_precision_score(y_true, y_score)0.416...3.3. 排名損失(Ranking loss)label_ranking_loss函數在樣本上計算平均錯誤排序的標籤對數量的排序損失,即真標籤的得分低於假標籤,由假和真標籤的排序對的數量倒數加權。可實現的最低排名損失為零。其中 計算集合的基數(即集合中的元素數),而 是 「範數」(計算向量中非零元素數)。>>> import numpy as np>>> from sklearn.metrics import label_ranking_loss>>> y_true = np.array([[1, 0, 0], [0, 0, 1]])>>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])>>> label_ranking_loss(y_true, y_score)0.75...>>> # 隨著接下來的預測,我們有一個完美並且最小的損失(loss)>>> y_score = np.array([[1.0, 0.1, 0.2], [0.1, 0.2, 0.9]])>>> label_ranking_loss(y_true, y_score)0.0Tsoumakas, G., Katakis, I., & Vlahavas, I. (2010). Mining multi-label data. In Data mining and knowledge discovery handbook (pp. 667-685). Springer US.3.4. 標準化折扣累積收益(Normalized Discounted Cumulative Gain)折扣累積收益(DCG)和標準化折扣累積收益(NDCG)是排名指標(ranking metrics);它們比較預測順序與真實值得分,例如答案與查詢的相關性。從Wikipedia頁面獲取折扣累計收益相關描述:「折扣累積收益(DCG)是衡量排名質量的一個指標。在信息檢索中,它經常被用來衡量web搜尋引擎算法或相關應用程式的有效性。DCG使用搜尋引擎結果集中文檔的分級關聯度,根據文檔在結果列表中的位置來衡量文檔的有用性或收益。收益是從結果列表的頂部到底部累積起來的,每個結果的收益在較低等級時被打折。」DCG按照預測的順序排列真實目標(例如查詢答案的相關性),然後將它們乘以對數衰減(logarithmic decay),並對結果進行求和。在第一個K結果之後,總和可以被截斷,在這種情況下我們稱之為DCG@K.NDCG,或者NDCG@K是DCG除以完美預測得到的DCG,所以它總是在0和1之間。通常,NDCG比DCG更受歡迎。與排名損失相比,NDCG可以考慮相關性得分,而不是ground-truth排名。因此,如果ground-truth僅包含一個排序,則應優先考慮排名損失;如果ground-truth包含實際有用性得分(例如,0表示不相關,1表示相關,2表示非常相關),則可以使用NDCG。對於一個樣本,給定每個目標 連續真實值向量,其中 是輸出的數目,並且預測值是 ,排序函數是 ,DCG得分為且NDCG分數是DCG分數除以由y獲得的DCG分數。Wikipedia entry for Discounted Cumulative Gain: https://en.wikipedia.org/wiki/Discounted_cumulative_gainJarvelin, K., & Kekalainen, J. (2002). Cumulated gain-based evaluation of IR techniques. ACM Transactions on Information Systems (TOIS), 20(4), 422-446.Wang, Y., Wang, L., Li, Y., He, D., Chen, W., & Liu, T. Y. (2013, May). A theoretical analysis of NDCG ranking measures. In Proceedings of the 26th Annual Conference on Learning Theory (COLT 2013)McSherry, F., & Najork, M. (2008, March). Computing information retrieval performance measures efficiently in the presence of tied scores. In European conference on information retrieval (pp. 414-421). Springer, Berlin, Heidelberg.4. 回歸度量(Regression metrics)sklearn.metrics模塊實現了幾個loss、score和utility函數來度量回歸性能。其中一些已被增強來處理多輸出情況:mean_squared_error, mean_absolute_error, explained_variance_score 和 r2_score。這些函數有一個multioutput 關鍵字參數,指定每個目標的得分或損失的取平均方式。默認值為'uniform_average',指定輸出的均勻加權平均值。如果通過了形狀為(n_outputs,)的ndarray ,則將其條目(entries)解釋為權重,並返回相應的加權平均值。如果指定multioutput 為'raw_values',則所有未更改的單個分數或損失將以一個形狀為(n_outputs,)的數組返回。r2_score和explained_variance_score接受multioutput參數的附加值'variance_weighted'。此選項將通過相應目標變量的方差對每個個體得分進行加權。此設置量化全局捕獲的未縮放方差。如果目標變量具有不同的大小,那麼這一得分就更加重視對高方差變量的解釋。multioutput='variance_weighted'是r2_score向後兼容性的默認值。未來將改為uniform_average。4.1. 解釋方差得分(variance score)explained_variance_score計算 explained variance regression score。如果 是估計的目標輸出, 是相應的(正確的)目標輸出,而Var是方差,即標準差的平方,則解釋方差(explained variance)估計如下:下面是一個使用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)0.957...>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> explained_variance_score(y_true, y_pred, multioutput='raw_values')array([0.967..., 1. ])>>> explained_variance_score(y_true, y_pred, multioutput=[0.3, 0.7])0.990...4.2. 最大誤差(Max error)max_error函數計算最大剩餘誤差(residual error),這是一個度量,用於捕獲預測值和真值之間最壞情況的誤差。在完全擬合的單輸出回歸模型中,訓練集上的max_error將為0 ,儘管在現實世界中這是極不可能的,但此度量顯示了模型擬合時的誤差程度。如果 是第 個樣本的預測值, 是相應的真實值,則最大誤差定義為下面是關於max_error函數用法的一個小例子:>>> from sklearn.metrics import max_error>>> y_true = [3, 2, 7, 1]>>> y_pred = [9, 2, 7, 1]>>> max_error(y_true, y_pred)64.3. 平均絕對誤差(Mean absolute error)mean_absolute_error函數計算 mean absolute error,是與絕對誤差損失或 範數損失的期望值相對應的風險度量(risk metric)。如果 是第 個樣本的預測值,而 是相應的真實值,則在 個樣本上估計的平均絕對誤差(MAE)定義為下面是關於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)0.5>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> mean_absolute_error(y_true, y_pred)0.75>>> mean_absolute_error(y_true, y_pred, multioutput='raw_values')array([0.5, 1. ])>>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7])0.85...4.4. 均方誤差(Mean squared error)mean_squared_error函數 mean square error,即與平方(二次)誤差或損失的期望值相對應的風險度量(risk metric)。如果 是第 個樣本的預測值,而 是相應的真實值,則在 個樣本上估計的均方誤差(MSE)定義為下面是關於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)0.375>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> mean_squared_error(y_true, y_pred)0.7083...有關評估梯度增強回歸的均方誤差使用示例,請參見 梯度增強回歸。4.5. 均方對數誤差(Mean squared logarithmic error)mean_squared_log_error函數計算與平方對數(二次)誤差或損失的期望值相對應的風險度量(risk metric)。如果 是第 個樣本的預測值,而 是對應的真實值,則在 個樣本上估計的均方對數誤差(MSLE)定義為其中 是指 的自然對數。當目標呈指數增長趨勢時,此指標較為合適,如人口計數、跨年度商品的平均銷售額等。請注意,此指標對預測不足的估計值的懲罰大於對預測過高的估計值。下面是關於mean_squared_log_error函數用法的一個小例子:>>> from sklearn.metrics import mean_squared_log_error>>> y_true = [3, 5, 2.5, 7]>>> y_pred = [2.5, 5, 4, 8]>>> mean_squared_log_error(y_true, y_pred)0.039...>>> y_true = [[0.5, 1], [1, 2], [7, 6]]>>> y_pred = [[0.5, 2], [1, 2.5], [8, 8]]>>> mean_squared_log_error(y_true, y_pred)0.044...4.6. 中位數絕對誤差(Median absolute error)median_absolute_error特別有趣,因為它對離群值具有魯棒性。損失的計算方法是取目標和預測之間所有絕對差異的中位數。如果 是第 個樣本的預測值, 是相應的真實值,則在 個樣本上估計的中位絕對誤差(MedAE)定義為median_absolute_error 不支持多輸出。下面是關於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)0.54.7. R² score, 決定係數(coefficient of determination)r2_score 函數計算 coefficient of determination,通常表示為R²。它表示由模型中的獨立變量解釋(independent variables)的方差 (of y)比例。它提供了擬合優度的指示,因此通過解釋方差的比例來衡量模型預測未見過的樣本性能。由於這種方差依賴於數據集,因此不同數據集之間的R²可能沒有可比性。最好的分數是1.0,並且它可能是負的(因為模型可能會隨意變差)。如果一個常數模型總是預測y的期望值,而不考慮輸入特徵,則R²得分為0.0。如果 是第 個樣本的預測值, 是總共 個樣本的對應真實值,則估計的R²定義為:請注意,r2_score計算未經調整的R²,且不校正y的樣本方差中的偏差。下面是關於r2_score 函數用法的一個小例子:>>> 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)0.948...>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> r2_score(y_true, y_pred, multioutput='variance_weighted')0.938...>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> r2_score(y_true, y_pred, multioutput='uniform_average')0.936...>>> r2_score(y_true, y_pred, multioutput='raw_values')array([0.965..., 0.908...])>>> r2_score(y_true, y_pred, multioutput=[0.3, 0.7])0.925...參見 Lasso and Elastic Net for Sparse Signals 以獲取在稀疏信號上評估 Lasso and Elastic Net 的 R² score 使用示例。4.8. 平均泊松、伽馬和二次偏差(Mean Poisson, Gamma, and Tweedie deviances)mean_tweedie_deviance 函數用一個power參數(p)計算 mean Tweedie deviance error。這是一個度量,可以得出回歸目標的預期值。當power=0時,等於 mean_squared_error(均方誤差).當power=1時,等於 mean_poisson_deviance(平均泊松偏差).當power=2時,等於 mean_gamma_deviance(平均伽馬偏差).如果 是第 個樣本的預測值, 是相應的真實值,則 power p 的平均二次偏差(Tweedie deviances)誤差(D)定義為二次偏差(Tweedie deviances)是二次冪(degree 2-power)齊次函數。因此,Gamma分布(power=2)意味著同時縮放y_true 和y_pred對偏差沒有影響。對於泊松分布( power=1),偏差線性縮放;對於正態分布(power=0),偏差二次縮放。一般來說,power 越大,真實目標和預測目標之間的極端偏差的權重就越小。例如,讓我們比較兩個預測值1.0和100,它們都是對應真實值的50%。均方誤差(power=0)對第二點的預測差非常敏感:>>> from sklearn.metrics import mean_tweedie_deviance>>> mean_tweedie_deviance([1.0], [1.5], power=0)0.25>>> mean_tweedie_deviance([100.], [150.], power=0)2500.0>>> mean_tweedie_deviance([1.0], [1.5], power=1)0.18...>>> mean_tweedie_deviance([100.], [150.], power=1)18.9...>>> mean_tweedie_deviance([1.0], [1.5], power=2)0.14...>>> mean_tweedie_deviance([100.], [150.], power=2)0.14...我們會得到相同的錯誤。因此,當power=2時的偏差僅對相對誤差(relative errors)敏感。5. 聚類度量(Clustering metrics)sklearn.metrics 模塊實現了幾個loss、score 和 utility 函數。有關更多信息,請參閱聚類性能評估部分,例如聚類和用於二分聚類的二分聚類評估部分。6. 虛擬(Dummy)估計器在進行有監督的學習時,一個簡單的完整性檢查(sanity check)包括比較估計器和簡單的經驗法則。DummyClassifier 實現了幾種簡單的分類策略:stratified 根據訓練集的類分布生成隨機預測。most_frequent預測訓練集中最常見的標籤。prior給出最大化類先驗概率(class prior)(如most_frequent)的預測,predict_proba 返回類先驗概率。當正類比較少時,這種方法的一個主要動機是 F1-scoring。注意,在所有這些策略中,predict 方法完全忽略了輸入數據!為了說明DummyClassifier,我們首先創建一個不平衡的數據集:>>> from sklearn.datasets import load_iris>>> from sklearn.model_selection import train_test_split>>> X, y = load_iris(return_X_y=True)>>> y[y != 1] = -1>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)接下來,讓我們比較SVC 和most_frequent的準確率:>>> from sklearn.dummy import DummyClassifier>>> from sklearn.svm import SVC>>> clf = SVC(kernel='linear', C=1).fit(X_train, y_train)>>> clf.score(X_test, y_test)0.63...>>> clf = DummyClassifier(strategy='most_frequent', random_state=0)>>> clf.fit(X_train, y_train)DummyClassifier(random_state=0, strategy='most_frequent')>>> clf.score(X_test, y_test)0.57...我們看到SVC 並沒有比虛擬(dummy)分類器做得更好。現在,讓我們更改內核:>>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train)>>> clf.score(X_test, y_test)0.94...我們看到準確率提高到了幾乎100%。如果CPU成本不高,建議使用交叉驗證策略以更好地估計準確性。有關更多信息,請參閱交叉驗證:評估估計器性能部分。此外,如果要在參數空間上進行優化,強烈建議使用適當的方法;有關詳細信息,請參閱調整估計器的超參數部分。通常,當一個分類器的準確率太接近隨機性時,它可能意味著出了問題:特徵沒有幫助,超參數沒有得到正確調整,類不平衡導致分類器出現問題等…DummyRegressor還為回歸實現了四個簡單的經驗法則:quantile 預測用戶提供的訓練目標的分位數(quantile)。在所有這些策略中,predict 方法完全忽略了輸入數據☆☆☆為方便大家查閱,小編已將scikit-learn學習路線專欄 文章統一整理到公眾號底部菜單欄,同步更新中,關注公眾號,點擊左下方「系列文章」,如圖:
或點擊下方「閱讀原文」,進入scikit-learn專欄 ,即可查看系列文章。
歡迎大家和我一起沿著scikit-learn文檔這條路線,一起鞏固機器學習算法基礎。(添加微信:mthler , 備註:sklearn學習,一起進【sklearn機器學習進步群】開啟打怪升級的學習之旅。)