sklearn中的模型評估-構建評估函數

1.介紹

有三種不一樣的方法來評估一個模型的預測質量:html

  • estimator的score方法:sklearn中的estimator都具備一個score方法,它提供了一個缺省的評估法則來解決問題。
  • Scoring參數:使用cross-validation的模型評估工具,依賴於內部的scoring策略。見下。
  • Metric函數:metrics模塊實現了一些函數,用來評估預測偏差。見下。

2. scoring參數

模型選擇和評估工具,例如: grid_search.GridSearchCV 和 cross_validation.cross_val_score,使用scoring參數來控制你的estimator的好壞。python

2.1 預約義的值

對於大多數case而說,你能夠設計一個使用scoring參數的scorer對象;下面展現了全部可能的值。全部的scorer對象都遵循:高得分,更好效果。若是從mean_absolute_error 和mean_squared_error(它計算了模型與數據間的距離)返回的得分將被忽略。git

2.2 從metric函數定義你的scoring策略

sklearn.metric提供了一些函數,用來計算真實值與預測值之間的預測偏差:數組

  • 以_score結尾的函數,返回一個最大值,越高越好
  • 以_error結尾的函數,返回一個最小值,越小越好;若是使用make_scorer來建立scorer時,將greater_is_better設爲False

接下去會討論多種機器學習當中的metrics。網絡

許多metrics並無給出在scoring參數中可配置的字符名,由於有時你可能須要額外的參數,好比:fbeta_score。這種狀況下,你須要生成一個合適的scorer對象。最簡單的方法是調用make_scorer來生成scoring對象。該函數將metrics轉換成在模型評估中可調用的對象。app

第一個典型的用例是,將一個庫中已經存在的metrics函數進行包裝,使用定製參數,好比對fbeta_score函數中的beta參數進行設置:cors

>>> from sklearn.metrics import fbeta_score, make_scorer >>> ftwo_scorer = make_scorer(fbeta_score, beta=2) >>> from sklearn.grid_search import GridSearchCV >>> from sklearn.svm import LinearSVC >>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]}, scoring=ftwo_scorer)

第二個典型用例是,經過make_scorer構建一個完整的定製scorer函數,該函數能夠帶有多個參數:dom

  • 你可使用python函數:下例中的my_custom_loss_func
  • python函數是否返回一個score(greater_is_better=True),仍是返回一個loss(greater_is_better=False)。若是爲loss,python函數的輸出將被scorer對象忽略,根據交叉驗證的原則,得分越高模型越好。
  • 對於分類問題的metrics:若是你提供的python函數是否須要對連續值進行決策判斷,能夠將參數設置爲(needs_threshold=True)。缺省值爲False。
  • 一些額外的參數:好比f1_score中的bata或labels。

下例使用定製的scorer,使用了greater_is_better參數:機器學習

>>> import numpy as np >>> def my_custom_loss_func(ground_truth, predictions): ... diff = np.abs(ground_truth - predictions).max() ... return np.log(1 + diff) ... >>> loss = make_scorer(my_custom_loss_func, greater_is_better=False) >>> score = make_scorer(my_custom_loss_func, greater_is_better=True) >>> ground_truth = [[1, 1]] >>> predictions = [0, 1] >>> from sklearn.dummy import DummyClassifier >>> clf = DummyClassifier(strategy='most_frequent', random_state=0) >>> clf = clf.fit(ground_truth, predictions) >>> loss(clf,ground_truth, predictions) -0.69... >>> score(clf,ground_truth, predictions) 0.69...

2.3 實現你本身的scoring對象

你能夠生成更靈活的模型scorer,經過從頭構建本身的scoring對象來完成,不須要使用make_scorer工廠函數。對於一個本身實現的scorer來講,它須要遵循兩個原則:函數

  • 必須能夠用(estimator, X, y)進行調用
  • 必須返回一個float的值

3. 分類metrics

sklearn.metrics模塊實現了一些loss, score以及一些工具函數來計算分類性能。一些metrics可能須要正例、置信度、或二分決策值的的機率估計。大多數實現容許每一個sample提供一個對總體score來講帶權重的分佈,經過sample_weight參數完成。

一些二分類(binary classification)使用的case:

  • matthews_corrcoef(y_true, y_pred)
  • precision_recall_curve(y_true, probas_pred)
  • roc_curve(y_true, y_score[, pos_label, …])

一些多分類(multiclass)使用的case:

  • confusion_matrix(y_true, y_pred[, labels])
  • hinge_loss(y_true, pred_decision[, labels, …])

一些多標籤(multilabel)的case:

  • accuracy_score(y_true, y_pred[, normalize, …])
  • classification_report(y_true, y_pred[, …])
  • f1_score(y_true, y_pred[, labels, …])
  • fbeta_score(y_true, y_pred, beta[, labels, …])
  • hamming_loss(y_true, y_pred[, classes])
  • jaccard_similarity_score(y_true, y_pred[, …])
  • log_loss(y_true, y_pred[, eps, normalize, …])
  • precision_recall_fscore_support(y_true, y_pred)
  • precision_score(y_true, y_pred[, labels, …])
  • recall_score(y_true, y_pred[, labels, …])
  • zero_one_loss(y_true, y_pred[, normalize, …])

還有一些能夠同時用於二標籤和多標籤(不是多分類)問題:

  • average_precision_score(y_true, y_score[, …])
  • roc_auc_score(y_true, y_score[, average, …])

在如下的部分,咱們將討論各個函數。

3.1 二分類/多分類/多標籤

對於二分類來講,必須定義一些matrics(f1_score,roc_auc_score)。在這些case中,缺省只評估正例的label,缺省的正例label被標爲1(能夠經過配置pos_label參數來完成)

將一個二分類matrics拓展到多分類或多標籤問題時,咱們能夠將數據當作多個二分類問題的集合,每一個類都是一個二分類。接着,咱們能夠經過跨多個分類計算每一個二分類metrics得分的均值,這在一些狀況下頗有用。你可使用average參數來指定。

  • macro:計算二分類metrics的均值,爲每一個類給出相同權重的分值。當小類很重要時會出問題,由於該macro-averging方法是對性能的平均。另外一方面,該方法假設全部分類都是同樣重要的,所以macro-averaging方法會對小類的性能影響很大。
  • weighted: 對於不均衡數量的類來講,計算二分類metrics的平均,經過在每一個類的score上進行加權實現。
  • micro: 給出了每一個樣本類以及它對整個metrics的貢獻的pair(sample-weight),而非對整個類的metrics求和,它會每一個類的metrics上的權重及因子進行求和,來計算整個份額。Micro-averaging方法在多標籤(multilabel)問題中設置,包含多分類,此時,大類將被忽略。
  • samples:應用在 multilabel問題上。它不會計算每一個類,相反,它會在評估數據中,經過計算真實類和預測類的差別的metrics,來求平均(sample_weight-weighted)
  • average:average=None將返回一個數組,它包含了每一個類的得分.

多分類(multiclass)數據提供了metric,和二分類相似,是一個label的數組,而多標籤(multilabel)數據則返回一個索引矩陣,當樣本i具備label j時,元素[i,j]的值爲1,不然爲0.

3.2 accuracy_score

accuracy_score函數計算了準確率,不論是正確預測的fraction(default),仍是count(normalize=False)。

在multilabel分類中,該函數會返回子集的準確率。若是對於一個樣原本說,必須嚴格匹配真實數據集中的label,整個集合的預測標籤返回1.0;不然返回0.0.

預測值與真實值的準確率,在n個樣本下的計算公式以下:

1(x)爲指示函數。

>>> 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

在多標籤的case下,二分類label:

>>> accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2))) 0.5

3.3 Cohen’s kappa

函數cohen_kappa_score計算了Cohen’s kappa估計。這意味着須要比較經過不一樣的人工標註(numan annotators)的標籤,而非分類器中正確的類。

kappa score是一個介於(-1, 1)之間的數. score>0.8意味着好的分類;0或更低意味着很差(實際是隨機標籤)

Kappa score能夠用在二分類或多分類問題上,但不適用於多標籤問題,以及超過兩種標註的問題。

3.4 混淆矩陣

confusion_matrix函數經過計算混淆矩陣,用來計算分類準確率。

缺省的,在混淆矩陣中的i,j指的是觀察的數目i,預測爲j,示例:

>>> 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]])

結果爲:

示例:

3.5 分類報告

classification_report函數構建了一個文本報告,用於展現主要的分類metrics。 下例給出了一個小示例,它使用定製的target_names和對應的label:

