3個(gè)不同的API可供評(píng)估模型預(yù)測(cè)質(zhì)量:
最后,Dummy評(píng)估器(Dummy 評(píng)估器)可用于獲取隨機(jī)預(yù)測(cè)的這些指標(biāo)基準(zhǔn)值。
還可參見:對(duì)于“成對(duì)”指標(biāo),樣本之間而不是評(píng)估器或者預(yù)測(cè)值之間,詳見成對(duì)度量、親和力和核函數(shù)部分。
模型選擇和評(píng)估使用的工具,如model_selection, GridSearchCV和model_selection.cross_val_score,使用scoring參數(shù)控制對(duì)評(píng)估器的估計(jì)量應(yīng)用的指標(biāo)。
在最常見的例子中,可以給scoring參數(shù)指定評(píng)分對(duì)像;下面的表格列出所有可能取值。所有記分對(duì)象遵從的慣例是:高返回值好于低返回值。因此,如metrics.mean_squared_error,衡量模型與數(shù)據(jù)間差距的指標(biāo)可用neg_mean_squared_error,它返回一個(gè)負(fù)值。
評(píng)分 | 函數(shù) | 評(píng)論 |
---|---|---|
分類 | ||
"accuracy"(準(zhǔn)確率) | metrics.accuracy_score | |
"balanced_accuracy" (平衡準(zhǔn)確率) | metrics.balanced_accuracy_score | |
"average_precision"(平均精確率) | metrics.average_precision_score | |
"neg_birer_score"(負(fù)福萊爾評(píng)分) | metrics.brier_score_loss | |
"f1" | metrics.f1_score | 二分類 |
"f1_micro" | metrics.f1_score | 微平均 |
"f1_macro" | metrics.f1_score | 宏平均 |
"f1_weighted" | metrics.f1_score | 加權(quán)平均 |
"f1_samples" | metrics.f1_score | 多標(biāo)簽樣本 |
"neg_log_loss" | metrics.log_loss | 要求predict_proba支持 |
"precision" 等 | metrics_precision_score | 后綴適用于“f1” |
"recall" 等 | metrics.recall_score | 后綴適用于“f1” |
"jaccard" 等 | metrics.jaccard_score | 后綴適用于“f1” |
"roc_auc" | metrics.roc_auc_score | |
"roc_acu_ovr" | metrics.roc_auc_score | |
"roc_auc_ovo" | metrics.roc_auc_score | |
"roc_auc_ovr_weighted" | metrics.roc_auc_score | |
"roc_auc_ovo_weighted" | metrics.roc_auc_score | |
聚類 | ||
"adjusted_mutual_info_score" | metrics.adjusted_mutual_info_score | |
"adjusted_rand_score" | metrics.adjusted_rand_score | |
"completeness_score" | metrics.completeness_score | |
"fowlkes_mallows_score" | metrics.fowlkes_mallows_score | |
"homogeneity_score" | metrics.homogeneity_score | |
"mutual_info_score" | metrics.mutual_info_score | |
"normalized_mutual_info_score" | metrics.normalized_mutual_info_score | |
"v_measure_score" | metrics.v_measure_score | |
回歸 | ||
"explained_variance" | metrics.explained_variance_score | |
"max_error" | metrics.max_error | |
"neg_mean_absolute_error" | metrics.mean_absolute_error | |
"neg_root_mean_squared_error" | metrics.mean_squared_error | |
"neg_mean_squared_log_error" | metrics.mean_squared_log_error | |
"neg_median_absolute_error" | metrics.median_absolute_error | |
"r2" | metrics.r2_score | |
"neg_mean_poisson_deviance" | metrics.mean_poisson_deviance | |
"neg_mean_gamma_deviance" | metrics.mean_gamma_deviance |
示例:
>>> 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 va
注意: ValueError列出的異常值對(duì)應(yīng)于以下各節(jié)中說明的測(cè)量預(yù)測(cè)準(zhǔn)確性函數(shù)。這些函數(shù)中的評(píng)分對(duì)象以字典形式存儲(chǔ)在sklearn.metrics.SCORES中。
sklearn.metrics模塊公開一組簡(jiǎn)單函數(shù),該函數(shù)可應(yīng)用于測(cè)量給定真實(shí)值和預(yù)測(cè)值的預(yù)測(cè)誤差:
各類機(jī)器學(xué)習(xí)任務(wù)的可用指標(biāo)會(huì)在下文詳細(xì)介紹。
許多指標(biāo)沒有給定名稱就作為scoring的參數(shù)值,有時(shí)是因?yàn)樗鼈冃枰~外的參數(shù),例如fbeta_score。使用make_scorer是生成可調(diào)用對(duì)象進(jìn)行評(píng)分的最簡(jiǎn)單方法,該函數(shù)將指標(biāo)轉(zhuǎn)換為可用于模型評(píng)估的可調(diào)用對(duì)象。
一個(gè)典型的例子是從庫中包含一個(gè)非默認(rèn)參數(shù)值中,包裝現(xiàn)有指標(biāo)函數(shù),例如fbeta_score函數(shù)用來定義beta參數(shù):
>>> 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)
第二個(gè)例子是在簡(jiǎn)單python函數(shù)中使用make_scorer,以構(gòu)建完全自定義評(píng)分對(duì)像,它可以接受幾個(gè)參數(shù):
如下示例展示構(gòu)建傳統(tǒng)評(píng)分器,使用greater_is_better參數(shù):
>>> 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 will negate the return value of my_custom_loss_func,
>>> # which will be np.log(2), 0.693, given the values for X
>>> # and y defined below.
>>> 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...
無需使用make_scorer “制造廠”,就可以通過從頭構(gòu)建自定義評(píng)分對(duì)象,生成更加靈活的模型評(píng)分器。對(duì)于一個(gè)可調(diào)用的評(píng)分器,需要滿足如下兩個(gè)規(guī)定協(xié)議:
注意:當(dāng)n_jobs>1時(shí),函數(shù)中對(duì)傳統(tǒng)評(píng)分器的使用
雖然在調(diào)用函數(shù)的旁邊定義自定義評(píng)分函數(shù)應(yīng)使用默認(rèn)joblib backend(loky),但從另一個(gè)模塊中導(dǎo)入時(shí)將會(huì)是更健壯的方法,并且獨(dú)立于joblib backend(loky)。
例如,下例中將n_jobs設(shè)置為大于1,custom_scoring_function保存在user_created模塊(custom_scorer_module.py)中并導(dǎo)入:
>>> 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)
Scikit-learn也允許在GridSearchCV,RandomizedSearchCV和cross_validate中評(píng)估多指標(biāo)。
有兩種方式可以指定scoring參數(shù)的多評(píng)分指標(biāo):
>>> scoring = ['accuracy', 'precision']
>>> from sklearn.metrics import accuracy_score
>>> from sklearn.metrics import make_scorer
>>> scoring = {'accuracy': make_scorer(accuracy_score),
... 'prec': 'precision'}
需要注意的是:字典的值或者是評(píng)分器函數(shù),或者是預(yù)定義指標(biāo)字符串的一個(gè)。
目前,只有返回單值的評(píng)分函數(shù)才能使用字典傳遞。 評(píng)分函數(shù)返回多個(gè)值是不被允許的,并且要求封裝從而返回單個(gè)指標(biāo)值。
>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import confusion_matrix
>>> # A sample toy binary classification dataset
>>> 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)
>>> # Getting the test set true positive scores
>>> print(cv_results['test_tp'])
[10 9 8 7 8]
>>> # Getting the test set false negative scores
>>> print(cv_results['test_fn'])
[0 1 2 3 2]
sklearn.metrics模塊執(zhí)行各種損失函數(shù),評(píng)分,及調(diào)用函數(shù)測(cè)量分類模型的表現(xiàn)。一些指標(biāo)可能要求正類別的可能性(probability)估計(jì),置信度值,或者二分類決策值。大多數(shù)執(zhí)行允許計(jì)算每一個(gè)樣本對(duì)評(píng)分的權(quán)重貢獻(xiàn),通過sample_weight參數(shù)實(shí)現(xiàn)。
其中一些只適用于二分類的案例中:
參數(shù) | 說明 |
---|---|
precision_recall_curve(y_true, probs_pred, *) | 根據(jù)不同的可能性閾值計(jì)算精確率-召回率 |
roc_curv(y_true, y_score, *[, pos_label, ...]) | 計(jì)算Receiver operating characteristic(ROC) |
其它也可用于多分類的參數(shù)例子:
參數(shù) | 說明 |
---|---|
balanced_accuracy_score(y_true, y_pred, *) | 計(jì)算balanced準(zhǔn)確率 |
cohen_kappa_score(y1, y2, *[, labels, ...]) | Cohen's kappa:衡量注一致程度的統(tǒng)計(jì) |
confusion_matrix(y_true, y_pred, *[, ...]) | 計(jì)算混淆矩陣來評(píng)估分類模型的準(zhǔn)確率 |
hinge_loss(y_true, pred_decision, *[, ...]) | 平均hinge損失(非正規(guī) non-regularized) |
matthews_corrcoef(y_true, y_pred, *[, ...]) | 計(jì)算曼哈頓相關(guān)系數(shù)(MCC) |
roc_auc_score(y_true, y_score, *[, ...] | 從預(yù)測(cè)分?jǐn)?shù)中,計(jì)算ROC曲線的面積(ROC AUC) |
一些也可以用于多分類例子中的參數(shù):
參數(shù) | 說明 |
---|---|
accuracy_score(y_true, y_pred, *[, ...]) | 分類模型的準(zhǔn)確率得分 |
classification_report(y_true, y_pred, *[, ...]) | 主要分類模型指標(biāo)的文本報(bào)告 |
f1_score(y_true, y_pred, *[, labels, ...]) | 計(jì)算F1評(píng)分,也被稱為balanced F-score或者F-measure |
fbeta_score(y_true, y_pred, *, beta[, ...]) | 計(jì)算F-beta評(píng)分 |
hamming_loss(y_true, y_pred, *[, sample_weight]) | 計(jì)算平均Hamming損失 |
jaccard_score(y_true, y_pred, *[, labels, ...]) | Jaccard相似性系數(shù)得分 |
log_loss(y_true, y_pred, *[, eps, ...]) | 對(duì)數(shù)損失,aka logistic損失或者交叉熵?fù)p失 |
multilabel_confusion_matrix(y_true, y_pred, *) | 為每一個(gè)類或樣本計(jì)算混淆矩陣 |
precision_recall_fscore_support(y_true, ...) | 計(jì)算精確率,召回率,F(xiàn)-measure并且支持每一個(gè)類 |
precision_score(y_true, y_pred, *[, ...]) | 計(jì)算精確率 |
recall_score(y_true, y_pred, *[, labels, ...]) | 計(jì)算召回率 |
roc_auc_score(y_true, y_score, *[, ...]) | 從預(yù)測(cè)分?jǐn)?shù)中計(jì)算ROC曲線的面積 |
zero_one_loss(y_true, y_pred, *[, ...]) | 0-1分類損失 |
可以處理二分類和多標(biāo)簽(不是多分類)的問題:
參數(shù) | 說明 |
---|---|
average_precision_score(y_true, y_score, *) | 從預(yù)測(cè)評(píng)分中計(jì)算平均精確率(AP) |
在隨后的各子部分中,將會(huì)描述每一個(gè)上述函數(shù),使用常用的API和指數(shù)定義。
一些指標(biāo)本質(zhì)上是定義給二分類模型的(例如:f1_score)。在這些例子中,模型的默認(rèn)值是只有正標(biāo)簽會(huì)被評(píng)估,假設(shè)正樣本類的標(biāo)簽為1是初始值(盡管標(biāo)簽可以通過pos_label參數(shù)進(jìn)行修改)。
由二分類指標(biāo)延伸到多類或者多標(biāo)簽問題,數(shù)據(jù)被當(dāng)作是二分類問題的集合,每個(gè)類都有一個(gè)。有一系列的方法可用于計(jì)算類集合的平均二分類指標(biāo),每個(gè)二分類指標(biāo)可以應(yīng)用于某些領(lǐng)域中。如果需要,可以使用average參數(shù)進(jìn)行定義。
當(dāng)多分類數(shù)據(jù)作為類標(biāo)簽數(shù)組提供給指標(biāo)時(shí),如二分類標(biāo)簽,多標(biāo)簽數(shù)據(jù)就會(huì)被指定為一個(gè)指標(biāo)矩陣。 如元素(一個(gè)列表形式)[i, j],如果樣本i被標(biāo)記為j,則其值為1,否則為0。
accuracy_score函數(shù)計(jì)算accuracy(準(zhǔn)確率),或者是個(gè)分?jǐn)?shù)(初始值)或者是正確預(yù)測(cè)個(gè)數(shù)的計(jì)數(shù)(normalize=False)。
在多標(biāo)簽分類中,函數(shù)返回各子集的準(zhǔn)確率。如果整個(gè)集合中每一個(gè)樣本的預(yù)測(cè)標(biāo)簽嚴(yán)格匹配集合中的標(biāo)簽真實(shí)值,子集的準(zhǔn)確率是1.0;否則是0.0。
如果是第i個(gè)樣本的預(yù)測(cè)值與真實(shí)值相一致,對(duì)
個(gè)樣本正確預(yù)測(cè)的分?jǐn)?shù)值是:其中*l(x)*是指標(biāo)函數(shù)(indicator function)。
>>> 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
在帶有二分類標(biāo)簽指標(biāo)的多標(biāo)簽例子中:
>>> accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))
0.5
例如:
balanced_accuracy_score函數(shù)計(jì)算balanced accuracy,避免了對(duì)不平衡數(shù)據(jù)集進(jìn)行夸大的性能估計(jì)。每個(gè)類別召回率的宏平均,或者等同于每個(gè)樣本根據(jù)真實(shí)類別的比率(inverse prevalence)的權(quán)重,而計(jì)算的原始準(zhǔn)確率。因此,對(duì)于平衡樣本,平衡的準(zhǔn)確率評(píng)分(Balanced accuracy score)與準(zhǔn)確率相同。
在二分類的例子中,平衡的準(zhǔn)確率與靈敏度(sensitivity)相同(真正率)和特異性(specificity)(真負(fù)率),或者ROC曲線的面積(二分類預(yù)測(cè)值而不是分?jǐn)?shù)):
如果分類器在每個(gè)類的表現(xiàn)都很好,則該函數(shù)會(huì)退化為傳統(tǒng)的準(zhǔn)確率(例如:正確預(yù)測(cè)的個(gè)數(shù)除以總預(yù)測(cè)樣本數(shù))。
與之相對(duì)比,如果傳統(tǒng)的準(zhǔn)確率高于樣本比例,僅因?yàn)榉诸惼骼玫氖遣痪鉁y(cè)試集,而對(duì)于平衡的準(zhǔn)確率,會(huì)下降為
。分?jǐn)?shù)范圍為0-1,或者當(dāng)參數(shù)adjusted=True時(shí),范圍變?yōu)?span id="rbpi9au" class="span-block-equation" style="cursor:pointer">
到1,包括邊界的,隨機(jī)得分表現(xiàn)為0。如果是第i個(gè)樣本的真實(shí)值,是對(duì)應(yīng)的樣本權(quán)重,從而調(diào)整的樣本權(quán)重為:
其中,l(x)是指標(biāo)函數(shù)。根據(jù)樣本i的預(yù)測(cè)值,平衡的準(zhǔn)確率被定義如下:
設(shè)置adjusted=True,平衡的準(zhǔn)確率報(bào)告的是比相對(duì)高的值。在二分類的例子中,也被稱為*Youden's J statistic*或者informedness。
**注意:**多分類的定義看起來是用于二分類指標(biāo)的合理延伸,盡管在文獻(xiàn)中未達(dá)成共識(shí)。
參考:
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.
Urbanowicz2015Urbanowicz R.J., Moore, J.H. ExSTraCS 2.0: description and evaluation of a scalable learning classifier system, Evol. Intel. (2015) 8: 89.
cohen_kappa_score函數(shù)計(jì)算Cohen's kappa統(tǒng)計(jì)值。此度量旨在比較不同標(biāo)注的標(biāo)簽,而分類器和真實(shí)數(shù)據(jù)的比較。
Kappa score(參見文檔字符串)是一個(gè)數(shù)值,介于-1和1之間。分?jǐn)?shù)大于0.8會(huì)被認(rèn)為是好的協(xié)議;小于0說明沒有協(xié)議(等同于隨機(jī)標(biāo)簽)。
Kappa score可被用于計(jì)算二分類或者多分類的問題,但不適用于多標(biāo)簽的問題(除手動(dòng)計(jì)算每一個(gè)標(biāo)簽分?jǐn)?shù))和多于兩個(gè)以上注釋器的問題。
>>> 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.4285714285714286
confusion_matrix函數(shù)評(píng)估分類模型準(zhǔn)確率,通過計(jì)算每一行相對(duì)應(yīng)真實(shí)類別(維基百科或者其它資料可能使用不同的軸向)的混淆矩陣(confusion matrix)。
根據(jù)定義, 混淆矩陣中的條目i,j是實(shí)際為i,但是預(yù)測(cè)為j的觀測(cè)個(gè)數(shù)。
如下示例:
>>> 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可被用于展示混淆矩陣的可視化,在混淆矩陣的例子中,如下圖所示:
參數(shù)normalize允許報(bào)告比例而不僅是計(jì)數(shù)。混淆矩陣可以通過3種方式被規(guī)范化:"pred", "true", 和"all",這些參數(shù)將計(jì)算方式區(qū)分為按列求和,按行求和,或者整個(gè)矩陣求和。
>>> 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]])
對(duì)于二分類問題,可以得到真負(fù)值計(jì)數(shù),假正值計(jì)數(shù),假負(fù)值計(jì)數(shù)和真正值計(jì)數(shù),詳見如下代碼:
>>> 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)
例如:
classification_report函數(shù)輸出一個(gè)文本報(bào)告,顯示主要分類模型的評(píng)估指標(biāo)。如下是一個(gè)自定義target_names和推斷標(biāo)簽的例子:
>>> 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 5
weighted avg 0.67 0.60 0.59 5
例如:
Hamming_loss 計(jì)算平均的Hamming loss或者Hamming distance在兩個(gè)樣本的集合中。
如果是某個(gè)樣本第j個(gè)標(biāo)簽的預(yù)測(cè)值,是其對(duì)應(yīng)的真實(shí)值,
是類別或者標(biāo)簽個(gè)是,Hamming損失函數(shù)介于兩個(gè)樣本之間:其中,*l(x)*是指標(biāo)函數(shù)(indicator function)。
>>> 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
在二分類標(biāo)簽指標(biāo)的多分類標(biāo)簽中:
>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))
0.75
**注意:**在多分類的分類模型中,y_true和y_pred的Hamming損失函數(shù)與Hamming距離相一致,Hamming損失函數(shù)與零一損失函數(shù)(Zero one loss)相類似。但是零-一損失函數(shù)懲罰預(yù)測(cè)集合,預(yù)測(cè)集不與真實(shí)值集直接匹配,Hamming損失函數(shù)懲罰單個(gè)標(biāo)簽。因次,Hamming損失函數(shù)的上限是零一損失函數(shù),它介于零和一之間,包括邊界;預(yù)測(cè)真實(shí)標(biāo)簽合適的子集或者超子集會(huì)使Hamming損失函數(shù)界于零和一之間,不包括邊界。
直觀地說,精確率(precision)是模型區(qū)分的能力,而不是將樣本為負(fù)的標(biāo)簽標(biāo)記為正,而召回率(recall)是找到正樣本的能力。
F-measure(和測(cè)量)可被解釋為精確率和召回率的權(quán)重調(diào)和平均數(shù)。測(cè)量值最高為1,最差為0。當(dāng)時(shí),和是相等的,并且召回率和精確率是同等重要的。
precision_recall_curve從真實(shí)標(biāo)簽和評(píng)分(不同閾值設(shè)定下,分類器的評(píng)分)計(jì)算一個(gè)精確率-召回率曲線.
average_precision_score函數(shù)從預(yù)測(cè)分?jǐn)?shù)中計(jì)算平均精確率(average precision(AP))。該值介于0和1之間,且越高越好。AP的定義如下:
其中,和是在第n個(gè)閾值下的精確率和召回率,AP是正樣本的分?jǐn)?shù)。
參考[Manning2008]和[Everingham2010]展現(xiàn)AP的替代變體,它差值計(jì)算精確率-召回率曲線。 目前,average_precision_score并不能執(zhí)行各種差值的變體。參考[Davis2006]和[Flach2015]描述了為何精確率-召回率曲線上點(diǎn)的線性插值產(chǎn)生的結(jié)果是過于樂觀的分類器表現(xiàn)測(cè)量。線性插值被用于計(jì)算帶有梯形法則的ROC曲線面積,即auc。
以下函數(shù)提供對(duì)精確率,召回率和F-measure評(píng)分的解釋:
參數(shù) | 解釋 |
---|---|
average_precision_score(y_true, y_score,*) | 從預(yù)測(cè)評(píng)分中計(jì)算平均精確率 |
f1_score(y_true, y_pred, *[labels, ...]) | 計(jì)算F1評(píng)分,也被稱為均衡的F-score或F-measure |
fbeta_score(y_true, y_pred, *, beta[, ...]) | 計(jì)算F-beta評(píng)分 |
precision_recall_curve(y_true, probas_pred, *) | 計(jì)算在不同的閾值下精確率-召回率組合 |
precision_recall_fscore_support(y_true, ...) | 計(jì)算精確率,召回率,F(xiàn)-measure,且支持對(duì)每一類的計(jì)算 |
precision_score(y_true, y_pred, *[, ...]) | 計(jì)算精確率 |
recall_score(y_true, y_pred, *[, labels, ...]) | 計(jì)算召回率 |
需要注意的是:precision_recall_curve函數(shù)只能用于二分類的例子中。average_precision_score函數(shù)可以用于二分類的分類模型和多標(biāo)簽形式。plot_precision_recall_curve函數(shù)畫出精確率召回率關(guān)系圖,如下所示。
例如:
參考:
[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.
在二分類分類模型中,分類預(yù)測(cè)中的“正”和“負(fù)”,“真”和“假”指的是預(yù)測(cè)值是否與外部評(píng)判(也作“觀測(cè)值”)相一致?;谶@些定義,可以總結(jié)一下表格:
實(shí)際類別(觀測(cè)值) | 實(shí)際類別(觀測(cè)值) | |
---|---|---|
預(yù)測(cè)類別(期望) | tp(真正)正確的結(jié)果 | fp(假正)意料外的結(jié)果 |
預(yù)測(cè)類別(期望) | fn(假負(fù))錯(cuò)誤的結(jié)果 | tn(真負(fù))正確未出現(xiàn)的結(jié)果 |
基于上文,可以定義精確率,召回率和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.83...
在多分類和多標(biāo)簽分類任務(wù)中,精確率,召回率,和F-measures的定義可以應(yīng)用于每一個(gè)獨(dú)立的標(biāo)簽。有很多方法可以將各標(biāo)簽的結(jié)果進(jìn)行組合,可用average參數(shù)分別在average_precision_score(僅用于多標(biāo)簽),f1_score,fbeta_score,precision_recall_support,precision_score和recall_score函數(shù)中傳遞,已在以上描述(above)。需要注意的是:如果所有的標(biāo)簽啊都包括在內(nèi),那么“micro”-averaging(“微”-平均)在多分類中的設(shè)置將產(chǎn)生精確率,召回率和F與準(zhǔn)確率的結(jié)果相等。也要注意"權(quán)重"平均可能產(chǎn)生不介于精確率和召回率之間的F-score。
為了更清晰的了解,請(qǐng)考慮如下概念:
各指標(biāo)定義如下:
average | Precision | Recall | F_beta |
---|---|---|---|
"micro" | |||
"samples" | |||
"macro" | |||
"weighted" | |||
None |
>>> 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]...))
對(duì)于帶有“負(fù)類”的多分類類別,可以除去一些標(biāo)簽:
>>> metrics.recall_score(y_true, y_pred, labels=[1, 2], average='micro')
... # excluding 0, no labels were correctly recalled
0.0
同樣地,一些未在樣本中出現(xiàn)的標(biāo)簽,可以考慮使用宏-平均(macro-averaging)。
>>> metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro')
0.166...
jacquard_score函數(shù)計(jì)算Jaccard similarity coefficients(Jaccard相似性系數(shù))的均值,也被稱為Jaccard指數(shù),在標(biāo)簽對(duì)的集合中。
第i個(gè)樣本的Jaccard相似性系數(shù),與真實(shí)標(biāo)簽和預(yù)測(cè)標(biāo)簽的定義如下:
jaccard_score與precision_recall_fscore_support的作用類似,應(yīng)用于二分類標(biāo)簽,并且通過使用參數(shù)average可以擴(kuò)展到多標(biāo)簽和多分類(詳見above)。
在二分類例子中:
>>> 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...
用二分類標(biāo)簽指標(biāo)的多標(biāo)簽例子:
>>> 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_phred, average=None)
array([0.5, 0.5, 1. ])
多分類問題被二分類化,并且與多標(biāo)簽問題的解決方法一致:
>>> 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...
hinge_loss函數(shù)指通過使用hinge loss方法計(jì)算模型和數(shù)據(jù)之間的平均距離,它是一個(gè)單邊指數(shù),即僅考慮預(yù)測(cè)誤差。(Hinge loss被用于最大化邊際分類器,如支持向量機(jī)。)
如果標(biāo)簽被編碼為+1和-1,y:是真實(shí)值,w是預(yù)測(cè)決策,是decision_function的產(chǎn)出值,hinge loss被定義如下:
如果多于兩個(gè)標(biāo)簽,根據(jù)Crammer & Singer,hinge_loss使用多分類變體。詳見論文鏈接。
如果是真實(shí)樣本的預(yù)測(cè)決策,是所有樣本預(yù)測(cè)決策的最大值,預(yù)測(cè)決策是預(yù)測(cè)函數(shù)的返回值,多分類hinge loss的定義如下:
如下是用帶有hinge_loss函數(shù)的支持向量機(jī)分類器解決的二分類問題的小例子:
>>> 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_decision
array([-2.18..., 2.36..., 0.09...])
>>> hinge_loss([-1, 1, 1], pred_decision)
0.3...
如下是用帶有hinge_loss函數(shù)的支持向量機(jī)分類器解決多分類問題的小例子:
>>> 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...
對(duì)數(shù)損失函數(shù),也被稱作邏輯回歸損失函數(shù)或者交叉熵?fù)p失函數(shù),是基于可能性的估計(jì)值。它被廣泛應(yīng)用于(多項(xiàng)式)邏輯回歸和神經(jīng)網(wǎng)絡(luò)模型中,以及一些計(jì)算期望最大化的變種模型,并且被用于評(píng)估一個(gè)分類器而不是離散預(yù)測(cè)值的可能性產(chǎn)出(predict_proba)。
對(duì)于帶有真實(shí)標(biāo)簽二分類分類模型和一個(gè)可能性估計(jì),每個(gè)樣本的對(duì)數(shù)損失函數(shù)是給定真實(shí)標(biāo)簽分類器的負(fù)對(duì)數(shù)似然值:
它延伸到多分類的例子如下所示。樣本中的真實(shí)標(biāo)簽可以被編碼為1-of-K 二分類指標(biāo)矩陣 Y,例如:如果樣本i的標(biāo)簽k是從標(biāo)簽集合K中提取的。通過,讓P成為可能性估計(jì)矩陣。對(duì)數(shù)損失函數(shù)的集合就是:
如想詳細(xì)了解上述二分類對(duì)數(shù)損失函數(shù)是如何生成的,需要注意在二分類的例子中,和,所以給出二分類對(duì)數(shù)損失函數(shù),需要擴(kuò)展的內(nèi)部和。
提供真實(shí)標(biāo)簽值的列表和可能性矩陣,log_loss函數(shù)計(jì)算對(duì)數(shù)損失函數(shù),會(huì)通過估計(jì)器的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參數(shù)列表[.9, .1]中的第一個(gè)值表示第一個(gè)樣本被標(biāo)記為0的可能性為90%。對(duì)數(shù)損失函數(shù)是非負(fù)的。
對(duì)于二分類,matters_corrcoef函數(shù)計(jì)算的是Matthew's correlation coefficient (MCC)。 下面引用自維基百科:
“馬修斯相關(guān)系數(shù)被用于機(jī)器學(xué)習(xí)是作為測(cè)量二分類(兩類)分類模型質(zhì)量的評(píng)估。它考慮真正,假正,真負(fù)和假負(fù),并且被認(rèn)為是一個(gè)平衡值,可被用于類大小不均衡的數(shù)據(jù)。馬修斯相關(guān)系數(shù)(MCC)本質(zhì)上是一個(gè)介于-1和+1之間的相關(guān)系數(shù)值。如果系數(shù)值為+1,則表示預(yù)測(cè)非常好,0表示一個(gè)平均隨機(jī)的預(yù)測(cè),-1表示預(yù)測(cè)相反。在統(tǒng)計(jì)學(xué)中也被稱作phi系數(shù)?!?/p>
在二分類(兩類)的例子中,tp,tn,fp和fn分別是真正,真負(fù),假正和假負(fù)的數(shù)量,MCC被定義如下:
在多分類的例子中,馬修斯相關(guān)系數(shù)被定義為可以根據(jù)K個(gè)分類計(jì)算混淆矩陣C。為了簡(jiǎn)化定義,考慮如下的中間變量:
多分類MCC被定義為:
當(dāng)多于兩個(gè)標(biāo)簽時(shí),MCC的值不再介于-1和+1之間。而是最小值值介于-1和0之間,且依據(jù)真實(shí)標(biāo)簽的數(shù)量和分布而定。最大值依然是+1。
以下是解釋matthews_corrcoef函數(shù)的用法:
>>> 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...
multilabel_confusion_matrix函數(shù)計(jì)算class-wise(初始值)或者sample-wise(sample wise = True)多標(biāo)簽混淆矩陣來評(píng)估分類模型的準(zhǔn)確率。如果是多標(biāo)簽,多標(biāo)簽混淆矩陣(multilabel_confusion_matrix)也被認(rèn)為是多分類數(shù)據(jù)。這種轉(zhuǎn)變被普遍用于使用二分類分類模型指標(biāo)(例如精確率,召回率等。)評(píng)估多分類問題。
當(dāng)計(jì)算class-wise多標(biāo)簽混淆矩陣C,類別i的真負(fù)個(gè)數(shù)是,假負(fù)是,真正是,和假正是。
如下示例解釋帶有多標(biāo)簽指標(biāo)矩陣(多標(biāo)簽指標(biāo)矩陣)投入的multilabel_confusion_matrix函數(shù)的使用:
>>> import numpy as np
>>> 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]]])
或者,可以為每一個(gè)標(biāo)簽構(gòu)建一個(gè)混淆矩陣:
>>> 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函數(shù)計(jì)算多標(biāo)簽指標(biāo)矩陣投入的,每一個(gè)類別的召回率(或者靈敏度),特異度,fall out(假正率)和 miss rate(假負(fù)率)。
計(jì)算每一個(gè)類的recall(召回率)(也被稱作真正率和靈敏度):
>>> 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. ])
計(jì)算每一個(gè)類的specificity(特異度)(也被稱作真負(fù)率)
>>> tn / (tn + fp)
array([1. , 0. , 0.5])
計(jì)算每個(gè)類的fall out(也被稱作假正率):
>>> fp / (fp + tn)
array([0. , 1. , 0.5])
計(jì)算每一個(gè)類的miss rate(也被稱作假負(fù)率):
>>> fn / (fn + tp)
array([0. , 0.5, 1. ])
roc_curve函數(shù)計(jì)算receiver operating characteristic curve, or ROC curve。引用維基百科:
“receiver operating characteristic (ROC),或簡(jiǎn)稱ROC 曲線, 是一個(gè)圖,它解釋二分類分類器系統(tǒng)隨著不同閾值變化的表現(xiàn)。用來繪制在各種閾值的設(shè)置中,真正數(shù)占總正樣本的比率(TPR = 真正率(true positive rate))與假正數(shù)占總負(fù)樣本的比率(FPR = 假正率(false positive rate))之間的關(guān)系。TPR也被認(rèn)為是敏感度,和FPR(1-敏感度或者真負(fù)率)。”
這個(gè)函數(shù)要求真二分類值和目標(biāo)分?jǐn)?shù),它或者是正類別的可能性估計(jì),置信度值,或者是二分類決策值。如下是使用roc_curve函數(shù)的小例子:
>>> 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. , 0.5, 0.5, 1. ])
>>> tpr
array([0. , 0.5, 0.5, 1. , 1. ])
>>> thresholds
array([1.8 , 0.8 , 0.4 , 0.35, 0.1 ])
下圖是上例ROC曲線:
roc_auc_score函數(shù)計(jì)算ROC曲線的面積,被稱為AUC或者AUROC。通過計(jì)算ROC曲線的面積,整個(gè)曲線的信息被總結(jié)為一個(gè)數(shù)字。詳見Wikipedia article on 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
在多標(biāo)簽分類模型中,roc_auc_curve函數(shù)可以通過在標(biāo)簽上進(jìn)行平均來擴(kuò)展,如上例子。
諸如子集準(zhǔn)確率,Hamming損失函數(shù),或者F1分?jǐn)?shù)相比,ROC不能給每一個(gè)標(biāo)簽提供最佳的閾值。 roc_auc_score函數(shù)可以用于多類別分類模型。當(dāng)前有兩個(gè)平均策略可以使用:one-vs-one算法計(jì)算ROC AUC評(píng)分的均值;one-vs-rest算法計(jì)算每一個(gè)類ROC AUC評(píng)分的均值,而不是總均值。在上面兩個(gè)例子中,預(yù)測(cè)標(biāo)簽以數(shù)組形式提供,值的范圍是0到n_classes,評(píng)分與屬于某類樣本的可能性估計(jì)值相一致。OvO和OvR算法支持均勻加權(quán)(average = "macro")和prevalence(average = "weighted")。
One-vs-one Algorithm: 計(jì)算所有可能類組合的AUC的均值。[HT2001]定義一個(gè)多類別AUC指標(biāo)均勻權(quán)重:
其中c是類的個(gè)數(shù),AUC(j|k)是類別j作為正類和類別k作為負(fù)類的AUC值??偠灾?,在多分類的例子中。這個(gè)算法是用"ovo"給參數(shù)multiclass賦值和"macro"給"average"賦值。
[HT2001]多分類AUC指標(biāo)可以延伸到用prevalence進(jìn)行加權(quán):
其中c是類別數(shù)。該算法是用“ovo”給參數(shù)multiclass賦值,和用“weighted”給參數(shù)average賦值?!皐eighted”選項(xiàng)返回一個(gè)prevalence-weighted均值,詳見如下描述[FC2009]。
**One-vs-rest Algorithm: **計(jì)算每個(gè)類別的AUC而不是剩余的[PD2000]。該算法在功能上與多標(biāo)簽的例子相同。通過設(shè)置"ovr"給參數(shù)multiclass來使用該算法。正如OvO, OvR支持兩種均值策略:“macro”[F2006]和"weighted"[F2001]。
在那些高(false positive rate)不被容忍的情況下,roc_auc_score函數(shù)的參數(shù)max_fpr可被用來把ROC曲線累加到一個(gè)給定的限制。
例子:
參考:
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.
zero_one_loss函數(shù)是通過來計(jì)算0-1分類模型的損失函數(shù)()的求和或者均值。初始情況下,函數(shù)會(huì)將整個(gè)數(shù)據(jù)標(biāo)準(zhǔn)化。為了得到的求和,設(shè)置normalize=False。
在多標(biāo)簽分類模型中,zero_one_loss給子集打分,嚴(yán)格按照標(biāo)簽和預(yù)測(cè)值的對(duì)應(yīng)關(guān)系,如果有任何錯(cuò)誤,都評(píng)為0分。初始情況下,函數(shù)返回未能較好預(yù)測(cè)的子集比例。如果想得到這樣的子集計(jì)數(shù),設(shè)置normalize = False。
如果是第i個(gè)樣本的預(yù)測(cè)值, 是與值對(duì)應(yīng)的真實(shí)值,那么0-1損失函數(shù)就被如下定義:
其中*l(x)*是指標(biāo)函數(shù)(indicator function)。
>>> 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
在帶有二分類標(biāo)簽指標(biāo)的多標(biāo)簽例子中,第一個(gè)標(biāo)簽集[0, 1]有一個(gè)錯(cuò)誤:
>>> 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
例如:
“Brier score是一個(gè)合適的評(píng)分函數(shù),它測(cè)量概率預(yù)測(cè)的準(zhǔn)確率。它適用于預(yù)測(cè)必須將該率分配給一組相互排斥的離散結(jié)果的任務(wù)。”
該函數(shù)返回一個(gè)實(shí)際結(jié)果與預(yù)測(cè)的可能結(jié)果的可能性之間的均方差的評(píng)分。實(shí)際結(jié)果應(yīng)是1或者0(真或假),盡管實(shí)際結(jié)果的預(yù)測(cè)可能性是一個(gè)介于0和1之間的數(shù)。
brier分?jǐn)?shù)損失也是一個(gè)介于0和1之間的數(shù),評(píng)分越低(均方差很?。A(yù)測(cè)越準(zhǔn)確。它被看作是測(cè)量一個(gè)可能性預(yù)測(cè)集合的“標(biāo)尺”。
其中:N是總預(yù)測(cè)值,是實(shí)際結(jié)果的預(yù)測(cè)可能性。
以下是使用該函數(shù)的小例子:
>>> 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
例子:
參考:
在多標(biāo)簽的機(jī)器學(xué)習(xí)中,每個(gè)樣本可以有很多與之相關(guān)聯(lián)的真實(shí)標(biāo)簽。目標(biāo)是提供高的評(píng)分和較好的真實(shí)值排名。
coverage_error函數(shù)計(jì)算必須包含在最中預(yù)測(cè)的標(biāo)簽的平均數(shù)量,以預(yù)測(cè)所有真實(shí)的標(biāo)簽。如果想知道高分?jǐn)?shù)標(biāo)簽的個(gè)數(shù),需要可以預(yù)測(cè)不缺少任何真實(shí)標(biāo)簽的平均值。因此,該指標(biāo)的最佳值是真實(shí)標(biāo)簽的平均值。
**注意:**這里實(shí)現(xiàn)的得分比在Tsoumakas et al., 2010文獻(xiàn)中提供的計(jì)算方式大1.這個(gè)延伸是為了解決一些例子中不包含真實(shí)標(biāo)簽的退化現(xiàn)象。
在形式上,提供真實(shí)標(biāo)簽的二分類指標(biāo)矩陣,以及與每一個(gè)標(biāo)簽相聯(lián)合的得分,覆蓋誤差定義如下:
其中,。給定等級(jí)定義,通過給出將被分配給所有綁定值的最大等級(jí),y_scores中的關(guān)系被破壞。
這是使用該函數(shù)的小例子:
>>> 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函數(shù)執(zhí)行標(biāo)簽排名平均精確度(label ranking average precision LRAP)。這個(gè)指標(biāo)與average_precision_score函數(shù)相聯(lián)系,但是基于標(biāo)簽排名的概念而不是精確度和召回率。
標(biāo)簽排名平均精確度(LRAP)平均所有樣本,并是回答如下問題的答案:對(duì)于每一個(gè)真實(shí)標(biāo)簽,多大的較高排名標(biāo)簽的比例是真實(shí)的標(biāo)簽?如果可以與每一個(gè)樣本相關(guān)的排名,這個(gè)指標(biāo)測(cè)量值會(huì)較高。得到的評(píng)分均會(huì)大于0,最佳值是1。如果每個(gè)樣本有一個(gè)確定的相關(guān)標(biāo)簽,標(biāo)簽排名平均精確度等價(jià)于mean reciprocal rank。
形式上地,給定一個(gè)真實(shí)標(biāo)簽的二分類指標(biāo)矩陣,且與每個(gè)標(biāo)簽相聯(lián)系的評(píng)分 ,平均精確度的定義如下:
其中計(jì)算集合的基數(shù)(例如,集合中元素的數(shù)量),是“范式”(它計(jì)算向量中非零元素個(gè)數(shù))。
如下是使用該函數(shù)的小例子:
>>> 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函數(shù)用于計(jì)算排序損失,它計(jì)算樣本中標(biāo)簽匹配排序不正確的個(gè)數(shù)均值。例如,真實(shí)標(biāo)簽的得分比錯(cuò)誤標(biāo)簽的得分低,賦予排序的錯(cuò)誤和正確標(biāo)簽匹配個(gè)數(shù)倒數(shù)作為權(quán)重。最低的排序損失值為0。
給定一個(gè)真實(shí)標(biāo)簽的二分類指標(biāo)矩陣,以及與每一個(gè)標(biāo)簽相聯(lián)系的評(píng)分,排序損失函數(shù)的定義如下:
其中,計(jì)算集合的基數(shù)(例如,集合中各元素的個(gè)數(shù))以及是"范式"(它計(jì)算向量中非零元素的個(gè)數(shù))。
如下是使用該函數(shù)的小例子:
>>> 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...
>>> # With the following prediction, we have perfect and minimal 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.0
參考資料:
Discounted Cumulative Gain(DCG)和Normalized Discounted Cumulative Gain(NDCG)均是排序指數(shù);它們對(duì)預(yù)測(cè)序列和真實(shí)得分進(jìn)行比較,例如一個(gè)查詢答案的相關(guān)性。
在維基百科中對(duì)于Discounted Cumulative Gain的解釋如下:
“Discounted cumulative gain(DCG)是一個(gè)對(duì)排序質(zhì)量的測(cè)量。在信息檢索中,該指標(biāo)經(jīng)常被用來搜索引擎算法或者相關(guān)應(yīng)用的效率。在搜索引擎結(jié)果集中,使用文檔的分級(jí)相關(guān)性比例,DCG基于它在結(jié)果列表中的位置,測(cè)量文檔有用性,或者增益。增益在結(jié)果表中是由上到下的累積,根據(jù)每一個(gè)結(jié)果的增益,不考慮較低的排名?!?/p>
DCG在預(yù)測(cè)序列中,給正確標(biāo)簽排序(例如查詢答案的相關(guān)性),然后乘以對(duì)數(shù)衰減,最后匯總求和。在最先的K個(gè)結(jié)果后,求和會(huì)被截?cái)?,因此稱它為DCG@K。KDCG,或者NDCG@K是DCG除以最佳預(yù)測(cè)對(duì)應(yīng)的DCG,從而該值是介于0和1之間的。通常,NDCG優(yōu)先于DCG。
與排序損失作比較,NDCG能夠考慮相關(guān)性評(píng)分,而不是真實(shí)值排序。所以,所過真實(shí)值僅由一個(gè)序列構(gòu)成,使用排序損失會(huì)更好;如果真實(shí)值是由實(shí)際有用性評(píng)分構(gòu)成(例如,0表示不相關(guān),1表示相關(guān),2表示非常相關(guān)),可以選用NDCG。
對(duì)于某樣本,給定每一個(gè)標(biāo)簽的連續(xù)真實(shí)值向量,其中M是返回值的個(gè)數(shù),預(yù)測(cè)值是,它是排序函數(shù)的索引f,DCG評(píng)分是:
并且,NDCG評(píng)分是DCG評(píng)分除以從y中得到的DCG評(píng)分。
參考資料:
skearn.metrics模塊實(shí)現(xiàn)一些損失函數(shù),評(píng)分,并且應(yīng)用函數(shù)去測(cè)度回歸標(biāo)簽。其中一些已經(jīng)改進(jìn),可以處理多指標(biāo)案例:mean_squared_error,mean_absolute_error,explained_variance_score和r2_score。
這些函數(shù)使用關(guān)鍵參數(shù)multioutout,它指定計(jì)算方式,每一個(gè)標(biāo)簽的得分或損失都會(huì)被平均。初始值是“uniform_average”,它指定給所有輸出均勻權(quán)重,計(jì)算所有輸出的平均值。如果一個(gè)ndarray的形狀(n_outputs,)被傳入,它的各條目會(huì)被解釋為權(quán)重,同時(shí)返回相應(yīng)的加權(quán)平均值。如果multioutput的值指定為“raw_values”,則所有未改變的得分或損失將會(huì)被返回,并以數(shù)組形式返回(n_outputs,)。
r2_score和explained_variance_score接受一個(gè)額外的值"variance_weighted"給multioutput參數(shù)。這個(gè)選項(xiàng)是每一個(gè)得分的權(quán)重通過與目標(biāo)變量相一致的方差得到。這個(gè)設(shè)置量化全局捕捉未縮放的方差。如果目標(biāo)變量是不同的比例,那么這個(gè)分?jǐn)?shù)就會(huì)將更多的重點(diǎn)放到解釋較高方差的變量上。對(duì)于向后兼容,r2_score的初始值是multioutput = "variance_weighted"。這個(gè)值將會(huì)在未來變?yōu)閡niform_average。
explained_variance_score計(jì)算explained variance regression score。
如果是標(biāo)簽估計(jì)值,是與之相一致(正確)的標(biāo)簽輸出,并且Var是Variance,標(biāo)準(zhǔn)差的平方,則可解釋的方法計(jì)算如下:
最好的可能取值是1.0,值越低越不好。
如下是一個(gè)使用explained_variane_score函數(shù)的小例子:
>>> 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...
max_error函數(shù)計(jì)算最大殘差(residual error),它是捕捉預(yù)測(cè)值和真實(shí)值中最不好的誤差。在一個(gè)完美擬合的單輸出回歸模型中,max_error在訓(xùn)練集上可能為0,但是在現(xiàn)實(shí)中基本不可能出現(xiàn)這種情況,這個(gè)指標(biāo)表明擬合模型的誤差程度。
如果是第i個(gè)樣本的預(yù)測(cè)值,是與之相一致的真實(shí)值,最大誤差定義如下:
如下是使用max_error函數(shù)的小例子:
>>> from sklearn.metrics import max_error
>>> y_true = [3, 2, 7, 1]
>>> y_pred = [9, 2, 7, 1]
>>> max_error(y_true, y_pred)
6
max_error不支持多輸出(multioutput)。
mean_absolute_error函數(shù)計(jì)算mean absolute error,一個(gè)與絕對(duì)誤差損失或者-正則損失相一致的風(fēng)險(xiǎn)指標(biāo)。
如果是第i個(gè)樣本的預(yù)測(cè)值,且y{i}是與之相一致的真實(shí)值,樣本的平均絕對(duì)誤差(MAE)定義如下:
如下是使用mean_absolute_error函數(shù)的小例子:
>>> 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...
mean_squared_error函數(shù)計(jì)算mean square error,平方(二次的)誤差或損失的期望值相一致的風(fēng)險(xiǎn)指標(biāo)。
如果是第i個(gè)樣本的預(yù)測(cè)值,是與之相一致的真實(shí)值,均方誤差(MAE)對(duì)的估計(jì)值被定義如下:
如下是一個(gè)使用mean_squared_error函數(shù)的小例子:
>>> 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...
例子:
mean_squared_log_error函數(shù)計(jì)算與平方(二次方)對(duì)數(shù)誤差或損失的期望值相一致的風(fēng)險(xiǎn)指標(biāo)。
如果是第i個(gè)樣本的預(yù)測(cè)*值,是與之相一致的真實(shí)值,那么如下定義是的均方誤差對(duì)數(shù)(MSLE):
其中,表示x的自然對(duì)數(shù)。當(dāng)目標(biāo)呈指數(shù)倍增長(zhǎng)的時(shí)候,最好使用這個(gè)方法,例如人口計(jì)數(shù),跨度為一年的商品平均銷售額等。需要注意的是:這個(gè)指標(biāo)懲罰低于預(yù)測(cè)值的多余于高于預(yù)測(cè)值的。
如下是使用mean_squared_error函數(shù)的小例子:
>>> 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...
median_absolute_error是一個(gè)有趣的指標(biāo),因?yàn)樗鼘?duì)異常值具有魯棒性。這個(gè)損失通過目標(biāo)值和預(yù)測(cè)值所有絕對(duì)插值的中值來計(jì)算。
如果是第i個(gè)樣本的預(yù)測(cè)值,是與之相一致的真實(shí)值,那么中值絕對(duì)誤差(MedAE)通過對(duì)的估計(jì)如下:
median_absolute_error不支持多輸出。
如下是使用median_absolute_error函數(shù)的小例子:
>>> 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函數(shù)計(jì)算coefficient of determination,通常用R2表示。
它代表方差(y的)的比例,被解釋為模型中的獨(dú)立變量。它是模型的擬合度指數(shù),因此,可以代表模型對(duì)未知數(shù)據(jù)的預(yù)測(cè)好壞程度,通過計(jì)算可解釋方差的比例。
因此,方差取決于數(shù)據(jù)集,對(duì)比不同的數(shù)據(jù)集R2,可能不具有意義。最好的分?jǐn)?shù)是1,且它可以小于零(因?yàn)槟P涂赡軙?huì)變得更糟)。一個(gè)常數(shù)模型在預(yù)測(cè)y的期望值時(shí),不考慮輸入特征,它的R2得分可能為0.0。
如果是樣本i的預(yù)測(cè)值,那么是與所有n個(gè)樣本相一致的真實(shí)值,則R2的估計(jì)表達(dá)式為:
其中,和。
需要注意的是:r2_score計(jì)算的是未調(diào)整的R2(沒有調(diào)整y的樣本方差的偏差)。
如下是使用r2_score函數(shù)的小例子:
>>> 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...
例子:
mean_tweedie_deviance函數(shù)使用power參數(shù)(p)計(jì)算mean Tweedie deviance error。
此指標(biāo)可得出回歸目標(biāo)的預(yù)測(cè)期望值。
存在以下特殊情況:
如果是第i個(gè)樣本的預(yù)測(cè)值,是與之相對(duì)應(yīng)的真實(shí)值,則估計(jì)的平均Tweedie偏差誤差(D)對(duì)于參數(shù)為p如下:
Tweedie偏差是一個(gè)自由度為2-power的齊次函數(shù)。因此,power = 2時(shí)的Gamma分布表明同時(shí)縮放y_true和y_pred對(duì)偏差沒有影響。對(duì)于power=1的泊松分布偏差呈線性比例,二次地正態(tài)分布(power=0)??偠灾?,在真實(shí)和預(yù)測(cè)值之間,越高的power,越少的權(quán)重賦予給極端偏差。
例如,比較兩個(gè)預(yù)測(cè)值1.0和100,它們均與真實(shí)值相差50%。
均方誤差(power=0)對(duì)于與預(yù)測(cè)值不同的第二點(diǎn)非常敏感,:
>>> 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
如果將power設(shè)置為1:
>>> mean_tweedie_deviance([1.0], [1.5], power=1)
0.18...
>>> mean_tweedie_deviance([100.], [150.], power=1)
18.9...
誤差在下降。最后,設(shè)置power = 2:
>>> mean_tweedie_deviance([1.0], [1.5], power=2)
0.14...
>>> mean_tweedie_deviance([100.], [150.], power=2)
0.14...
可以得到相同的誤差。當(dāng)power = 2時(shí),偏差只對(duì)相對(duì)誤差敏感。
sklearn.metrics模塊實(shí)行幾種損失,評(píng)分和實(shí)用功能。詳見 Clustering performance evaluation 部分的聚類示例,以及 Biclustering evaluation 的雙集群。
當(dāng)是有監(jiān)督機(jī)器學(xué)習(xí)時(shí),一個(gè)簡(jiǎn)單的方法是用某個(gè)估計(jì)器的結(jié)果與經(jīng)驗(yàn)相比較。DummyClassifier實(shí)現(xiàn)一些簡(jiǎn)單的分類策略:
需要注意的是:所有這些策略,predict方法完全忽略輸入數(shù)據(jù)!
為了解釋DummyClassifier,首先需要?jiǎng)?chuàng)建一個(gè)不平衡數(shù)據(jù)集:
>>> 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的準(zhǔn)確率:
>>> 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 分類器做的好?,F(xiàn)在,改變SVC的核函數(shù):
>>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.94...
可以看到準(zhǔn)確率提升到接近100%。如果不是因?yàn)橄腃PU成本太高,交叉驗(yàn)證的策略值得推薦使用以找到更高的準(zhǔn)確率估計(jì)。詳見 交叉驗(yàn)證:評(píng)估模型表現(xiàn) 部分。 如果想優(yōu)化參數(shù)空間,強(qiáng)烈推薦使用合適的方法;詳見調(diào)整估計(jì)器的超參數(shù) 部分。
整體上,當(dāng)一個(gè)分類器的結(jié)果太接近隨機(jī)選取的時(shí)候,可能意味著哪里出了問題:也許是特征選取的不合適,超參數(shù)選取的不合適,分類器不能很好的作用在不均衡樣本上,等...
DummyRegressor 也可以執(zhí)行回歸的四個(gè)簡(jiǎn)單經(jīng)驗(yàn)法則:
在所有這些策略中,predict 方法完全忽略投入數(shù)據(jù)。
更多建議: