日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

模型评估——定量分析预测的质量

發(fā)布時(shí)間:2023/12/13 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模型评估——定量分析预测的质量 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

https://blog.csdn.net/hustqb/article/details/77922031

    • 評(píng)分參數(shù)定義模型評(píng)價(jià)規(guī)則
      • 公共案例預(yù)定義值
      • 根據(jù)度量函數(shù)定義你的評(píng)分策略
      • 應(yīng)用你自己的評(píng)分對(duì)象
      • 使用多種度量指標(biāo)
    • 分類(lèi)度量
      • 從二分類(lèi)到多分類(lèi)多標(biāo)簽
      • 精確度
      • Cohens kappa
      • 混亂矩陣
      • 分類(lèi)報(bào)告
      • 漢明損失
      • Jaccard 相似性相關(guān)系數(shù)
      • 準(zhǔn)確率召回率和F度量
        • 二分類(lèi)
        • 多分類(lèi)多標(biāo)簽
      • Hinge損失
      • Log損失
      • Matthews 相關(guān)系數(shù)
      • ROC
      • 0-1損失
      • Brier score損失
    • 多標(biāo)簽分級(jí)度量
      • Coverage誤差
      • 分級(jí)標(biāo)簽平均準(zhǔn)確度
      • 分級(jí)損失
    • 回歸度量
      • Explained variance score
      • 均值絕對(duì)誤差
      • 均值平方誤差
      • 均值平方對(duì)數(shù)誤差
      • 中位數(shù)絕對(duì)誤差
      • R2R2 score定義相關(guān)性
    • 聚類(lèi)度量
    • 簡(jiǎn)陋評(píng)分器

?

