0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)器學(xué)習(xí)實(shí)用指南——準(zhǔn)確率與召回率

lviY_AI_shequ ? 來源:未知 ? 作者:李倩 ? 2018-06-19 15:20 ? 次閱讀

準(zhǔn)確率與召回率

Scikit-Learn 提供了一些函數(shù)去計(jì)算分類器的指標(biāo),包括準(zhǔn)確率和召回率。

>>> from sklearn.metrics import precision_score, recall_score >>> precision_score(y_train_5, y_pred) # == 4344 / (4344 + 1307) 0.76871350203503808 >>> recall_score(y_train_5, y_train_pred) # == 4344 / (4344 + 1077) 0.79136690647482011

當(dāng)你去觀察精度的時(shí)候,你的“數(shù)字 5 探測(cè)器”看起來還不夠好。當(dāng)它聲明某張圖片是 5 的時(shí)候,它只有 77% 的可能性是正確的。而且,它也只檢測(cè)出“是 5”類圖片當(dāng)中的 79%。

通常結(jié)合準(zhǔn)確率和召回率會(huì)更加方便,這個(gè)指標(biāo)叫做“F1 值”,特別是當(dāng)你需要一個(gè)簡(jiǎn)單的方法去比較兩個(gè)分類器的優(yōu)劣的時(shí)候。F1 值是準(zhǔn)確率和召回率的調(diào)和平均。普通的平均值平等地看待所有的值,而調(diào)和平均會(huì)給小的值更大的權(quán)重。所以,要想分類器得到一個(gè)高的 F1 值,需要召回率和準(zhǔn)確率同時(shí)高。

公式 3-3 F1 值

$$ F1 = \frac{2}{\frac{1}{precision} + \frac{1}{recall}} = 2 * \frac{precison * recall}{precison + recall} = \frac{TP}{TP + \frac{FN + FP}{2}} $$

為了計(jì)算 F1 值,簡(jiǎn)單調(diào)用f1_score()

>>> from sklearn.metrics import f1_score >>> f1_score(y_train_5, y_pred) 0.78468208092485547

F1 支持那些有著相近準(zhǔn)確率和召回率的分類器。這不會(huì)總是你想要的。有的場(chǎng)景你會(huì)絕大程度地關(guān)心準(zhǔn)確率,而另外一些場(chǎng)景你會(huì)更關(guān)心召回率。舉例子,如果你訓(xùn)練一個(gè)分類器去檢測(cè)視頻是否適合兒童觀看,你會(huì)傾向選擇那種即便拒絕了很多好視頻、但保證所保留的視頻都是好(高準(zhǔn)確率)的分類器,而不是那種高召回率、但讓壞視頻混入的分類器(這種情況下你或許想增加人工去檢測(cè)分類器選擇出來的視頻)。另一方面,加入你訓(xùn)練一個(gè)分類器去檢測(cè)監(jiān)控圖像當(dāng)中的竊賊,有著 30% 準(zhǔn)確率、99% 召回率的分類器或許是合適的(當(dāng)然,警衛(wèi)會(huì)得到一些錯(cuò)誤的報(bào)警,但是幾乎所有的竊賊都會(huì)被抓到)。

不幸的是,你不能同時(shí)擁有兩者。增加準(zhǔn)確率會(huì)降低召回率,反之亦然。這叫做準(zhǔn)確率與召回率之間的折衷。

準(zhǔn)確率/召回率之間的折衷

為了弄懂這個(gè)折衷,我們看一下SGDClassifier是如何做分類決策的。對(duì)于每個(gè)樣例,它根據(jù)決策函數(shù)計(jì)算分?jǐn)?shù),如果這個(gè)分?jǐn)?shù)大于一個(gè)閾值,它會(huì)將樣例分配給正例,否則它將分配給反例。圖 3-3 顯示了幾個(gè)數(shù)字從左邊的最低分?jǐn)?shù)排到右邊的最高分。假設(shè)決策閾值位于中間的箭頭(介于兩個(gè) 5 之間):您將發(fā)現(xiàn)4個(gè)真正例(數(shù)字 5)和一個(gè)假正例(數(shù)字 6)在該閾值的右側(cè)。因此,使用該閾值,準(zhǔn)確率為 80%(4/5)。但實(shí)際有 6 個(gè)數(shù)字 5,分類器只檢測(cè) 4 個(gè), 所以召回是 67% (4/6)?,F(xiàn)在,如果你 提高閾值(移動(dòng)到右側(cè)的箭頭),假正例(數(shù)字 6)成為一個(gè)真反例,從而提高準(zhǔn)確率(在這種情況下高達(dá) 100%),但一個(gè)真正例 變成假反例,召回率降低到 50%。相反,降低閾值可提高召回率、降低準(zhǔn)確率。