>>> from sklearn.metrics import classification_report >>> y_true = [0, 1, 2, 2, 0] >>> y_pred = [0, 0, 2, 2, 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 1.00 1.00 2 avg / total 0.67 0.80 0.72 5

示例:

3.6 Hamming loss

hamming_loss計算了在兩個樣本集裏的平均漢明距離或平均Hamming loss。

  • 是對應第j個label的預測值,
  • 是對應的真實值
  • 是類目數

那麼兩個樣本間的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

在多標籤(multilabel)的使用二元label指示器的狀況:

>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2))) 0.75

注意:在多分類問題上,Hamming loss與y_true 和 y_pred 間的Hamming距離相關,它與0-1 loss相相似。然而,0-1 loss會對不嚴格與真實數據集相匹配的預測集進行懲罰。於是,Hamming loss,做爲0-1 loss的上界,也在0和1之間;預測一個合適的真實label的子集或超集將會給出一個介於0和1之間的Hamming loss.

3.7 Jaccard類似度係數score

jaccard_similarity_score函數會計算兩對label集之間的Jaccard類似度係數的平均(缺省)或求和。它也被稱爲Jaccard index.

第i個樣本的Jaccard類似度係數(Jaccard similarity coefficient),真實標籤集爲,預測標籤集爲:,其定義以下:

在二分類和多分類問題上,Jaccard類似度係數score與分類的正確率(accuracy)相同:

>>> import numpy as np >>> from sklearn.metrics import jaccard_similarity_score >>> y_pred = [0, 2, 1, 3] >>> y_true = [0, 1, 2, 3] >>> jaccard_similarity_score(y_true, y_pred) 0.5 >>> jaccard_similarity_score(y_true, y_pred, normalize=False) 2

在多標籤(multilabel)問題上,使用二元標籤指示器:

>>> jaccard_similarity_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2))) 0.75

3.8 準確率,召回率與F值

準確率(precision)能夠衡量一個樣本爲負的標籤被判成正,召回率(recall)用於衡量全部正例。

F-meature(包括:),能夠認爲是precision和recall的加權調和平均(weighted harmonic mean)。一個值,最佳爲1,最差時爲0. 若是=1,那麼相等,precision和recall的權重相等。

precision_recall_curve會根據預測值和真實值來計算一條precision-recall典線。

average_precision_score則會預測值的平均準確率(AP: average precision)。該分值對應於precision-recall曲線下的面積。

sklearn提供了一些函數來分析precision, recall and F-measures值:

  • average_precision_score:計算預測值的AP
  • f1_score: 計算F1值,也被稱爲平衡F-score或F-meature
  • fbeta_score: 計算F-beta score
  • precision_recall_curve:計算不一樣機率閥值的precision-recall對
  • precision_recall_fscore_support:爲每一個類計算precision, recall, F-measure 和 support
  • precision_score: 計算precision
  • recall_score: 計算recall

注意:precision_recall_curve只用於二分類中。而average_precision_score可用於二分類或multilabel指示器格式

示例:

3.8.1 二分類

在二元分類中,術語「positive」和「negative」指的是分類器的預測類別(expectation),術語「true」和「false」則指的是預測是否正確(有時也稱爲:觀察observation)。給出以下的定義:

  實際類目(observation)  
預測類目(expectation) TP(true positive)結果:Correct FP(false postive)結果:Unexpected
  FN(false negative)結果: Missing TN(true negtive)結果:Correct

在這個上下文中,咱們定義了precision, recall和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) >>> precision array([ 0.66..., 0.5 , 1. , 1. ]) >>> recall array([ 1. , 0.5, 0.5, 0. ]) >>> threshold array([ 0.35, 0.4 , 0.8 ]) >>> average_precision_score(y_true, y_scores) 0.79...

3.8.2 多元分類和多標籤分類

在多分類(Multiclass)和多標籤(multilabel)分類問題上,precision, recall, 和 F-measure的概念能夠獨立應用到每一個label上。有一些方法能夠綜合各標籤上的結果,經過指定average_precision_score (只能用在multilabel上), f1_score, fbeta_score, precision_recall_fscore_support, precision_score 和 recall_score這些函數上的參數average能夠作到。

注意:

  • 「micro」選項:表示在多分類中的對全部label進行micro-averaging產生一個平均precision,recall和F值
  • 「weighted」選項:表示會產生一個weighted-averaging的F值。

能夠考慮下面的概念:

  • y是(sample, label)pairs的預測集
  • 是(sample, label)pairs的真實集
  • L是labels的集
  • S是labels的集
  • 是y的子集,樣本s,好比:
  • 表示label l的y子集
  • 一樣的,都是的子集
  • 在處理時方式更不一樣;該實現採用,且與P相相似。

