有三種不一樣的方法來評估一個模型的預測質量:html
模型選擇和評估工具,例如: grid_search.GridSearchCV 和 cross_validation.cross_val_score,使用scoring參數來控制你的estimator的好壞。python
對於大多數case而說,你能夠設計一個使用scoring參數的scorer對象;下面展現了全部可能的值。全部的scorer對象都遵循:高得分,更好效果。若是從mean_absolute_error 和mean_squared_error(它計算了模型與數據間的距離)返回的得分將被忽略。git
sklearn.metric提供了一些函數,用來計算真實值與預測值之間的預測偏差:數組
接下去會討論多種機器學習當中的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
下例使用定製的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...
你能夠生成更靈活的模型scorer,經過從頭構建本身的scoring對象來完成,不須要使用make_scorer工廠函數。對於一個本身實現的scorer來講,它須要遵循兩個原則:函數
sklearn.metrics模塊實現了一些loss, score以及一些工具函數來計算分類性能。一些metrics可能須要正例、置信度、或二分決策值的的機率估計。大多數實現容許每一個sample提供一個對總體score來講帶權重的分佈,經過sample_weight參數完成。
一些二分類(binary classification)使用的case:
一些多分類(multiclass)使用的case:
一些多標籤(multilabel)的case:
還有一些能夠同時用於二標籤和多標籤(不是多分類)問題:
在如下的部分,咱們將討論各個函數。
對於二分類來講,必須定義一些matrics(f1_score,roc_auc_score)。在這些case中,缺省只評估正例的label,缺省的正例label被標爲1(能夠經過配置pos_label參數來完成)
將一個二分類matrics拓展到多分類或多標籤問題時,咱們能夠將數據當作多個二分類問題的集合,每一個類都是一個二分類。接着,咱們能夠經過跨多個分類計算每一個二分類metrics得分的均值,這在一些狀況下頗有用。你可使用average參數來指定。
多分類(multiclass)數據提供了metric,和二分類相似,是一個label的數組,而多標籤(multilabel)數據則返回一個索引矩陣,當樣本i具備label j時,元素[i,j]的值爲1,不然爲0.
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
函數cohen_kappa_score計算了Cohen’s kappa估計。這意味着須要比較經過不一樣的人工標註(numan annotators)的標籤,而非分類器中正確的類。
kappa score是一個介於(-1, 1)之間的數. score>0.8意味着好的分類;0或更低意味着很差(實際是隨機標籤)
Kappa score能夠用在二分類或多分類問題上,但不適用於多標籤問題,以及超過兩種標註的問題。
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]])
結果爲:
示例:
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
示例:
hamming_loss計算了在兩個樣本集裏的平均漢明距離或平均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
在多標籤(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.
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
準確率(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值:
注意:precision_recall_curve只用於二分類中。而average_precision_score可用於二分類或multilabel指示器格式
示例:
在二元分類中,術語「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...
在多分類(Multiclass)和多標籤(multilabel)分類問題上,precision, recall, 和 F-measure的概念能夠獨立應用到每一個label上。有一些方法能夠綜合各標籤上的結果,經過指定average_precision_score (只能用在multilabel上), f1_score, fbeta_score, precision_recall_fscore_support, precision_score 和 recall_score這些函數上的參數average能夠作到。
注意:
能夠考慮下面的概念:
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...
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...
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是非負的。
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...
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)問題上。若是預測的輸出已經被二值化。
示例:
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
示例:
在多標籤學習上,每一個樣本都具備多個真實值label與它對應。它的目的是,爲真實值label獲得最高分或者最好的rank。
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
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相對應的分值:
,平均準確率的定義以下:
其中:
該函數的示例:
>>> 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...
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
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。
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...
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...
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...
示例:
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
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...
示例:
sklearn.metrics也提供了聚類的metrics。更多細節詳見:
當進行監督學習時,一個簡單明智的check包括:使用不一樣的規則比較一個estimator。DummyClassifier實現了三種簡單的策略用於分類:
注意,全部的這些策略中,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種簡單的方法:
在上面的全部策略,predict徹底忽略輸入數據。
參考:
http://scikit-learn.org/stable/modules/model_evaluation.html