![圖3-3 決策閾值與準(zhǔn)確度/召回率折衷][../images/chapter_3/chapter3.3.jpeg]

Scikit-Learn 不讓你直接設(shè)置閾值,但是它給你提供了設(shè)置決策分?jǐn)?shù)的方法,這個(gè)決策分?jǐn)?shù)可以用來產(chǎn)生預(yù)測(cè)。它不是調(diào)用分類器的predict()方法,而是調(diào)用decision_function()方法。這個(gè)方法返回每一個(gè)樣例的分?jǐn)?shù)值,然后基于這個(gè)分?jǐn)?shù)值,使用你想要的任何閾值做出預(yù)測(cè)。

>>> y_scores = sgd_clf.decision_function([some_digit]) >>> y_scores array([ 161855.74572176]) >>> threshold = 0 >>> y_some_digit_pred = (y_scores > threshold) array([ True], dtype=bool)

SGDClassifier用了一個(gè)等于 0 的閾值,所以前面的代碼返回了跟predict()方法一樣的結(jié)果(都返回了true)。讓我們提高這個(gè)閾值:

>>> threshold = 200000 >>> y_some_digit_pred = (y_scores > threshold) >>> y_some_digit_pred array([False], dtype=bool)

這證明了提高閾值會(huì)降調(diào)召回率。這個(gè)圖片實(shí)際就是數(shù)字 5,當(dāng)閾值等于 0 的時(shí)候,分類器可以探測(cè)到這是一個(gè) 5,當(dāng)閾值提高到 20000 的時(shí)候,分類器將不能探測(cè)到這是數(shù)字 5。

那么,你應(yīng)該如何使用哪個(gè)閾值呢?首先,你需要再次使用cross_val_predict()得到每一個(gè)樣例的分?jǐn)?shù)值,但是這一次指定返回一個(gè)決策分?jǐn)?shù),而不是預(yù)測(cè)值。

y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function")

現(xiàn)在有了這些分?jǐn)?shù)值。對(duì)于任何可能的閾值,使用precision_recall_curve(),你都可以計(jì)算準(zhǔn)確率和召回率:

from sklearn.metrics import precision_recall_curve precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)

最后,你可以使用 Matplotlib 畫出準(zhǔn)確率和召回率(圖 3-4),這里把準(zhǔn)確率和召回率當(dāng)作是閾值的一個(gè)函數(shù)。

def plot_precision_recall_vs_threshold(precisions, recalls, thresholds): plt.plot(thresholds, precisions[:-1], "b--", label="Precision") plt.plot(thresholds, recalls[:-1], "g-", label="Recall") plt.xlabel("Threshold") plt.legend(loc="upper left") plt.ylim([0, 1]) plot_precision_recall_vs_threshold(precisions, recalls, thresholds) plt.show()

你也許會(huì)好奇為什么準(zhǔn)確率曲線比召回率曲線更加起伏不平。原因是準(zhǔn)確率有時(shí)候會(huì)降低,盡管當(dāng)你提高閾值的時(shí)候,通常來說準(zhǔn)確率會(huì)隨之提高。回頭看圖 3-3,留意當(dāng)你從中間箭頭開始然后向右移動(dòng)一個(gè)數(shù)字會(huì)發(fā)生什么: 準(zhǔn)確率會(huì)由 4/5(80%)降到 3/4(75%)。另一方面,當(dāng)閾值提高時(shí)候,召回率只會(huì)降低。這也就說明了為什么召回率的曲線更加平滑。

現(xiàn)在你可以選擇適合你任務(wù)的最佳閾值。另一個(gè)選出好的準(zhǔn)確率/召回率折衷的方法是直接畫出準(zhǔn)確率對(duì)召回率的曲線,如圖 3-5 所示。

可以看到,在召回率在 80% 左右的時(shí)候,準(zhǔn)確率急劇下降。你可能會(huì)想選擇在急劇下降之前選擇出一個(gè)準(zhǔn)確率/召回率折衷點(diǎn)。比如說,在召回率 60% 左右的點(diǎn)。當(dāng)然,這取決于你的項(xiàng)目需求。

我們假設(shè)你決定達(dá)到 90% 的準(zhǔn)確率。你查閱第一幅圖(放大一些),在 70000 附近找到一個(gè)閾值。為了作出預(yù)測(cè)(目前為止只在訓(xùn)練集上預(yù)測(cè)),你可以運(yùn)行以下代碼,而不是運(yùn)行分類器的predict()方法。