metrics的定義以下:

代碼:

>>> 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') ... # excluding 0, no labels were correctly recalled 0.0

相似的,在數據集樣本中沒有出現的label不能用在macro-averaging中。

>>> metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro') ... 0.166...

3.9 Hinge loss

hinge_loss函數會使用hinge loss計算模型與數據之間的平均距離。它是一個單邊的metric,只在預測錯誤(prediction erros)時考慮。(Hinge loss被用於最大間隔分類器上:好比SVM)

若是label使用+1和-1進行編碼。y爲真實值,w爲由decision_function結出的預測決策。 hinge loss的定義以下:

若是超過兩個label,因爲Crammer & Singer所提到的問題 ,hinge_loss 會使用一個多元分類的變種。

若是是對於true label的預測判斷(predicted decision),則是對於其餘label的預測判斷的最大值,而predicted decisions由多個predicted decision輸出,那麼多分類的hinge loss定義以下:

二分類問題示例:

>>> 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(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1, loss='squared_hinge', max_iter=1000, multi_class='ovr', penalty='l2', random_state=0, tol=0.0001, verbose=0) >>> pred_decision = est.decision_function([[-2], [3], [0.5]]) >>> pred_decision array([-2.18..., 2.36..., 0.09...]) >>> hinge_loss([-1, 1, 1], pred_decision) 0.3...

多分類問題示例:

>>> 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(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1, loss='squared_hinge', max_iter=1000, multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, verbose=0) >>> pred_decision = est.decision_function([[-1], [2], [3]]) >>> y_true = [0, 2, 3] >>> hinge_loss(y_true, pred_decision, labels) 0.56...

3.10 Log loss

Log loss也被稱爲logistic迴歸loss,或者交叉熵loss(cross-entropy loss),用於機率估計。它一般用在(multinomial)的LR和神經網絡上,以最大指望(EM:expectation-maximization)的變種的方式,用於評估一個分類器的機率輸出,而非進行離散預測。

對於二元分類,true label爲:,機率估計爲:,每一個樣本的log loss是對分類器給定true label的負值log似然估計(negative log-likelihood):

當擴展到多元分類(multiclass)上時。能夠將樣本的true label編碼成1-of-K個二元指示器矩陣Y,若是從label K集合中取出的樣本i,對應的label爲k,則,P爲機率估計矩陣,。整個集合的log loss表示以下:

咱們再看下如何對二分類的log loss進行泛化的,注意,在二分類問題上,,於是,經過在擴展內部和來給出二分類的log loss。

log_loss函數,經過給定一列真實值label和一個機率矩陣來計算log loss,返回值經過estimator的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]指的是,第一個樣本中90%的機率是label 0。另外,log loss是非負的。

3.11 Matthews相關係數

matthews_corrcoef函數計算了二元分類的Matthew’s correlation coefficient (MCC).

wikipedia是這麼說的:

「The Matthews correlation coefficient is used in machine learning as a measure of the quality of binary (two-class) classifications. It takes into account true and false positives and negatives and is generally regarded as a balanced measure which can be used even if the classes are of very different sizes. The MCC is in essence a correlation coefficient value between -1 and +1. A coefficient of +1 represents a perfect prediction, 0 an average random prediction and -1 an inverse prediction. The statistic is also known as the phi coefficient.」

翻譯以下:

機器學習中使用的Matthews相關係數,用於度量二分類的質量。它會考慮TP/FP/TN/FP的狀況,一般被認爲是一個balanced的度量 ,能夠用於那些有着不一樣size的分類中。MCC本質上是一個介於[-1,+1]之間的相關係數值。相關係數爲+1,表示是一個完美的預測,0表示是一個平均隨機預測(average random prediction),而-1表示是一個逆預測(inverse prediction)。這種統計方法也被稱爲:phi coefficient。

MCC相應的定義以下:

這裏的示例展現了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...

3.12 ROC

roc_curve計算了ROC曲線。Wikipedia以下:

