scikit-learn 指標(biāo)和評(píng)分:量化預(yù)測(cè)的質(zhì)量

2023-02-20 14:23 更新

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ù)部分。

3.3.1 評(píng)分參數(shù):定義模型評(píng)估準(zhǔn)則

模型選擇和評(píng)估使用的工具,如model_selection, GridSearchCVmodel_selection.cross_val_score,使用scoring參數(shù)控制對(duì)評(píng)估器的估計(jì)量應(yīng)用的指標(biāo)。

3.3.1.1 常見場(chǎng)景:預(yù)定義值

在最常見的例子中,可以給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中。

3.3.1.2 根據(jù)metric函數(shù)定義評(píng)分策略

sklearn.metrics模塊公開一組簡(jiǎn)單函數(shù),該函數(shù)可應(yīng)用于測(cè)量給定真實(shí)值和預(yù)測(cè)值的預(yù)測(cè)誤差:

  • 以_score為結(jié)尾的函數(shù),返回一個(gè)最大值,該值越大越好。
  • 以_error或_loss為結(jié)尾的函數(shù),返回一個(gè)最小值,該值越小越好。當(dāng)使用make_scorer把它轉(zhuǎn)變?yōu)樵u(píng)分對(duì)象時(shí),設(shè)置greater_is_better參數(shù)為False(初始值是True;詳見下面的函數(shù)描述)。

各類機(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ù):

  • 可以使用的python函數(shù)(下例中使用my_custom_loss_func)
  • 是否python函數(shù)返回一個(gè)分?jǐn)?shù)(初始值為greater_is_better=True)或者一個(gè)損失(分?jǐn)?shù))(greater_is_better=False)。如果一個(gè)損失函數(shù),python函數(shù)的返回值是負(fù)值的評(píng)分對(duì)象,符合交叉驗(yàn)證的傳統(tǒng),評(píng)分越高,模型越好。
  • 僅對(duì)于分類的指標(biāo):是否python函數(shù)要求提供連續(xù)決定確定性(needs_threshold=True)。初始值是False。
  • 任何其它參數(shù),如f1_score中的beta或labels。

如下示例展示構(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... 

3.3.1.3 執(zhí)行自定義評(píng)分對(duì)象

無需使用make_scorer “制造廠”,就可以通過從頭構(gòu)建自定義評(píng)分對(duì)象,生成更加靈活的模型評(píng)分器。對(duì)于一個(gè)可調(diào)用的評(píng)分器,需要滿足如下兩個(gè)規(guī)定協(xié)議:

  • 可以調(diào)用參數(shù)(estimator, X, y),estimator是需要被評(píng)估的模型,X是驗(yàn)證數(shù)據(jù),y是X標(biāo)簽(應(yīng)用于有監(jiān)督的案例中)的真實(shí)值或者None(應(yīng)用于非監(jiān)督的案例中)。
  • 它返回一個(gè)浮點(diǎn)型數(shù)值,該數(shù)值量化estimator對(duì)X關(guān)于y的預(yù)測(cè)質(zhì)量。再強(qiáng)調(diào)一遍,越高的得分模型越好,所以如果得分是損失函數(shù)的返回值,那么該值應(yīng)為負(fù)。

注意:當(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)  

3.3.1.4 使用多指標(biāo)評(píng)估

Scikit-learn也允許在GridSearchCV,RandomizedSearchCV和cross_validate中評(píng)估多指標(biāo)。

有兩種方式可以指定scoring參數(shù)的多評(píng)分指標(biāo):

  • 可迭代字符串指標(biāo)::
>>> scoring = ['accuracy', 'precision'] 
  • 以字典形式將評(píng)分器名稱映射給評(píng)分函數(shù)::
>>> 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] 

3.3.2 分類指標(biāo)

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ù)定義。

3.3.2.1 從二分類到多分類和多標(biāo)簽