y_train_pred_90 = (y_scores > 70000)

讓我們檢查這些預(yù)測(cè)的準(zhǔn)確率和召回率:

>>> precision_score(y_train_5, y_train_pred_90) 0.8998702983138781 >>> recall_score(y_train_5, y_train_pred_90) 0.63991883416343853

很棒!你擁有了一個(gè)(近似) 90% 準(zhǔn)確率的分類器。它相當(dāng)容易去創(chuàng)建一個(gè)任意準(zhǔn)確率的分類器,只要將閾值設(shè)置得足夠高。但是,一個(gè)高準(zhǔn)確率的分類器不是非常有用,如果它的召回率太低!

如果有人說“讓我們達(dá)到 99% 的準(zhǔn)確率”,你應(yīng)該問“相應(yīng)的召回率是多少?”

ROC 曲線

受試者工作特征(ROC)曲線是另一個(gè)二分類器常用的工具。它非常類似與準(zhǔn)確率/召回率曲線,但不是畫出準(zhǔn)確率對(duì)召回率的曲線,ROC 曲線是真正例率(true positive rate,另一個(gè)名字叫做召回率)對(duì)假反例率(false positive rate, FPR)的曲線。FPR 是反例被錯(cuò)誤分成正例的比率。它等于 1 減去真反例率(true negative rate, TNR)。TNR是反例被正確分類的比率。TNR也叫做特異性。所以 ROC 曲線畫出召回率對(duì)(1 減特異性)的曲線。

為了畫出 ROC 曲線,你首先需要計(jì)算各種不同閾值下的 TPR、FPR,使用roc_curve()函數(shù):

from sklearn.metrics import roc_curve fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)

然后你可以使用 matplotlib,畫出 FPR 對(duì) TPR 的曲線。下面的代碼生成圖 3-6.

def plot_roc_curve(fpr, tpr, label=None): plt.plot(fpr, tpr, linewidth=2, label=label) plt.plot([0, 1], [0, 1], 'k--') plt.axis([0, 1, 0, 1]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plot_roc_curve(fpr, tpr) plt.show()

這里同樣存在折衷的問題:召回率(TPR)越高,分類器就會(huì)產(chǎn)生越多的假正例(FPR)。圖中的點(diǎn)線是一個(gè)完全隨機(jī)的分類器生成的 ROC 曲線;一個(gè)好的分類器的 ROC 曲線應(yīng)該盡可能遠(yuǎn)離這條線(即向左上角方向靠攏)。

一個(gè)比較分類器之間優(yōu)劣的方法是:測(cè)量ROC曲線下的面積(AUC)。一個(gè)完美的分類器的 ROC AUC 等于 1,而一個(gè)純隨機(jī)分類器的 ROC AUC 等于 0.5。

Scikit-Learn 提供了一個(gè)函數(shù)來計(jì)算 ROC AUC:

>>> from sklearn.metrics import roc_auc_score >>> roc_auc_score(y_train_5, y_scores) 0.97061072797174941

因?yàn)?ROC 曲線跟準(zhǔn)確率/召回率曲線(或者叫 PR)很類似,你或許會(huì)好奇如何決定使用哪一個(gè)曲線呢?一個(gè)笨拙的規(guī)則是,優(yōu)先使用 PR 曲線當(dāng)正例很少,或者當(dāng)你關(guān)注假正例多于假反例的時(shí)候。其他情況使用 ROC 曲線。舉例子,回顧前面的 ROC 曲線和 ROC AUC 數(shù)值,你或許人為這個(gè)分類器很棒。但是這幾乎全是因?yàn)橹挥猩贁?shù)正例(“是 5”),而大部分是反例(“非 5”)。相反,PR 曲線清楚顯示出這個(gè)分類器還有很大的改善空間(PR 曲線應(yīng)該盡可能地靠近右上角)。

讓我們訓(xùn)練一個(gè)RandomForestClassifier,然后拿它的的ROC曲線和ROC AUC數(shù)值去跟SGDClassifier的比較。首先你需要得到訓(xùn)練集每個(gè)樣例的數(shù)值。但是由于隨機(jī)森林分類器的工作方式,RandomForestClassifier不提供decision_function()方法。相反,它提供了predict_proba()方法。Skikit-Learn分類器通常二者中的一個(gè)。predict_proba()方法返回一個(gè)數(shù)組,數(shù)組的每一行代表一個(gè)樣例,每一列代表一個(gè)類。數(shù)組當(dāng)中的值的意思是:給定一個(gè)樣例屬于給定類的概率。比如,70%的概率這幅圖是數(shù)字 5。