「A receiver operating characteristic (ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied. It is created by plotting the fraction of true positives out of the positives (TPR = true positive rate) vs. the fraction of false positives out of the negatives (FPR = false positive rate), at various threshold settings. TPR is also known as sensitivity, and FPR is one minus the specificity or true negative rate.」

該函數須要二分類的真實值和預測值,它能夠是正例的機率估計,置信值,或二分決策值。下例展現瞭如何使用:

>>> 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) >>> fpr array([ 0. , 0.5, 0.5, 1. ]) >>> tpr array([ 0.5, 0.5, 1. , 1. ]) >>> thresholds array([ 0.8 , 0.4 , 0.35, 0.1 ])

下圖展下了上面的結果:

roc_auc_score函數計算了ROC曲線下面的面積,它也被稱爲AUC或AUROC。經過計算下面的面積,曲線信息被歸一化到1內。

>>> 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

在多標籤(multi-label)分類上,roc_auc_score經過對上面的label進行平均。

對比於其它metrics: accuracy、 Hamming loss、 F1-score, ROC不須要爲每一個label優化一個閥值。roc_auc_score函數也能夠用於多分類(multi-class)問題上。若是預測的輸出已經被二值化。

示例:

3.13 0-1 loss

zero_one_loss會經過在計算0-1分類的)的平值或求和。缺省狀況下,該函數會對樣本進行歸一化。爲了獲得的求和,須要將normalize設置爲False。

在multilabel分類上,若是一個子集的labels與預測值嚴格匹配,zero_one_loss會獲得1,若是有許多錯誤,則爲0。缺省的,該函數會返回有問題的預測子集(不等)的百分比。爲了獲得這樣的子集數,能夠將normalize置爲False。

若是是第i個樣本的預測值, 是第i個樣本的真實值,那麼0-1 loss的定義以下:

其中1(x)表示的是指示函數。

>>> 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) 1

在多標籤的問題上,若是使用二元標籤指示器,第一個標籤集[0,1]具備一個error:

>>> 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

示例:

4. Multilabel的ranking metrics

在多標籤學習上,每一個樣本都具備多個真實值label與它對應。它的目的是,爲真實值label獲得最高分或者最好的rank。

4.1 範圍偏差(Coverage error)

coverage_error計算了那些必須在最終預測(全部真實的label都會被預測)中包含的labels的平均數目。若是你想知道有多少top高分labels(top-scored-labels)時它會頗有用,你必須以平均的方式進行預測,不漏過任何一個真實label。該metrics的最優值是對真實label求平均。

給定一個真實label的二分類指示矩陣:

以及每一個label相關的分值:

相應的範圍偏差定義以下:

其中:。給定rank定義,經過給出最大的rank,來打破y_scores。

示例以下:

>>> 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.5

4.2 Label ranking平均準確率

label_ranking_average_precision_score函數實現了Label ranking平均準確率 :LRAP(label ranking average precision)。該metric與average_precision_score有關聯,但它基於label ranking的概念,而非precision/recall。

LRAP會對每一個樣本上分配的真實label進行求平均,真實值的比例 vs. 低分值labels的總數。若是你能夠爲每一個樣本相關的label給出更好的rank,該指標將產生更好的分值。獲得的score一般都會比0大,最佳值爲1。若是每一個樣本都只有一個相關聯的label,那麼LRAP就與平均倒數排名:mean reciprocal rank

給定一個true label的二元指示矩陣,,每一個label相對應的分值:,平均準確率的定義以下:

其中:

  • 是l0 範式或是數據集的基數。

該函數的示例:

>>> 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...

4.3 Ranking loss

label_ranking_loss函數用於計算ranking loss,它會對label對沒有正確分配的樣本進行求平均。例如:true labels的分值比false labels的分值小,或者對true/false label進行了相反的加權。最低的ranking loss爲0.

給定一個true labels的二元指示矩陣:,每一個label相關的分值爲:,ranking loss的定義以下:

其中 爲l0範式或數據集基數。

示例:

>>> 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... >>> y_score = np.array([[1.0, 0.1, 0.2], [0.1, 0.2, 0.9]]) >>> label_ranking_loss(y_true, y_score) 0.0

5.迴歸metrics

sklearn.metrics 實現了許多種loss, score,untility函數來測評迴歸的性能。其中有一些能夠做了增長用於處理多輸出(multioutput)的狀況:

這些函數具備一個multioutput關鍵參數,它指定了對於每個單獨的target是否須要對scores/loss進行平均。缺省值爲’uniform_average’,它會對結果進行均勻加權平均。若是輸出的ndarray的shape爲(n_outputs,),那麼它們返回的entries爲權重以及相應的平均權重。若是multioutput參數爲’raw_values’,那麼全部的scores/losses都不改變,以raw的方式返回一個shape爲(n_outputs,)的數組。