一些指標(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)行定義。

  • "weighted" (權(quán)重)處理類的不均衡問題。按其在真實(shí)數(shù)據(jù)中的加權(quán)計(jì)算每個(gè)類的分?jǐn)?shù),并計(jì)算各二分類指標(biāo)的平均值。
  • "micro" (微)對(duì)于所有二分類指標(biāo)(除非已分配樣本權(quán)重)指定給每個(gè)樣本類匹配相等的貢獻(xiàn)。除了匯總每個(gè)類的指標(biāo),還要匯總除數(shù)和被除數(shù),將每個(gè)類的各指標(biāo)匯總成一個(gè)整體商(總被除數(shù)/總除數(shù)得出評(píng)估模型整體水平的商)。 微-平均方法更適合多標(biāo)簽分類中,包括多類別分類問題,但多數(shù)類會(huì)被忽略。
  • "samples" (樣本)僅應(yīng)用于多標(biāo)簽問題。它不對(duì)子類進(jìn)行計(jì)算,而是計(jì)算評(píng)估數(shù)據(jù)中每個(gè)樣本真實(shí)類別和預(yù)測(cè)類別的指標(biāo)。 最后返回它們的(sample_weight - weighted)均值。
  • 設(shè)置參數(shù) average = None 會(huì)返回每個(gè)類得分的數(shù)組。

當(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。

3.3.2.2 準(zhǔn)確率評(píng)分

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)

在帶有二分類標(biāo)簽指標(biāo)的多標(biāo)簽例子中:

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

例如:

3.3.2.3 平衡的準(zhǔn)確率評(píng)分(Balanced accuracy score)

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í)。

  • 我們的定義:[Mosley2013], [Kelleher2015]和[Guyon2015], 其中[Guyon2015]適合調(diào)整的版本,以確保隨機(jī)預(yù)測(cè)值為0,好的預(yù)測(cè)值為1..
  • 類的均衡準(zhǔn)確率在[Mosley2013]中描述:每個(gè)類別中精確率和召回率的最小值會(huì)被計(jì)算。將計(jì)算出的這些值進(jìn)行平均,從而得到均衡的準(zhǔn)確率。
  • 均衡的準(zhǔn)確率在[Urbanowicz2015]中被描述:每一個(gè)類別的靈敏度和特異性的均值會(huì)被計(jì)算,隨后計(jì)算總的均值。

參考:

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.

3.3.2.4 Cohen's kappa

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 

3.3.2.5 混淆矩陣

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) 

例如:

3.3.2.6 分類模型報(bào)告

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  

例如:

3.3.2.7 Hamming損失函數(shù)

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ù)界于零和一之間,不包括邊界。

3.3.2.8 精確率,召回率和F-measures

直觀地說,精確率(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.

3.3.2.8.1 二分類分類模型

在二分類分類模型中,分類預(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... 

3.3.2.8.2 多分類和多標(biāo)簽分類模型

在多分類和多標(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_scoreprecision_recall_support,precision_scorerecall_score函數(shù)中傳遞,已在以上描述(above)。需要注意的是:如果所有的標(biāo)簽啊都包括在內(nèi),那么“micro”-averaging(“微”-平均)在多分類中的設(shè)置將產(chǎn)生精確率,召回率和F與準(zhǔn)確率的結(jié)果相等。也要注意"權(quán)重"平均可能產(chǎn)生不介于精確率和召回率之間的F-score。

為了更清晰的了解,請(qǐng)考慮如下概念:

  • y是預(yù)測(cè)值(樣本,標(biāo)簽)組合的集合
  • 是真實(shí)值(樣本,標(biāo)簽)組合的集合
  • L是標(biāo)簽的集合
  • S是樣本的集合
  • y的樣本s 的子集,例如:
  • y的標(biāo)簽l的子集
  • 同樣地,均是的子集
  • (在處理B=\emptyset時(shí),公約有所不同;這個(gè)執(zhí)行使用R(A, B): = 0,并且與P類似 )

各指標(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... 

3.3.2.9 Jaccard相似性系數(shù)評(píng)分

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

3.3.2.10 Hinge loss

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

3.3.2.11 對(duì)數(shù)損失函數(shù)(Log loss)

對(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ù)的。

3.3.2.12 馬修斯相關(guān)系數(shù)

對(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)化定義,考慮如下的中間變量:

  • 是類別k真實(shí)發(fā)生的次數(shù),
  • 是類別k預(yù)測(cè)的次數(shù),
  • 是正確預(yù)測(cè)的總樣本個(gè)數(shù),
  • 是總樣本的個(gè)數(shù)。

多分類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... 

3.3.2.13 多標(biāo)簽混合矩陣

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

3.3.2.14 Receiver operating characteristic (ROC)

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.

3.3.2.15 Zeor one loss

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)

在帶有二分類標(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)

例如:

“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 

例子:

  • 參見 Probability calibration of classifiers 是一個(gè)使用Brier score損失來校準(zhǔn)分類器的可能性。

參考:

3.3.3 多標(biāo)簽排序指標(biāo)

在多標(biāo)簽的機(jī)器學(xué)習(xí)中,每個(gè)樣本可以有很多與之相關(guān)聯(lián)的真實(shí)標(biāo)簽。目標(biāo)是提供高的評(píng)分和較好的真實(shí)值排名。

3.3.3.1 覆蓋誤差

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 

3.3.3.2 標(biāo)簽排名平均精確度

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

3.3.3.3 排序損失

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 

參考資料:

  • Tsoumakas, G., Katakis, I., & Vlahavas, I. (2010). Mining multi-label data. In Data mining and knowledge discovery handbook (pp. 667-685). Springer US.

3.3.3.4 Normalized Discounted Cumulative Gain

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)分。

參考資料:

  • Wikipedia entry for Discounted Cumulative Gain
  • Jarvelin, 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.

3.3.4 回歸指標(biāo)

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_scorer2_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_scoreexplained_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。

3.3.4.1 可解釋的方差分?jǐn)?shù)

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