from sklearn.ensemble import RandomForestClassifier forest_clf = RandomForestClassifier(random_state=42) y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3, method="predict_proba")

但是要畫 ROC 曲線,你需要的是樣例的分?jǐn)?shù),而不是概率。一個(gè)簡(jiǎn)單的解決方法是使用正例的概率當(dāng)作樣例的分?jǐn)?shù)。

y_scores_forest = y_probas_forest[:, 1] # score = proba of positive class fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)

現(xiàn)在你即將得到 ROC 曲線。將前面一個(gè)分類器的 ROC 曲線一并畫出來是很有用的,可以清楚地進(jìn)行比較。見圖 3-7。

plt.plot(fpr, tpr, "b:", label="SGD") plot_roc_curve(fpr_forest, tpr_forest, "Random Forest") plt.legend(loc="bottom right") plt.show()

如你所見,RandomForestClassifier的 ROC 曲線比SGDClassifier的好得多:它更靠近左上角。所以,它的 ROC AUC 也會(huì)更大。

>>> roc_auc_score(y_train_5, y_scores_forest) 0.99312433660038291

計(jì)算一下準(zhǔn)確率和召回率:98.5% 的準(zhǔn)確率,82.8% 的召回率。還不錯(cuò)。

現(xiàn)在你知道如何訓(xùn)練一個(gè)二分類器,選擇合適的標(biāo)準(zhǔn),使用交叉驗(yàn)證去評(píng)估你的分類器,選擇滿足你需要的準(zhǔn)確率/召回率折衷方案,和比較不同模型的 ROC 曲線和 ROC AUC 數(shù)值。現(xiàn)在讓我們檢測(cè)更多的數(shù)字,而不僅僅是一個(gè)數(shù)字 5。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 閾值
    +關(guān)注

    關(guān)注

    0

    文章

    123

    瀏覽量

    18501
  • 分類器
    +關(guān)注

    關(guān)注

    0

    文章

    152

    瀏覽量

    13195
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8420

    瀏覽量

    132687

原文標(biāo)題:【翻譯】Sklearn 與 TensorFlow 機(jī)器學(xué)習(xí)實(shí)用指南 —— 第3章 分類(中)

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    NIUSB6009 采集準(zhǔn)確率的問題?

    NIUSB6009 采集準(zhǔn)確率的問題? 一、本人做一個(gè)中間繼電器電性能實(shí)驗(yàn)的裝置 1、PLC帶動(dòng)中間繼電器吸合和釋放,(吸合用時(shí)1.5秒,釋放用時(shí)1.5秒)周而復(fù)始的運(yùn)動(dòng)。 2、中間繼電器的觸頭負(fù)載
    發(fā)表于 09-23 15:59

    TF之LoR:基于tensorflow實(shí)現(xiàn)手寫數(shù)字圖片識(shí)別準(zhǔn)確率

    TF之LoR:基于tensorflow實(shí)現(xiàn)手寫數(shù)字圖片識(shí)別準(zhǔn)確率
    發(fā)表于 12-19 17:05

    基于RBM實(shí)現(xiàn)手寫數(shù)字識(shí)別高準(zhǔn)確率

    DL之RBM:基于RBM實(shí)現(xiàn)手寫數(shù)字識(shí)別高準(zhǔn)確率
    發(fā)表于 12-28 10:19

    請(qǐng)問誰做過蟻群算法選擇圖像特征,使識(shí)別準(zhǔn)確率最高?

    請(qǐng)問誰做過蟻群算法選擇圖像特征,使識(shí)別準(zhǔn)確率最高?有學(xué)習(xí)資料或者matlab代碼可以讓我學(xué)習(xí)一下嗎
    發(fā)表于 02-17 17:20

    如何提高Stm32F746G準(zhǔn)確率?

    你好帶時(shí)鐘的教程 3。如何提高準(zhǔn)確率?最好的祝福安杰伊
    發(fā)表于 01-12 07:26

    BOM準(zhǔn)確率提高方法

    BOM錯(cuò)誤造成的損失出現(xiàn)在產(chǎn)品制造、銷售和售后服務(wù)工作中,但根源在產(chǎn)品研發(fā)部門,因此BOM準(zhǔn)確率需要由專業(yè)部門進(jìn)行專門管理。
    發(fā)表于 06-13 10:37 ?5239次閱讀

    交大教授訓(xùn)練機(jī)器通過面部識(shí)別罪犯 準(zhǔn)確率達(dá)到86%以上

    上海交通大學(xué)的武筱林教授和他的博士生張熙近期完成了一項(xiàng)研究,他們發(fā)現(xiàn),通過學(xué)習(xí),機(jī)器可以通過照片分辨出誰是罪犯,誰是守法公民,識(shí)別準(zhǔn)確率在86%以上。
    發(fā)表于 12-01 10:59 ?975次閱讀

    人工智能首次超過人眼準(zhǔn)確率 人臉識(shí)別準(zhǔn)確度已經(jīng)提升4個(gè)數(shù)量級(jí)

    隨著算法的提升,應(yīng)用邊界不斷擴(kuò)大,人工智能(AI)人臉識(shí)別技術(shù)的準(zhǔn)確率首次超過人眼準(zhǔn)確率,人工智能如何通過云和端改變生活和未來。
    發(fā)表于 02-06 12:42 ?1.4w次閱讀

    深度學(xué)習(xí):我國成功研發(fā)智能輔助駕駛系統(tǒng),準(zhǔn)確率世界先進(jìn)水平

    26日從中國航天科工二院二部獲悉,該部近日成功研制“基于深度學(xué)習(xí)的智能輔助駕駛系統(tǒng)”,憑借方寸幾厘米大小的嵌入式芯片,可以實(shí)現(xiàn)對(duì)環(huán)境的實(shí)時(shí)準(zhǔn)確智能感知,在目標(biāo)識(shí)別準(zhǔn)確率方面達(dá)到世界先進(jìn)水平。
    的頭像 發(fā)表于 03-31 10:35 ?4632次閱讀

    阿里云ET醫(yī)療大腦預(yù)測(cè)個(gè)體的發(fā)病概率準(zhǔn)確率能達(dá)到83%

    日前,阿里云對(duì)外披露了ET醫(yī)療大腦的新突破。用機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)了對(duì)妊娠糖尿病的精準(zhǔn)預(yù)測(cè),準(zhǔn)確率達(dá)到83%。在孕早期積極干預(yù)后有望將實(shí)際發(fā)病下降65%以上。
    的頭像 發(fā)表于 04-26 16:13 ?4452次閱讀

    阿里達(dá)摩院公布自研語音識(shí)別模型DFSMN,識(shí)別準(zhǔn)確率達(dá)96.04%

    日前,阿里巴巴達(dá)摩院機(jī)器智能實(shí)驗(yàn)室推出了新一代語音識(shí)別模型DFSMN,據(jù)悉語音識(shí)別準(zhǔn)確率達(dá)96.04%,未來將用于智能家居設(shè)備。
    的頭像 發(fā)表于 06-07 14:36 ?3853次閱讀

    科學(xué)家用AI識(shí)別和統(tǒng)計(jì)野生動(dòng)物 準(zhǔn)確率接近100%

    美國奧本大學(xué)、哈佛大學(xué)、牛津大學(xué)、明尼蘇達(dá)州立大學(xué)和懷俄明州立大學(xué)的研究人員開發(fā)了一種可以識(shí)別、描述并計(jì)算野生動(dòng)物數(shù)量的機(jī)器學(xué)習(xí)算法,準(zhǔn)確率達(dá)到了96.6%。
    的頭像 發(fā)表于 07-16 17:16 ?5666次閱讀

    AI垃圾分類的準(zhǔn)確率召回達(dá)到99%

    這套邏輯和人類用眼睛、大腦、手臂工作的邏輯差不多,而且效率也足夠了。以塑料瓶為例,AI垃圾分類的準(zhǔn)確率召回達(dá)到99%,單張圖片的識(shí)別時(shí)間不到半秒鐘。
    的頭像 發(fā)表于 06-16 15:10 ?3288次閱讀

    ai人工智能回答準(zhǔn)確率高嗎

    人工智能(AI)回答的準(zhǔn)確率是一個(gè)相對(duì)的概念,會(huì)受到多個(gè)因素的影響,因此不能一概而論地說其準(zhǔn)確率高或低。以下是對(duì)AI回答準(zhǔn)確率及其影響因素的分析: 一、AI回答準(zhǔn)確率的現(xiàn)狀 在某些特定
    的頭像 發(fā)表于 10-17 16:30 ?3212次閱讀

    微機(jī)保護(hù)裝置預(yù)警功能的準(zhǔn)確率

    異常狀態(tài)。 微機(jī)保護(hù)裝置的預(yù)警功能準(zhǔn)確率是衡量其性能的重要指標(biāo),它直接關(guān)系到裝置能否及時(shí)準(zhǔn)確地檢測(cè)潛在的故障或異常情況,從而預(yù)防事故的發(fā)生。 準(zhǔn)確率影響因素: 1.硬件性能:高精度的傳感器和強(qiáng)大的數(shù)據(jù)處理單元直
    的頭像 發(fā)表于 11-03 16:10 ?176次閱讀