在sklearn庫(kù)里,用于評(píng)估模型預(yù)測(cè)的質(zhì)量的API一共有3種:

  • 評(píng)分方法:評(píng)估者具有score(),面向其要解決的問(wèn)題,可以提供一個(gè)默認(rèn)評(píng)估標(biāo)準(zhǔn)。 這部分內(nèi)容不在本文中講述,因?yàn)樗虿煌哪P投?#xff0c;所以會(huì)在各個(gè)模型的介紹文檔中講述。
  • 評(píng)分參數(shù):使用交叉驗(yàn)證的模型評(píng)估工具(如model_selection.cross_val_score和model_selection.GridSearchCV)依賴(lài)于內(nèi)部評(píng)分策略。這些內(nèi)容會(huì)在其他章節(jié)(評(píng)分參數(shù):定義模型評(píng)判規(guī)則)中討論。
  • 度量函數(shù):metrics模塊實(shí)現(xiàn)了針對(duì)特定目的評(píng)估誤差的功能。 這些指標(biāo)會(huì)在下面這些章節(jié)詳細(xì)介紹:Classification metrics,?Multilabel ranking metrics,?Regression metrics?and?Clustering metrics.?
    最后,Dummy estimators對(duì)于獲得隨機(jī)預(yù)測(cè)的這些指標(biāo)的基準(zhǔn)值是有用的。
  • 聲明:

  • 本文譯自Python庫(kù)sklearn里的官方文檔
  • 需要讀者對(duì)Python有一定的了解
  • 本文超長(zhǎng)…而且因?yàn)樗接邢?#xff0c;有些地方翻譯的較為生硬。
  • 評(píng)分參數(shù):定義模型評(píng)價(jià)規(guī)則

    ??模型選擇和評(píng)估通常使用工具(比如model_selection.GridSearchCV和model_selection.cross_val_score),使用一個(gè)scoring參數(shù)控制那個(gè)被我們應(yīng)用在我們的評(píng)價(jià)系統(tǒng)的度量方法。

    公共案例:預(yù)定義值

    ??對(duì)于最常見(jiàn)的用例,您可以指定一些自帶scoring參數(shù)的評(píng)分對(duì)象; 下表顯示了所有可能的值。 所有得分手對(duì)象遵循慣例:返回值越大,分?jǐn)?shù)越高,模型越優(yōu)。 因此,衡量模型和數(shù)據(jù)之間距離的度量(如metrics.mean_squared_error)可以用它們的負(fù)值作為評(píng)分對(duì)象的返回值。

    ScoringFunctionComment
    分類(lèi)??
    ‘a(chǎn)ccuracy’metrics.accuracy_score?
    ‘a(chǎn)verage_precision’metrics.average_precision_score?
    ‘f1’metrics.f1_score?
    ‘f1_micro’metrics.f1_score?
    f1_macro’metrics.f1_score?
    ‘f1_weighted’metrics.f1_score?
    ‘f1_samples’metrics.f1_score?
    ‘neg_log_loss’metrics.log_loss?
    ‘precision’ etcmetrics.precision_score?
    ‘recall’ etcmetrics.recall_score?
    ‘roc_auc’metrics.roc_aur_score?
    聚類(lèi)??
    ‘a(chǎn)djusted_mutual_info_score’metrics.adjusted_mutual_info_score?
    ‘a(chǎn)djusted_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?
    ‘neg_mean_absolute_error’metrics.mean_absolute_error?
    ‘neg_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?

    例子:

    from sklearn import svm, datasets # 導(dǎo)入SVM模型庫(kù)和數(shù)據(jù)集庫(kù) from sklearn.model_selection import cross_val_score # 導(dǎo)入模型選擇庫(kù)中的交叉驗(yàn)證分?jǐn)?shù)函數(shù) '''加載鳶尾花數(shù)據(jù)集''' iris = datasets.load_iris() X, y = iris.data, iris.target clf = svm.SVC(probability=True, random_state=0) # 創(chuàng)建SVC分類(lèi)器 '''輸出分類(lèi)器的評(píng)分''' score_arr = cross_val_score(clf, X, y, scoring='neg_log_loss') print score_arr # 輸出 [-0.0757138 -0.16816241 -0.07091847] print score_arr.shape # 輸出 (3L,) model = svm.SVC() # 在創(chuàng)建一個(gè)SVC分類(lèi)器 '''應(yīng)用另一種不存在的評(píng)分方式''' cross_val_score(model, X, y, scoring='wrong_choice') # 會(huì)報(bào)錯(cuò)ValueError

    ?
    PS:ValueError異常列出的值對(duì)應(yīng)于以下部分中描述的測(cè)量預(yù)測(cè)精度的函數(shù)。 這些評(píng)分對(duì)象存儲(chǔ)在字典sklearn.metrics.SCORERS中。

    根據(jù)度量函數(shù)定義你的評(píng)分策略

    ??模塊sklearn.metrics還展示了一組測(cè)量預(yù)測(cè)誤差(給出了真實(shí)值和預(yù)測(cè)值)的簡(jiǎn)單函數(shù):

    • 以_score結(jié)尾的函數(shù)返回值用于最大化,越高越好
    • 以_error或_loss結(jié)尾的函數(shù)返回一個(gè)值用于最小化,越低越好。當(dāng)使用make_scorer()函數(shù)將其轉(zhuǎn)換為評(píng)分對(duì)象時(shí),請(qǐng)將greater_is_better參數(shù)設(shè)置為False(默認(rèn)為T(mén)rue)。

    可用于各種機(jī)器學(xué)習(xí)任務(wù)的指標(biāo)在下面詳細(xì)介紹。?
    ??許多指標(biāo)不會(huì)以scoring為名稱(chēng),有時(shí)是因?yàn)樗鼈冃枰渌麉?shù),例如fbeta_score。在這種情況下,您需要生成一個(gè)適當(dāng)?shù)膕corer對(duì)象。生成可評(píng)估對(duì)象進(jìn)行評(píng)分的最簡(jiǎn)單的方法是使用make_scorer()函數(shù)。該函數(shù)將度量轉(zhuǎn)換為可用于模型評(píng)估的可調(diào)用的數(shù)據(jù)類(lèi)型(callable)。?
    ??一個(gè)典型的用例是使用無(wú)默認(rèn)值的參數(shù)轉(zhuǎn)換包裝庫(kù)中已存在的度量函數(shù),例如fbeta_score()函數(shù)的beta參數(shù):

    from sklearn.metrics import fbeta_score, make_scorer # 導(dǎo)入fbeta評(píng)分函數(shù)和一個(gè)轉(zhuǎn)換函數(shù) ftwo_scorer = make_scorer(fbeta_score, beta=2) # 通過(guò)make_scorer創(chuàng)建新方法 from sklearn.model_selection import GridSearchCV from sklearn.svm import LinearSVC '''待評(píng)價(jià)的分類(lèi)模型是線性SVC,超參數(shù)域?yàn)閧1, 10}, 評(píng)分方法為前面新轉(zhuǎn)換的方法''' grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]}, scoring=ftwo_scorer)

    ??第二個(gè)用例是使用make_scorer將一個(gè)簡(jiǎn)單的python函數(shù)構(gòu)建一個(gè)完全自定義的scorer對(duì)象,它可以使用幾個(gè)參數(shù):

    • 你要使用的python函數(shù)(在下面的示例中為my_custom_loss_func())
    • 明確python函數(shù)是否返回一個(gè)分?jǐn)?shù)(greater_is_better = True,默認(rèn)值)或一個(gè)損失值(greater_is_better= False)。 如果一個(gè)損失,得分器對(duì)象的python函數(shù)的輸出被取負(fù)值以符合交叉驗(yàn)證慣例,更優(yōu)的模型返回更高的值。
    • 僅用于分類(lèi)度量的時(shí)候:判斷您提供的python函數(shù)是否需要連續(xù)性判斷(needs_threshold = True)。 默認(rèn)值為False。
    • 任何其他參數(shù),如f1_score()函數(shù)中的參數(shù):beta和labels。

    以下是建立自定義scorer,以及使用greater_is_better參數(shù)的示例:

    import numpy as np def my_custom_loss_func(ground_truth, predictions): """ 自定義損失函數(shù)——其實(shí)就是典型的SVM損失函數(shù) groud_truth: 真實(shí)值 predictions: 預(yù)測(cè)值 """ diff = np.abs(ground_truth - predictions).max() return np.log(1 + diff) loss = make_scorer(my_custom_loss_func, greater_is_better=False) # 創(chuàng)建為scorer 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) # 創(chuàng)建簡(jiǎn)陋分類(lèi)模型 clf = clf.fit(ground_truth, predictions) # 訓(xùn)練模型 loss(clf,ground_truth, predictions) # 損失值,False:取負(fù) score(clf,ground_truth, predictions) # 評(píng)分, True:取正

    這個(gè)代碼是沒(méi)有實(shí)際意義的,只是為了體現(xiàn)兩點(diǎn)

  • 自定義評(píng)分函數(shù)時(shí),需要用到真實(shí)值和預(yù)測(cè)值,然后根據(jù)自己的想法輸出預(yù)測(cè)的誤差或者分值,這里輸出的是誤差。
  • make_scorer()函數(shù)的參數(shù)greater_is_better是為了適應(yīng)靈活的自定義評(píng)分函數(shù)的。當(dāng)你的評(píng)分函數(shù)輸出損失值的時(shí)候,參數(shù)為False,即對(duì)損失值取負(fù);輸出分值的時(shí)候,反之。這都是為了遵從前面所說(shuō)的越大越優(yōu)的慣例。
  • 應(yīng)用你自己的評(píng)分對(duì)象

    ??您可以通從頭開(kāi)始構(gòu)建自己的評(píng)分對(duì)象,而不使用make_scorer()工廠函數(shù),這樣生成的scorer模型更靈活。 要成為scorer,需要符合以下兩個(gè)規(guī)則所指定的協(xié)議:

    • 可以使用參數(shù)(estimator,X,y)調(diào)用,其中estimator是應(yīng)該評(píng)估的模型,X是驗(yàn)證數(shù)據(jù),y是X(在監(jiān)督的情況下)的真實(shí)標(biāo)簽或None(在無(wú)監(jiān)督的情況下)。
    • 它返回一個(gè)浮點(diǎn)數(shù),用于量化X上的estimator參考y的預(yù)測(cè)質(zhì)量。 再次,按照慣例,更高的值表示更好的預(yù)測(cè)模型,所以如果你的返回的是損失值,應(yīng)取負(fù)。

    使用多種度量指標(biāo)

    ??Scikit-learn還允許在GridSearchCV,RandomizedSearchCV和cross_validate中使用多個(gè)度量指標(biāo)。為評(píng)分參數(shù)指定多個(gè)評(píng)分指標(biāo)有兩種方法:

    • 作為一個(gè)包含字符串的迭代器:
    scoring = ['accuracy', 'precision']
    • 作為一個(gè)scorer名字到scorer函數(shù)的映射:
    from sklearn.metrics import accuracy_score from sklearn.metrics import make_scorer scoring = {'accuracy': make_scorer(accuracy_score), 'prec': 'precision'}

    ??請(qǐng)注意,字典中的值可以是scorer函數(shù),也可以是一個(gè)預(yù)定義的度量指標(biāo)的字符串。目前,只有那些返回單一分?jǐn)?shù)的scorer函數(shù)才能在dict內(nèi)傳遞。 不允許返回多個(gè)值的Scorer函數(shù),并且需要一個(gè)包裝器才能返回一個(gè)度量:

    from sklearn.model_selection import cross_validate # 交叉驗(yàn)證函數(shù) from sklearn.metrics import confusion_matrix X, y = datasets.make_classification(n_classes=2, random_state=0) # 一個(gè)簡(jiǎn)陋的二分類(lèi)數(shù)據(jù)集 svm = LinearSVC(random_state=0) def tp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 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)[1, 0] def fn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 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, scoring=scoring) print(cv_results['test_tp']) # 獲取test數(shù)據(jù)集的tp值 [12 13 15] print(cv_results['test_fn']) # 獲取test數(shù)據(jù)集的fn值 [5 4 1]

    ?

    分類(lèi)度量

    ??sklearn.metrics模塊實(shí)現(xiàn)了幾種損失函數(shù)、評(píng)分函數(shù)和功能函數(shù)來(lái)測(cè)量分類(lèi)性能。 某些指標(biāo)可能需要正例,置信度值或二進(jìn)制決策值的概率估計(jì)。 大多數(shù)指標(biāo)應(yīng)用的是:通過(guò)sample_weight參數(shù),讓每個(gè)樣本為總分提供加權(quán)貢獻(xiàn)。?
    其中一些僅限于二進(jìn)制分類(lèi)案例:

    ?
    precision_recall_curve(y_true, probas_pred)
    roc_curve(y_true, y_score[, pos_label, …])

    還有一些僅限于多分類(lèi)情形:

    ?
    cohen_kappa_score(y1, y2[, labels, weights, …])
    confusion_matrix(y_true, y_pred[, labels, …])
    hinge_loss(y_true, pred_decision[, labels, …])
    matthews_corrcoef(y_true, y_pred[, …])

    還有一些可用于多標(biāo)簽情形:

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

    一些是通常用于分級(jí)的:

    ?
    dcg_score(y_true, y_score[, k])
    ndcg_score(y_true, y_score[, k])

    而且許多是用于二分類(lèi)和多標(biāo)簽問(wèn)題的,但不適用于多分類(lèi):

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

    下面的章節(jié)中,我們會(huì)描述每一個(gè)函數(shù)。

    從二分類(lèi)到多分類(lèi)多標(biāo)簽

    ??一些度量基本上是針對(duì)二進(jìn)制分類(lèi)任務(wù)(例如f1_score,roc_auc_score)定義的。在這些情況下,假設(shè)默認(rèn)情況下,正類(lèi)標(biāo)記為1(盡管可以通過(guò)pos_label參數(shù)進(jìn)行配置),默認(rèn)情況下僅評(píng)估正標(biāo)簽。?
    ??將二進(jìn)制度量擴(kuò)展為多類(lèi)或多標(biāo)簽問(wèn)題時(shí),數(shù)據(jù)將被視為二分類(lèi)問(wèn)題的集合,即一對(duì)多類(lèi)型。下面是綜合二分類(lèi)度量的值的多種方法,不同的方法可能適用于不同的情況,通過(guò)參數(shù)average來(lái)選擇:

    • "macro"簡(jiǎn)單地計(jì)算二分類(lèi)度量的平均值,賦予每個(gè)類(lèi)別相同的權(quán)重。
    • "weighted"計(jì)算的是每個(gè)二分類(lèi)度量的加權(quán)平均。
    • "micro",每個(gè)二分類(lèi)對(duì)總體度量的貢獻(xiàn)是相等的(除了作為樣本權(quán)重的結(jié)果)。
    • "sample"僅適用于多標(biāo)簽問(wèn)題。它不計(jì)算每個(gè)類(lèi)別的度量,而是計(jì)算評(píng)估數(shù)據(jù)中每個(gè)樣本的真實(shí)和預(yù)測(cè)類(lèi)別的度量,并返回(sample_weight-weighted)平均值。
    • 選擇average = None將返回每個(gè)類(lèi)的分值。

    這里不懂的可以看下面章節(jié)——多分類(lèi)多標(biāo)簽分類(lèi)的例子?
    ??多標(biāo)簽數(shù)據(jù)用于指標(biāo)評(píng)估時(shí),也像二分類(lèi)的標(biāo)簽傳入一個(gè)類(lèi)別標(biāo)簽的數(shù)組,傳入的是一個(gè)標(biāo)簽矩陣,元素ij在樣本i的標(biāo)簽是j的時(shí)候取值為1,否則為0。

    精確度

    ??accuracy_score函數(shù)用于計(jì)算預(yù)測(cè)的精度。在多標(biāo)簽分類(lèi)中,函數(shù)返回子集精度。 如果樣本的整套預(yù)測(cè)標(biāo)簽與真正的標(biāo)簽組一致,則子集精度為1.0; 否則為0.0。如果y^iy^i是第i個(gè)樣本的預(yù)測(cè)值,yiyi是相應(yīng)的真實(shí)值,則nsamplesnsamples上的精度為:?
    accuracy(y,y^)=1nsamplesnsamples?1i=01(y^i=yi)accuracy(y,y^)=1nsamples∑i=0nsamples?11(y^i=yi)

    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) # 用計(jì)數(shù)的方式輸出精度 輸出:2

    ?

    '''多標(biāo)簽的情況''' accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2))) # 輸出 0.5

    ?

    解釋一下多標(biāo)簽的情況,先看樣本0——第一行,它的真實(shí)標(biāo)簽是[0, 1],預(yù)測(cè)標(biāo)簽為[1, 1],預(yù)測(cè)錯(cuò)誤。樣本1——第二行,它的真實(shí)標(biāo)簽是[1, 1],預(yù)測(cè)標(biāo)簽是[1, 1],預(yù)測(cè)正確。所以最后的預(yù)測(cè)精度為0.5。如果將參數(shù)normalize設(shè)為False的話,將輸出1,即表示預(yù)測(cè)正確了一個(gè)。

    Cohen’s kappa

    ??函數(shù)cohen_kappa_score()計(jì)算Cohen’s kappa統(tǒng)計(jì)量。這個(gè)方法是想比較不同的人表計(jì)的正確率,而非針對(duì)分類(lèi)器。kappa分?jǐn)?shù)是-1和1之間的數(shù)字。0.8以上的分?jǐn)?shù)通常被認(rèn)為是不錯(cuò)的結(jié)果; 零或更低表示沒(méi)有效果(就像瞎蒙的一樣)。?
    ??Kappa分?jǐn)?shù)可用于二分類(lèi)問(wèn)題或多分類(lèi)問(wèn)題,但不能用于多重標(biāo)簽問(wèn)題。

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

    ?

    混亂矩陣

    ??confusion_matrix()函數(shù)通過(guò)計(jì)算混亂矩陣來(lái)評(píng)估分類(lèi)精度。根據(jù)定義,元素ij表示:真實(shí)值為i,預(yù)測(cè)值為j的情況的個(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)

    ?

    解釋一下,對(duì)于元素(0, 0)的值為2,表示真實(shí)值為0,預(yù)測(cè)為0的次數(shù)為2次;元素(2,0)的值為1, 表示真實(shí)值為2, 預(yù)測(cè)為0的次數(shù)為1次。矩陣的所有元素和為2+1+1+2 = 6,表示一共有6個(gè)樣本參與預(yù)測(cè)。下圖是一個(gè)關(guān)于混亂矩陣的例子:?

    y_true = [0, 0, 0, 1, 1, 1, 1, 1] y_pred = [0, 1, 0, 1, 0, 1, 0, 1] '''t表示正例,f表示反例,n表示預(yù)測(cè)錯(cuò)誤,p表示預(yù)測(cè)正確''' tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() tn, fp, fn, tp # 輸出 (2, 1, 2, 3)

    ?

    分類(lèi)報(bào)告

    ??函數(shù)classification_report()創(chuàng)建了一個(gè)展示主要分類(lèi)度量指標(biāo)的文本報(bào)告,這是一個(gè)使用自定義target_name和內(nèi)部標(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'] cls_rpt = classification_report(y_true, y_pred, target_names=target_names) print cls_rpt print type(cls_rpt)

    ?

    可以看到,函數(shù)classification_report()的運(yùn)行結(jié)果是一個(gè)字符串,形如一個(gè)列表:列名是各種評(píng)分方法,行名是自定義的標(biāo)簽名字。

    漢明損失

    ??函數(shù)hamming_loss()計(jì)算兩組樣本之間的平均漢明損失或漢明距離。如果y^jy^j是給定樣本的第j個(gè)標(biāo)簽的預(yù)測(cè)值,則yjyj是相應(yīng)的真實(shí)值,而nlabelsnlabels是類(lèi)或標(biāo)簽的數(shù)量,則兩個(gè)樣本之間的漢明損失LhammingLhamming定義為:?
    LHamming(y,y^)=1nlabelsnlabels?1j=01(y^jyj)LHamming(y,y^)=1nlabels∑j=0nlabels?11(y^j≠yj)

    是不是感覺(jué)很熟悉,哈哈,回憶一下之前的accuracy_score()。但是,漢明損失前面分式的分母是標(biāo)簽個(gè)數(shù)而不像精確度一樣是樣本個(gè)數(shù),所以它們?cè)诙鄻?biāo)簽問(wèn)題的結(jié)果不一樣。漢明損失頗像下面的Jaccard相關(guān)系數(shù)。

    from sklearn.metrics import hamming_loss y_pred = [1, 2, 3, 4] y_true = [2, 2, 3, 4] hamming_loss(y_true, y_pred) # 二分類(lèi)單一標(biāo)簽 輸出 0.25
    • 1
    • 2
    • 3
    • 4
    hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2))) # 二分類(lèi)多標(biāo)簽 輸出:0.75
    • 1

    Jaccard 相似性相關(guān)系數(shù)

    ??jaccard_similarity_score()函數(shù)計(jì)算標(biāo)簽集對(duì)之間的平均(默認(rèn))或Jaccard相似系數(shù)的總和,也稱(chēng)為Jaccard索引。設(shè)真實(shí)標(biāo)簽集yiyi和預(yù)測(cè)標(biāo)簽集合y^iy^i,將第i個(gè)樣本的Jaccard相似系數(shù)定義為?
    Jyiy^i=|yiy^i||yiy^i|J(yi,y^i)=|yi∩y^i||yi∪y^i|。?
    在二分類(lèi)和多分類(lèi)中,Jaccard相似系數(shù)分?jǐn)?shù)等于分類(lèi)的精度。

    真實(shí)標(biāo)簽集與預(yù)測(cè)標(biāo)簽集的交集就是預(yù)測(cè)正確的部分;對(duì)于并集來(lái)說(shuō),一般情況下,預(yù)測(cè)機(jī)的結(jié)果都不會(huì)超綱,這種情況下并集就是真實(shí)標(biāo)簽集。然而在負(fù)載情況下,預(yù)測(cè)機(jī)的結(jié)果可能超出了真實(shí)標(biāo)簽集。?
    確實(shí)跟二分類(lèi)或多分類(lèi)的accuracy_score()很相似。但是對(duì)于多標(biāo)簽問(wèn)題,它們是截然不同的結(jié)果。

    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) # 輸出 0.75
    • 1

    到這里,都是大家常見(jiàn)的幾種評(píng)分方式,也比較好理解,諸君可能覺(jué)得有點(diǎn)無(wú)聊,那么下面就是重頭戲了。

    準(zhǔn)確率、召回率和F度量

    ??直觀地說(shuō),準(zhǔn)確率(presicion)是分類(lèi)器不錯(cuò)判的能力,并且召回率(recall)是分類(lèi)器找到正例的能力。

    • F-measure()(FβFβ和F1F1測(cè)量)可以解釋為presicion和recall的加權(quán)調(diào)和平均值,?FβFβ最大是1,最小是0。當(dāng)ββ?= 1時(shí),FβFβ和F1F1是等效的,并且此時(shí)回調(diào)和精度權(quán)值相等。
    • precision_recall_curve()通過(guò)改變判定閾值來(lái)計(jì)算關(guān)于真實(shí)值的presicion-recall曲線和分類(lèi)器分值。
    • average_precision_score()函數(shù)根據(jù)預(yù)測(cè)分?jǐn)?shù)計(jì)算出平均精度(AP)。該分?jǐn)?shù)對(duì)應(yīng)于presicion-recall曲線下的面積。該值在0和1之間,而且更高更好。?
      下面是幾個(gè)計(jì)算準(zhǔn)確率、召回率和F度量的函數(shù):
    functioncomment
    average_precision_score(y_true, y_score[, …]計(jì)算平均準(zhǔn)確度(AP)
    f1_score(y_true, y_pred[, labels, …])計(jì)算F1分?jǐn)?shù)
    fbeta_score(y_true, y_pred, beta[, labels, …])計(jì)算F-beta分?jǐn)?shù)
    precision_recall_curve(y_true, probas_pred)計(jì)算precision-recall曲線
    precision_recall_fscore_support(y_true, y_pred)計(jì)算準(zhǔn)確率、召回率、F度量和類(lèi)別數(shù)
    precision_score(y_true, y_pred[, labels, …])計(jì)算準(zhǔn)確度
    recall_score(y_true, y_pred[, labels, …])計(jì)算召回率

    PS:precision_recall_curve()函數(shù)僅限于二分類(lèi);average_precision_score()函數(shù)僅限于二分類(lèi)和多標(biāo)簽。

    二分類(lèi)

    ??在二進(jìn)制分類(lèi)任務(wù)中,術(shù)語(yǔ)positive和negative是指分類(lèi)器的預(yù)測(cè)情況,術(shù)語(yǔ)true和false是指該預(yù)測(cè)是否對(duì)應(yīng)于外部判斷 有時(shí)被稱(chēng)為’觀察”)。 給出這些定義,我們可以制定下表:

    ?真實(shí)類(lèi)別 (observation)
    預(yù)測(cè)類(lèi)別(expectation)tp (true positive) 預(yù)測(cè)為positive,預(yù)測(cè)正確fp (false positive) 預(yù)測(cè)為positive,預(yù)測(cè)錯(cuò)誤
    fn (false negative)預(yù)測(cè)為negetive,預(yù)測(cè)錯(cuò)誤tn (true negative)預(yù)測(cè)為negetive,預(yù)測(cè)正確

    定義準(zhǔn)確率、召回率和F度量:?
    precision=tptp+fpprecision=tptp+fp,?
    recall=tptp+fnrecall=tptp+fn,?
    Fβ=(1+β2)precision×recallβ2precision+recallFβ=(1+β2)precision×recallβ2precision+recall.?
    例程:

    from sklearn import metrics y_pred = [0, 1, 0, 0] y_true = [0, 1, 0, 1] print metrics.precision_score(y_true, y_pred) # 準(zhǔn)確率 輸出:1.0 print metrics.recall_score(y_true, y_pred) # 召回率 輸出: 0.5 print metrics.f1_score(y_true, y_pred) # f1分?jǐn)?shù) 輸出:0.66 print metrics.fbeta_score(y_true, y_pred, beta=0.5) # f-beta 輸出: 0.83 print metrics.fbeta_score(y_true, y_pred, beta=1) # 輸出: 0.66,與f1分?jǐn)?shù)相等 print metrics.fbeta_score(y_true, y_pred, beta=2) # 輸出: 0.55 print metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5) # 最后輸出數(shù)組(array([ 0.66..., 1. ]), array([ 1. , 0.5]), array([ 0.71..., 0.83...]), array([2, 2]...))

    ?

    最后一個(gè),函數(shù)metrics.precision_recall_fscore_support()的輸出比較復(fù)雜,其實(shí)它是輸出了很多結(jié)果。首先樣本數(shù)據(jù)一共有2中標(biāo)簽:0和1,所以輸出是成對(duì)的,分別對(duì)應(yīng)著兩種類(lèi)別。然后4組數(shù)據(jù)分別表示:準(zhǔn)確率、召回率、f度量和支持的類(lèi)別數(shù)。

    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) '''可以看到準(zhǔn)確率和召回率是負(fù)相關(guān)的''' print precision # 輸出: array([ 0.66..., 0.5 , 1. , 1. ]) print recall # 輸出: array([ 1. , 0.5, 0.5, 0. ]) print threshold # 輸出: array([ 0.35, 0.4 , 0.8 ]) print average_precision_score(y_true, y_scores) # 輸出: 0.83...

    ?

    多分類(lèi)多標(biāo)簽

    ??在多類(lèi)和多標(biāo)簽分類(lèi)任務(wù)中,準(zhǔn)確率、召回率和F度量的概念可以獨(dú)立地應(yīng)用于每個(gè)類(lèi)別。 如上所述,有幾種cross標(biāo)簽的方法:特別是由average參數(shù)指定為average_precision_score(僅限多標(biāo)簽),f1_score,fbeta_score,precision_recall_fscore_support,precision_score和recall_score函數(shù)。?
    聲明一波記號(hào):

    • y表示預(yù)測(cè)值
    • y^y^表示預(yù)測(cè)結(jié)果正確與否
    • L表示標(biāo)簽集
    • S表示樣本集
    • ysys表示樣本子集
    • ylyl表示標(biāo)簽子集
    • y^sy^s和y^ly^l同理
    • P(A,B):=|AB||A|P(A,B):=|A∩B||A|
    • R(A,B):=|AB||B|R(A,B):=|A∩B||B|
    • Fβ(A,B):=(1+β2)P(A,B)×R(A,B)β2P(A,B)+R(A,B)Fβ(A,B):=(1+β2)P(A,B)×R(A,B)β2P(A,B)+R(A,B)?
      然后,一些度量指標(biāo)定義為:?
    from sklearn import metrics y_true = [0, 1, 2, 0, 1, 2] y_pred = [0, 2, 1, 0, 0, 1] print metrics.precision_score(y_true, y_pred, average='macro') # 輸出:0.22 print metrics.recall_score(y_true, y_pred, average='micro') # 輸出:0.33 print metrics.f1_score(y_true, y_pred, average='weighted') # 輸出:0.26 print metrics.fbeta_score(y_true, y_pred, average='macro', beta=0.5) # 輸出:0.23 print metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5, average=None) #輸出:數(shù)組如下 # (array([ 0.66..., 0. , 0. ]), array([ 1., 0., 0.]), array([ 0.71..., 0. , 0. ]), array([2, 2, 2]...))

    ?

    解釋一下:對(duì)于標(biāo)簽0, 1, 2,它們的準(zhǔn)確率分別是2323,?0202和0101。所以macro的計(jì)算方式是13?(23+02+01)13?(23+02+01);micro的計(jì)算方式是2+0+03+2+12+0+03+2+1,即分子相加除以分母相加。

    print metrics.recall_score(y_true, y_pred, labels=[1, 2], average='micro') # 輸出:0.0 print metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro') # 輸出:0.166..
    • 1
    • 2

    上面代碼顯示了label參數(shù)的作用。

    Hinge損失

    ??hinge_loss()函數(shù)使用hinge損失計(jì)算模型和數(shù)據(jù)之間的平均距離,這是僅考慮預(yù)測(cè)誤差的單側(cè)度量。 (Hinge損失用于最大化邊緣分類(lèi)器,如SVM支持向量機(jī))如果標(biāo)簽用+1和-1編碼,則y是真實(shí)值,w是由decision_function()輸出的預(yù)測(cè)值,則hinge損失定義為:?
    LHingeyw=max{1?wy0}=|1?wy|+LHinge(y,w)=max{1?wy,0}=|1?wy|+?
    如果有兩個(gè)以上的標(biāo)簽,則由于Crammer&Singer,hinge_loss()使用了多類(lèi)型變體。?
    如果ywyw是真實(shí)標(biāo)簽的預(yù)測(cè)值,并且ytyt是所有其他標(biāo)簽的預(yù)測(cè)值的最大值,其中通過(guò)決策函數(shù)輸出預(yù)測(cè)值,則多類(lèi)hing損失由以下定義:?
    LHingeywyt=max{1+yt?yw0}LHinge(yw,yt)=max{1+yt?yw,0}?
    這里有一個(gè)小例子演示了在二分類(lèi)問(wèn)題中使用svm分類(lèi)器和hinge_loss函數(shù):

    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) # 訓(xùn)練好線性分類(lèi)器 pred_decision = est.decision_function([[-2], [3], [0.5]]) print pred_decision # 輸出預(yù)測(cè)值:array([-2.18..., 2.36..., 0.09...]) print hinge_loss([-1, 1, 1], pred_decision) # 輸出:0.3...

    ?

    下面的例子演示了多分類(lèi)問(wèn)題中,使用svm分類(lèi)器和hinge_loss函數(shù):

    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) pred_decision = est.decision_function([[-1], [2], [3]]) y_true = [0, 2, 3] hinge_loss(y_true, pred_decision, labels) # 輸出:0.56...

    ?

    Log損失

    ??log損失也稱(chēng)logistic回歸損失或交叉熵?fù)p失,是一個(gè)建立在概率上的定義。它通常用于(多項(xiàng)式)邏輯回歸和神經(jīng)網(wǎng)絡(luò),以及期望最大化的一些變體中。?
    log損失是一個(gè)負(fù)值:?
    Llog(yp)=?logPr(y|p)=?(ylog(p)+(1?y)log(1?p))Llog(y,p)=?log?Pr?(y|p)=?(ylog?(p)+(1?y)log?(1?p))?
    這可以擴(kuò)展到如下多種情形:?
    Llog(Y,P)=logPr(Y|P)=?1NN?1i=0K?1k=0yi,klogpi,kLlog(Y,P)=log?Pr?(Y|P)=?1N∑i=0N?1∑k=0K?1yi,klog?pi,k

    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ù)測(cè)值是概率。比如y_pred[0]為[0.9, 0.1]表示,預(yù)測(cè)為0的概率是0.9,預(yù)測(cè)為1的概率是0.1。?
    下面將0.1738是怎么計(jì)算出來(lái)的。首先應(yīng)該知道,在log損失中,y的值只有0和1,其概率的和是1。?
    還是對(duì)于第一個(gè)樣本y_pred[0],其log損失為?(0×log(0.9)+1×log(0.9))?(0×log(0.9)+1×log(0.9)),然后求剩余的1、2、3樣本并取平均值可得log損失。

    Matthews 相關(guān)系數(shù)

    ??matthews_corrcoef函數(shù)計(jì)算二進(jìn)制類(lèi)的Matthews相關(guān)系數(shù)(MCC)。引用維基百科:

    “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相關(guān)系數(shù)(MCC)用于機(jī)器學(xué)習(xí),作為二分類(lèi)質(zhì)量的量度。它考慮到正例反例、判斷對(duì)判斷錯(cuò),通常被認(rèn)為是可以使用的平衡措施,即使類(lèi)別大小極其不同。 MCC本質(zhì)上是-1和+1之間的相關(guān)系數(shù)值。系數(shù)+1表示完美預(yù)測(cè),0表示平均隨機(jī)預(yù)測(cè),-1表示反向預(yù)測(cè)。統(tǒng)計(jì)學(xué)也稱(chēng)為phi系數(shù)。

    在二分類(lèi)的情況下,tp,tn,fp和fn分別是真正例,真反例,假正例和假反例數(shù),MCC定義為?
    MCC=tp×tn?fp×fn(tp+fp)(tp+fn)(tn+fp)(tn+fn)√MCC=tp×tn?fp×fn(tp+fp)(tp+fn)(tn+fp)(tn+fn).?
    在多類(lèi)案例中,馬修斯相關(guān)系數(shù)可以用K類(lèi)的混淆矩陣C來(lái)定義。為了簡(jiǎn)化定義,考慮以下中間變量:

    • tk=KiCiktk=∑iKCik真正發(fā)生類(lèi)k的次數(shù),
    • pk=KiCkipk=∑iKCkik類(lèi)被預(yù)測(cè)的次數(shù),
    • c=KkCkkc=∑kKCkk正確預(yù)測(cè)的樣本總數(shù),
    • s=KiKjCijs=∑iK∑jKCij樣本總數(shù)。

    然后將多類(lèi)MCC定義為:?
    MCC=c×s?Kkpk×tk(s2?Kkp2k)×(s2?Kkt2k)√MCC=c×s?∑kKpk×tk(s2?∑kKpk2)×(s2?∑kKtk2)?
    當(dāng)有兩個(gè)以上的標(biāo)簽時(shí),MCC的值將不再在-1和+1之間。相反,根據(jù)真實(shí)標(biāo)簽的數(shù)量和分布,最小值將在-1和0之間,最大值始終為+1。?
    這是一個(gè)小例子,說(shuō)明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

    ?

    總之,Matthews相關(guān)系數(shù)也是一個(gè)根據(jù)真實(shí)值和預(yù)測(cè)值對(duì)預(yù)測(cè)模型進(jìn)行評(píng)分的一個(gè)方法

    ROC

    ??函數(shù)roc_curve()計(jì)算 receiver operating characteristic curve或者說(shuō)是ROC曲線。 引用維基百科:

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

    大意:

    ROC或者是ROC曲線,是一個(gè)圖形圖,說(shuō)明了二分類(lèi)系統(tǒng)在鑒別閾值變化的情形下的性能。它通過(guò)在不同閾值設(shè)置下,TPR(正例中判對(duì)的概率)與FPR(被錯(cuò)判為正例的概率)。TPR又稱(chēng)為敏感度,FPR是1減去反例判對(duì)的概率。

    該函數(shù)需要正確的二分類(lèi)值和目標(biāo)分?jǐn)?shù),這可以是正類(lèi)的概率估計(jì),置信度值或二分類(lèi)判決。 這是一個(gè)如何使用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) print fpr # 輸出:[ 0. 0.5 0.5 1. ] print tpr # 輸出:[ 0.5 0.5 1. 1. ] print thresholds # 輸出:[ 0.8 0.4 0.35 0.1 ]

    ?

    thresholds閾值的意義:所有的樣本都要和這個(gè)閾值比較,如果大于這個(gè)閾值就是正例。所以,這個(gè)閾值越大,反例被錯(cuò)判為正例的可能性越小,當(dāng)然,很多比較小的正例也會(huì)被忽略從而導(dǎo)致TPR也較小。

    下圖是一個(gè)ROC曲線的例子:?
    ?
    roc_auc_score()函數(shù)計(jì)算ROC曲線下面積,也由AUC或AUROC表示。 通過(guò)計(jì)算roc曲線下的面積,曲線信息總結(jié)為一個(gè)數(shù)字。

    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)簽分類(lèi)中,roc_auc_score()函數(shù)通過(guò)如上所述的標(biāo)簽平均來(lái)擴(kuò)展。?
    與諸如子集精確度,漢明損失或F1度量相比,ROC不需要優(yōu)化每個(gè)標(biāo)簽的閾值。 如果預(yù)測(cè)的輸出已被二進(jìn)制化,則roc_auc_score()函數(shù)也可用于多類(lèi)分類(lèi)。

    0-1損失

    ??zero_one_loss()函數(shù)通過(guò)nsamplesnsamples計(jì)算0-1分類(lèi)損失(L0?1)(L0?1)的和或平均值。 默認(rèn)情況下,函數(shù)對(duì)樣本進(jìn)行標(biāo)準(zhǔn)化。 要獲得L0?1L0?1的總和,將其normalize參數(shù)置為False。?
    ??在多標(biāo)簽分類(lèi)中,如果所有預(yù)測(cè)標(biāo)簽與真實(shí)標(biāo)簽嚴(yán)格匹配,則zero_one_loss()為1,如果存在任何錯(cuò)誤,則為0。 默認(rèn)情況下,函數(shù)返回對(duì)子集不完全預(yù)測(cè)的百分比, 如果想讓函數(shù)返回個(gè)數(shù),設(shè)置normalize參數(shù)為False如果y^iy^i是第i個(gè)樣本的預(yù)測(cè)值,yiyi是相應(yīng)的真實(shí)值,則0-1損失L0?1L0?1定義為:?
    L0?1(yi,y^i)=1(y^iyi)L0?1(yi,y^i)=1(y^i≠yi)

    from sklearn.metrics import zero_one_loss y_pred = [1, 2, 3, 4] y_true = [2, 2, 3, 4] print zero_one_loss(y_true, y_pred) # 輸出:0.25 表示預(yù)測(cè)錯(cuò)誤的百分比是0.25 print zero_one_loss(y_true, y_pred, normalize=False) # 輸出:1 表示有1個(gè)預(yù)測(cè)錯(cuò)誤

    ?

    print zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2))) # 輸出:0.5 print zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)), normalize=False) # 輸出1
    • 1
    • 2

    似乎跟前面的accuracy_score()有點(diǎn)像(我覺(jué)得是一樣的)。

    Brier score損失

    ??brier_score_loss()函數(shù)計(jì)算二分類(lèi)的Brier分?jǐn)?shù)。引用維基百科:

    The Brier score is a proper score function that measures the accuracy of probabilistic predictions. It is applicable to tasks in which predictions must assign probabilities to a set of mutually exclusive discrete outcomes.

    Brier分?jǐn)?shù)在用于衡量預(yù)測(cè)的準(zhǔn)確性方面,是一個(gè)合適的評(píng)分函數(shù)。它適用于預(yù)測(cè)必須將概率分配給一組相互排斥的離散結(jié)果的任務(wù)。

    ??該函數(shù)返回實(shí)際結(jié)果與可能結(jié)果的預(yù)測(cè)概率之間的均方差的得分。實(shí)際結(jié)果必須為1或0(真或假),而實(shí)際結(jié)果的預(yù)測(cè)概率可以是0到1之間的值。Brier損失也在0到1之間,分?jǐn)?shù)越低(均方差越小),預(yù)測(cè)越準(zhǔn)確。它可以被認(rèn)為是對(duì)一組概率預(yù)測(cè)的“校準(zhǔn)”的度量。?
    BS=1NNt=1(ft?ot)2BS=1N∑t=1N(ft?ot)2?
    其中:N是預(yù)測(cè)的總數(shù),ftft是實(shí)際結(jié)果otot的預(yù)測(cè)概率。?
    這是一個(gè)使用這個(gè)函數(shù)的小例子:

    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]) print brier_score_loss(y_true, y_prob) # 輸出;0.055 print brier_score_loss(y_true, 1-y_prob, pos_label=0) # 輸出;0.055 print brier_score_loss(y_true_categorical, y_prob, pos_label="ham") # 輸出;0.055 print brier_score_loss(y_true, y_prob > 0.5) # 輸出;0

    可以看到與之前不同的地方:真實(shí)標(biāo)簽y_true輸入的不管是字符串還是數(shù)字都沒(méi)有規(guī)定正例or反例,而是通過(guò)brier_score_loss()函數(shù)的pos_lable參數(shù)決定的。

    多標(biāo)簽分級(jí)度量

    ??在多標(biāo)簽學(xué)習(xí)中,每個(gè)樣本可以具有與之相關(guān)的任何數(shù)量的真實(shí)標(biāo)簽,最后靠近真實(shí)標(biāo)簽的獲得更高的分值和等級(jí)。

    Coverage誤差

    ??coverage_error()函數(shù)計(jì)算包含在最終預(yù)測(cè)中的標(biāo)簽的平均數(shù),以便預(yù)測(cè)所有真正的標(biāo)簽。如果您想知道有多少頂級(jí)評(píng)分標(biāo)簽,您必須平均預(yù)測(cè),而不會(huì)丟失任何真正的標(biāo)簽,這很有用。因此,此指標(biāo)的最好的情況(也就是最小值)是正確標(biāo)簽的平均數(shù)量。?
    注意:我們的實(shí)現(xiàn)的分?jǐn)?shù)比Tsoumakas等人在2010年提供的分?jǐn)?shù)大1。這樣就可以包含一種特例:實(shí)例的正確標(biāo)簽為0。?
    ??給定一個(gè)二進(jìn)制的真實(shí)標(biāo)簽矩陣,y?{0,1}nsamples×nlabels∈{0,1}nsamples×nlabels?,和相應(yīng)的分值f^Rnsamples×nlabelsf^∈Rnsamples×nlabels,coverage被定義為:?
    coverage(y,f^)=1nsamplesnsamples?1i=0maxj:yij=1rankijcoverage(y,f^)=1nsamples∑i=0nsamples?1maxj:yij=1rankij?
    其中,rankij=∣∣{k:f^ikf^ij}∣∣rankij=|{k:f^ik≥f^ij}|。?
    這是一個(gè)使用這個(gè)功能的小例子:

    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

    ?

    首先:這是一個(gè)用于多標(biāo)簽的誤差計(jì)算函數(shù)。其次,具體怎么算的筆者也不太清楚,歡迎大家在回復(fù)里指教,最后這個(gè)誤差的意義我是知道的:?
    上面例子的y_score實(shí)際上是一個(gè)rank(可以想成排名,積分)列表,只要真實(shí)標(biāo)簽中的1對(duì)應(yīng)的y_score中的值(也就是它的rank)是最大的,則誤差最小,最小為nlabel=1nsamplesnlabel=1nsamples。反之,當(dāng)真是標(biāo)簽中的1對(duì)應(yīng)的y_score中的值是最小的,則誤差最大,最大為nlabel=1nlabel=1。

    分級(jí)標(biāo)簽平均準(zhǔn)確度

    ??label_ranking_average_precision_score()函數(shù)實(shí)現(xiàn)標(biāo)簽rank的平均精度(LRAP)。該度量值與average_precision_score()函數(shù)相關(guān),但是基于標(biāo)簽rank的信息,而不是準(zhǔn)確率和召回率。?
    ??標(biāo)簽rank的平均精度(LRAP)是分配給每個(gè)樣本的,rank一般較高真實(shí)標(biāo)簽對(duì)rank一般較低的總標(biāo)簽的比率的平均值。如果能夠?yàn)槊總€(gè)樣本相關(guān)標(biāo)簽提供更好的rank,這個(gè)指標(biāo)就會(huì)產(chǎn)生更好的分?jǐn)?shù)。獲得的分?jǐn)?shù)總是嚴(yán)格大于0,最佳值為1。如果每個(gè)樣本只有一個(gè)相關(guān)標(biāo)簽,則標(biāo)簽排名平均精度等于mean reciprocal rank。?
    ??給定一個(gè)二進(jìn)制標(biāo)簽矩陣,即yRnsamples×nlabelsy∈Rnsamples×nlabels,以及它的對(duì)應(yīng)的預(yù)測(cè)rankf^Rnsamples×nlabelsf^∈Rnsamples×nlabels,則平均精度定義為?
    LRAP(y,f^)=1nsamplesnsamples?1i=01|yi|j:yij=1|Lij|rankijLRAP(y,f^)=1nsamples∑i=0nsamples?11|yi|∑j:yij=1|Lij|rankij?
    其中Lij={k:yik=1,f^ikf^ij}Lij={k:yik=1,f^ik≥f^ij},rankij=∣∣{k:f^ikf^ij}∣∣rankij=|{k:f^ik≥f^ij}|?
    這是一個(gè)使用這個(gè)功能的小例子:

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

    ?

    這個(gè)的公式只能說(shuō)比上一個(gè)coverage_error()函數(shù)的方法更復(fù)雜,但是它們是同根同源的,解決的是同一個(gè)問(wèn)題。只要知道這個(gè)函數(shù)的最大值是1,最小值大于0就行了。

    分級(jí)損失

    ??label_ranking_loss()函數(shù)計(jì)算在樣本上的排序錯(cuò)誤(即正例的rank低于反例)的標(biāo)簽的rank損失的平均值(由正例和反例的倒數(shù)加權(quán)),最小值為0。?
    ??給定一個(gè)二進(jìn)制標(biāo)簽矩陣y{0,1}nsamples×nlabelsy∈{0,1}nsamples×nlabels,相應(yīng)的預(yù)測(cè)rank為f^Rnsamples×nlabelsf^∈Rnsamples×nlabels,排名損失定義為:?
    ranking\_loss(y,f^)=1nsamplesnsamples?1i=01|yi|(nlabels?|yi|)∣∣{(k,l):f^ik<f^il,yik=1,yil=0}∣∣ranking\_loss(y,f^)=1nsamples∑i=0nsamples?11|yi|(nlabels?|yi|)|{(k,l):f^ik<f^il,yik=1,yil=0}|。?
    這是一個(gè)使用這個(gè)功能的小例子:

    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]]) # 這樣就能輸出最小loss label_ranking_loss(y_true, y_score) # 輸出:0.0

    ?

    再次,公式不懂,但是label_ranking_loss()還是與上面兩種都是同一問(wèn)題解決方法的不同表達(dá)。

    回歸度量

    ??sklearn.metrics模塊實(shí)現(xiàn)了幾個(gè)損失,評(píng)分和工具函數(shù)來(lái)衡量回歸表現(xiàn)。其中一些已被增強(qiáng)以處理多輸出情形:mean_squared_error(),mean_absolute_error(),explain_variance_score()和r2_score()。?
    ??這些函數(shù)具有一個(gè)multioutput關(guān)鍵字參數(shù),用于指定平均每個(gè)目標(biāo)的分?jǐn)?shù)或損失的方式。默認(rèn)值為'uniform_average',它指定輸出均勻加權(quán)均值。如果傳遞形如(n_outputs,)的數(shù)組,則將其解釋為權(quán)重,并返回相應(yīng)的加權(quán)平均值。如果指定了多重輸出為'raw_values',則所有未更改的單個(gè)分?jǐn)?shù)或損失將以形狀數(shù)組(n_outputs,)返回。?
    ??r2_score()和interpret_variance_score()為multioutput參數(shù)接受一個(gè)附加值'variance_weighted'。該選項(xiàng)通過(guò)相應(yīng)目標(biāo)變量的方差導(dǎo)出每個(gè)單獨(dú)得分的加權(quán)。此設(shè)置量化了全局捕獲的未縮放的方差。如果目標(biāo)變量的scale范圍不同,則該分?jǐn)?shù)更好地解釋較高的方差變量。對(duì)于向后兼容性,multioutput ='variance_weighted'是r2_score()的默認(rèn)值。將來(lái)會(huì)更改為uniform_average。

    Explained variance score

    ??explain_variance_score()計(jì)算explained variance regression score.。?
    如果y^y^是估計(jì)的目標(biāo)輸出,則y為相應(yīng)的(正確)目標(biāo)輸出,Var為方差,標(biāo)準(zhǔn)偏差的平方,則說(shuō)明的方差估計(jì)如下:?
    explained_variance(y,y^)=1?Var{y?y^}Var{y}explained_variance(y,y^)=1?Var{y?y^}Var{y}?
    最好的分?jǐn)?shù)是1.0,值越低越差。?
    以下是explain_variance_score()函數(shù)的一個(gè)小例子:

    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]] print explained_variance_score(y_true, y_pred, multioutput='raw_values') # 輸出:[ 0.967..., 1. ] print explained_variance_score(y_true, y_pred, multioutput=[0.3, 0.7]) # 輸出:0.990...

    ?

    兩個(gè)方差的比值?解釋方差?這個(gè)分值有什么用?

    均值絕對(duì)誤差

    ??mean_absolute_error()函數(shù)計(jì)算平均絕對(duì)誤差,對(duì)應(yīng)于絕對(duì)誤差損失或l1范數(shù)損失的預(yù)期值的風(fēng)險(xiǎn)度量。如果y^iy^i是第i個(gè)樣本的預(yù)測(cè)值,yiyi是相應(yīng)的真實(shí)值,則在nsamplesnsamples上估計(jì)的平均絕對(duì)誤差(MAE)被定義為?
    MAE(y,y^)=1nsamplesnsamples?1i=0|yi?y^i|.MAE(y,y^)=1nsamples∑i=0nsamples?1|yi?y^i|.?
    這是一個(gè)使用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

    ?

    print mean_absolute_error(y_true, y_pred, multioutput='raw_values') # 輸出:【0.5, 1】 print mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]) # 輸出:0.849...

    ?

    均值平方誤差

    ??mean_squared_error()函數(shù)計(jì)算均方誤差,與平方(二次)誤差或損失的預(yù)期值對(duì)應(yīng)的風(fēng)險(xiǎn)度量。如果y^iy^i是第i個(gè)樣本的預(yù)測(cè)值,yiyi是相應(yīng)的真實(shí)值,則在nsamplesnsamples上估計(jì)的均方誤差(MSE)被定義為?
    MSE(y,y^)=1nsamplesnsamples?1i=0(yi?y^i)2.MSE(y,y^)=1nsamples∑i=0nsamples?1(yi?y^i)2.?
    這是一個(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] print 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]] print mean_squared_error(y_true, y_pred) # 輸出:0.7083

    ?

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

    ??mean_squared_log_error()函數(shù)計(jì)算對(duì)應(yīng)于平方對(duì)數(shù)(二次)誤差或損失的預(yù)期值的風(fēng)險(xiǎn)度量。如果y^iy^i是第i個(gè)樣本的預(yù)測(cè)值,yiyi是相應(yīng)的真實(shí)值,則在nsamplesnsamples上估計(jì)的均方對(duì)數(shù)誤差(MSLE)被定義為?
    MSLE(y,y^)=1nsamplesnsamples?1i=0(loge(1+yi)?loge(1+y^i))2.MSLE(y,y^)=1nsamples∑i=0nsamples?1(loge?(1+yi)?loge?(1+y^i))2.。?
    其中loge(x)loge?(x)表示x的自然對(duì)數(shù)。 當(dāng)目標(biāo)具有指數(shù)增長(zhǎng)的目標(biāo)時(shí),最適合使用這一指標(biāo),例如人口數(shù)量,商品在一段時(shí)間內(nèi)的平均銷(xiāo)售額等。

    注意,該度量對(duì)低于真實(shí)值的預(yù)測(cè)更加敏感。

    這是一個(gè)使用mean_squared_log_error函數(shù)的小例子:

    from sklearn.metrics import mean_squared_log_error y_true = [3, 5, 2.5, 7] y_pred = [2.5, 5, 4, 8] print 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]] print mean_squared_log_error(y_true, y_pred) # 輸出:0.044

    ?

    中位數(shù)絕對(duì)誤差

    ??median_absolute_error()是非常有趣的,因?yàn)樗梢詼p弱異常值的影響。 通過(guò)取目標(biāo)和預(yù)測(cè)之間的所有絕對(duì)差值的中值來(lái)計(jì)算損失。如果y^iy^i是第i個(gè)樣本的預(yù)測(cè)值,yiyi是相應(yīng)的真實(shí)值,則在nsamplesnsamples上估計(jì)的中值絕對(duì)誤差(MedAE)被定義為?
    MedAE(y,y^)=median(y1?y^1,,yn?y^n)MedAE(y,y^)=median(∣y1?y^1∣,…,∣yn?y^n∣)

    median_absolute_error()不支持multioutput。

    這是一個(gè)使用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

    ?

    R2R2?score,定義相關(guān)性

    ??r2_score()函數(shù)計(jì)算R^2,即確定系數(shù),可以表示特征模型對(duì)特征樣本預(yù)測(cè)的好壞。 最佳分?jǐn)?shù)為1.0,可以為負(fù)數(shù)(因?yàn)槟P涂赡軙?huì)更糟)。對(duì)于一個(gè)總是在預(yù)測(cè)y的期望值時(shí)不關(guān)注輸入特征的連續(xù)模型,它的R^2分值是0.0。如果y^iy^i是第i個(gè)樣本的預(yù)測(cè)值,yiyi是相應(yīng)的真實(shí)值,則在nsamplesnsamples上估計(jì)的分?jǐn)?shù)R^2被定義為?
    R2(y,y^)=1?nsamples?1i=0(yi?y^i)2nsamples?1i=0(yi?yˉ)2R2(y,y^)=1?∑i=0nsamples?1(yi?y^i)2∑i=0nsamples?1(yi?yˉ)2?
    其中yˉ=1nsamplesnsamples?1i=0yiyˉ=1nsamples∑i=0nsamples?1yi?
    這是使用r2_score()函數(shù)的一個(gè)小例子:

    from sklearn.metrics import r2_score y_true = [3, -0.5, 2, 7] y_pred = [2.5, 0.0, 2, 8] print 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]] print 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]] print r2_score(y_true, y_pred, multioutput='uniform_average') # 0.936... print r2_score(y_true, y_pred, multioutput='raw_values') # [ 0.965..., 0.908...] print r2_score(y_true, y_pred, multioutput=[0.3, 0.7]) # 0.925...

    聚類(lèi)度量

    ??sklearn.metrics模塊實(shí)現(xiàn)了多種損失函數(shù)、評(píng)分函數(shù)和工具函數(shù)。 有關(guān)更多信息,請(qǐng)參閱集聚類(lèi)性能評(píng)估部分。

    簡(jiǎn)陋評(píng)分器

    ??在進(jìn)行監(jiān)督學(xué)習(xí)的過(guò)程中,簡(jiǎn)單清晰的檢查包括將一個(gè)估計(jì)模型與簡(jiǎn)單的經(jīng)驗(yàn)法則進(jìn)行比較。?DummyClassifier實(shí)現(xiàn)了幾種簡(jiǎn)單的分類(lèi)策略:

    • stratified根據(jù)訓(xùn)練數(shù)據(jù)類(lèi)的分布產(chǎn)生隨機(jī)數(shù)據(jù)。
    • most_frequent總是將結(jié)果預(yù)測(cè)為訓(xùn)練集中最常用的標(biāo)簽。
    • prior總是預(yù)測(cè)為先前最大的那個(gè)類(lèi)。
    • uniform產(chǎn)生均勻隨機(jī)預(yù)測(cè)。
    • constant總是預(yù)測(cè)為用戶(hù)提供的常量標(biāo)簽。這種方法的主要靠的是F1分值,此時(shí)的正例數(shù)量較小。

    為了說(shuō)明DummyClassifier,首先讓我們創(chuàng)建一個(gè)不平衡的數(shù)據(jù)集:

    from sklearn.datasets import load_iris from sklearn.model_selection 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)

    ?

    然后再來(lái)比較一下SVC和most_frequent:

    from sklearn.dummy import DummyClassifier from sklearn.svm import SVC clf = SVC(kernel='linear', C=1).fit(X_train, y_train) print clf.score(X_test, y_test) # 0.63... clf = DummyClassifier(strategy='most_frequent',random_state=0) clf.fit(X_train, y_train) print clf.score(X_test, y_test) # 0.57...

    ?

    可以看出,SVC的效果不比簡(jiǎn)陋的分類(lèi)器(dummy classifier)號(hào)多少,下面,讓我們換一下svc的核函數(shù):

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

    ??我們看到準(zhǔn)確率提高到近100%。建議使用交叉驗(yàn)證策略,以便更好地估計(jì)精度。更一般地說(shuō),當(dāng)分類(lèi)器的準(zhǔn)確度太接近隨機(jī)時(shí),這可能意味著出現(xiàn)了一些問(wèn)題:特征沒(méi)有幫助,超參數(shù)沒(méi)有正確調(diào)整,數(shù)據(jù)分布不平衡等?
    DummyRegressor還實(shí)現(xiàn)了四個(gè)簡(jiǎn)單的經(jīng)驗(yàn)法則:

      • mean:預(yù)測(cè)訓(xùn)練目標(biāo)的平均值。
      • median:預(yù)測(cè)訓(xùn)練目標(biāo)的中位數(shù)。
      • quantile:預(yù)測(cè)用戶(hù)提供的分?jǐn)?shù)量的訓(xùn)練目標(biāo)。
      • constant:預(yù)測(cè)用戶(hù)提供的常數(shù)值。

    轉(zhuǎn)載于:https://www.cnblogs.com/sddai/p/9581030.html

    總結(jié)

    以上是生活随笔為你收集整理的模型评估——定量分析预测的质量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。