3.3.4.2 最大誤差

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)

max_error不支持多輸出(multioutput)。

3.3.4.3 平均絕對(duì)誤差

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

3.3.4.4 均方誤差

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

例子:

  • 參見 Gradient Boosting regression 是一個(gè)使用均方誤差估計(jì)梯度提升回歸模型的例子。

3.3.4.5 均方誤差對(duì)數(shù)

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

3.3.4.6 中值絕對(duì)誤差

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 

3.3.4.7 R2 score,可決系數(shù)

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

例子:

3.3.4.8 平均泊松,Gamma,和Tweedie偏差

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ì)誤差敏感。

3.3.5 聚類指標(biāo)

sklearn.metrics模塊實(shí)行幾種損失,評(píng)分和實(shí)用功能。詳見 Clustering performance evaluation 部分的聚類示例,以及 Biclustering evaluation 的雙集群。

3.3.6 Dummy 評(píng)估器

當(dāng)是有監(jiān)督機(jī)器學(xué)習(xí)時(shí),一個(gè)簡(jiǎn)單的方法是用某個(gè)估計(jì)器的結(jié)果與經(jīng)驗(yàn)相比較。DummyClassifier實(shí)現(xiàn)一些簡(jiǎn)單的分類策略:

  • 參數(shù)stratified通過考慮訓(xùn)練集類別的分布,產(chǎn)生隨機(jī)預(yù)測(cè)值。
  • 參數(shù)most_frequent 是預(yù)測(cè)訓(xùn)練集中頻率最高的標(biāo)簽。
  • 參數(shù)prior 通過預(yù)測(cè)可以使類別最大化的類(如most_frequent )和predict_proba返回優(yōu)先類。
  • 參數(shù)uniform 產(chǎn)生均勻隨機(jī)的預(yù)測(cè)值。
  • 參數(shù)constant預(yù)測(cè)的是常量標(biāo)簽(由用戶定義)。當(dāng)正類是少數(shù)類時(shí),這種方法的主要?jiǎng)訖C(jī)是F1-scoring。

需要注意的是:所有這些策略,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)法則:

  • mean 預(yù)測(cè)的是訓(xùn)練目標(biāo)的均值。
  • median 預(yù)測(cè)的是訓(xùn)練目標(biāo)的中值。
  • quantile 預(yù)測(cè)的是由用戶提供分位數(shù)的訓(xùn)練目標(biāo)。
  • contant 預(yù)測(cè)的是由用戶提供的某個(gè)常量目標(biāo)。

在所有這些策略中,predict 方法完全忽略投入數(shù)據(jù)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)