r2_score和explained_variance_score 對於multioutput參數還接受另外一個額外的值:’variance_weighted’。該選項將經過相應target變量的variance產生一個爲每一個單獨的score加權的值。該設置將會對全局捕獲的未歸一化的variance進行量化。若是target的variance具備不一樣的規模(scale),那麼該score將會把更多的重要性分配到那些更高的variance變量上。

對於r2_score的缺省值爲multioutput=’variance_weighted’,向後兼容。後續版本會改爲uniform_average。

5.1 可釋方差值(Explained variance score)

explained_variance_score解釋了explained variance regression score

若是是估計的target輸出,y爲相應的真實(correct)target輸出,Var爲求方差(variance),即標準差的平方,那麼可釋方差(explained variance)的估計以下:

最好的可能值爲1.0,越低表示越差。

示例以下:

>>> 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...

5.2 平均絕對偏差(Mean absolute error)

mean_absolute_error函數將會計算平均絕對偏差,該指標對應於絕對偏差loss(absolute error loss)或l1範式loss(l1-norm loss)的指望值。

若是是第i個樣本的預測值,yi是相應的真實值,那麼在上的平均絕對偏差(MAE)的定義以下:

示例:

>>> 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.849...

5.3 均方偏差(Mean squared error)

mean_squared_error用於計算平均平方偏差,該指標對應於平方(二次方)偏差loss(squared (quadratic) error loss)的指望值。

示例爲:

>>> 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...

示例:

5.4 中值絕對偏差(Median absolute error)

median_absolute_error是很使人感興趣的,它對異類(outliers)的狀況是健壯的。該loss函數經過計算target和prediction間的絕對值,而後取中值獲得。

MedAE的定義以下:

median_absolute_error不支持multioutput。

示例:

>>> 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.5

5.5 R方值,肯定係數

r2_score函數用於計算R²(肯定係數:coefficient of determination)。它用來度量將來的樣本是否可能經過模型被很好地預測。分值爲1表示最好,它能夠是負數(由於模型能夠很糟糕)。一個恆定的模型老是能預測y的指望值,忽略掉輸入的feature,獲得一個R^2爲0的分值。

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) 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...

示例:

6.聚類metrics

sklearn.metrics也提供了聚類的metrics。更多細節詳見:

7. Dummy estimators

當進行監督學習時,一個簡單明智的check包括:使用不一樣的規則比較一個estimator。DummyClassifier實現了三種簡單的策略用於分類:

  • stratified:根據訓練集的分佈來生成隨機預測
  • most_frequent:在訓練集中老是預測最頻繁的label
  • prior:老是預測分類最大化分類優先權(好比:most_frequent),predict_proba返回分類優化權
  • uniform:以均勻方式隨機生成預測
  • constant:由用戶指定,老是預測一個常量的label。該方法的一個最主要動機是:F1-scoring,其中正例是最主要的。

注意,全部的這些策略中,predict方法會完成忽略輸入數據!

示例,咱們首先建立一個imbalanced的數據集:

>>> from sklearn.datasets import load_iris >>> from sklearn.cross_validation import train_test_split >>> iris = load_iris() >>> X, y = iris.data, iris.target >>> y[y != 1] = -1 >>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

下一步,比較下SVC的accuary和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(constant=None, random_state=0, strategy='most_frequent') >>> clf.score(X_test, y_test) 0.57...

咱們能夠看到SVC並不比DummyClassifier好不少,接着,咱們換下kernel:

>>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train) >>> clf.score(X_test, y_test) 0.97...

咱們能夠看到,accuracy加強到了幾乎100%。若是CPU開銷不大,這裏建議再作下cross-validation。若是你但願在參數空間進行優化,咱們強烈推薦你使用GridSearchCV。

更通常的,分類器的accuracy太接近於隨機,這可能意味着有可能會出問題:features沒有用,超參數沒有被正確設置,分類器所用的數據集imbalance,等等。。。

DummyRegressor也實現了4種簡單的方法:

  • mean:一般預測訓練target的均值。
  • median:一般預測訓練target的中值。
  • quantile:預測由用戶提供的訓練target的分位數
  • constant:常量

在上面的全部策略,predict徹底忽略輸入數據。

參考:

http://scikit-learn.org/stable/modules/model_evaluation.html

相關文章
相關標籤/搜索