衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

機器學習實用指南——準確率與召回率

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

準確率與召回率

Scikit-Learn 提供了一些函數去計算分類器的指標,包括準確率和召回率。

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

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

通常結合準確率和召回率會更加方便,這個指標叫做“F1 值”,特別是當你需要一個簡單的方法去比較兩個分類器的優劣的時候。F1 值是準確率和召回率的調和平均。普通的平均值平等地看待所有的值,而調和平均會給小的值更大的權重。所以,要想分類器得到一個高的 F1 值,需要召回率和準確率同時高。

公式 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}} $$

為了計算 F1 值,簡單調用f1_score()

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

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

不幸的是,你不能同時擁有兩者。增加準確率會降低召回率,反之亦然。這叫做準確率與召回率之間的折衷。

準確率/召回率之間的折衷

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

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

Scikit-Learn 不讓你直接設置閾值,但是它給你提供了設置決策分數的方法,這個決策分數可以用來產生預測。它不是調用分類器的predict()方法,而是調用decision_function()方法。這個方法返回每一個樣例的分數值,然后基于這個分數值,使用你想要的任何閾值做出預測。

>>> 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用了一個等于 0 的閾值,所以前面的代碼返回了跟predict()方法一樣的結果(都返回了true)。讓我們提高這個閾值:

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

這證明了提高閾值會降調召回率。這個圖片實際就是數字 5,當閾值等于 0 的時候,分類器可以探測到這是一個 5,當閾值提高到 20000 的時候,分類器將不能探測到這是數字 5。

那么,你應該如何使用哪個閾值呢?首先,你需要再次使用cross_val_predict()得到每一個樣例的分數值,但是這一次指定返回一個決策分數,而不是預測值。

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

現在有了這些分數值。對于任何可能的閾值,使用precision_recall_curve(),你都可以計算準確率和召回率:

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

最后,你可以使用 Matplotlib 畫出準確率和召回率(圖 3-4),這里把準確率和召回率當作是閾值的一個函數。

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()

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

現在你可以選擇適合你任務的最佳閾值。另一個選出好的準確率/召回率折衷的方法是直接畫出準確率對召回率的曲線,如圖 3-5 所示。

可以看到,在召回率在 80% 左右的時候,準確率急劇下降。你可能會想選擇在急劇下降之前選擇出一個準確率/召回率折衷點。比如說,在召回率 60% 左右的點。當然,這取決于你的項目需求。

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

y_train_pred_90 = (y_scores > 70000)

讓我們檢查這些預測的準確率和召回率:

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

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

如果有人說“讓我們達到 99% 的準確率”,你應該問“相應的召回率是多少?”

ROC 曲線

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

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

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

然后你可以使用 matplotlib,畫出 FPR 對 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)越高,分類器就會產生越多的假正例(FPR)。圖中的點線是一個完全隨機的分類器生成的 ROC 曲線;一個好的分類器的 ROC 曲線應該盡可能遠離這條線(即向左上角方向靠攏)。

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

Scikit-Learn 提供了一個函數來計算 ROC AUC:

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

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

讓我們訓練一個RandomForestClassifier,然后拿它的的ROC曲線和ROC AUC數值去跟SGDClassifier的比較。首先你需要得到訓練集每個樣例的數值。但是由于隨機森林分類器的工作方式,RandomForestClassifier不提供decision_function()方法。相反,它提供了predict_proba()方法。Skikit-Learn分類器通常二者中的一個。predict_proba()方法返回一個數組,數組的每一行代表一個樣例,每一列代表一個類。數組當中的值的意思是:給定一個樣例屬于給定類的概率。比如,70%的概率這幅圖是數字 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 曲線,你需要的是樣例的分數,而不是概率。一個簡單的解決方法是使用正例的概率當作樣例的分數。

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)

現在你即將得到 ROC 曲線。將前面一個分類器的 ROC 曲線一并畫出來是很有用的,可以清楚地進行比較。見圖 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 也會更大。

>>> roc_auc_score(y_train_5, y_scores_forest) 0.99312433660038291

計算一下準確率和召回率:98.5% 的準確率,82.8% 的召回率。還不錯。

現在你知道如何訓練一個二分類器,選擇合適的標準,使用交叉驗證去評估你的分類器,選擇滿足你需要的準確率/召回率折衷方案,和比較不同模型的 ROC 曲線和 ROC AUC 數值。現在讓我們檢測更多的數字,而不僅僅是一個數字 5。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 閾值
    +關注

    關注

    0

    文章

    123

    瀏覽量

    18550
  • 分類器
    +關注

    關注

    0

    文章

    152

    瀏覽量

    13225
  • 機器學習
    +關注

    關注

    66

    文章

    8438

    瀏覽量

    133084

原文標題:【翻譯】Sklearn 與 TensorFlow 機器學習實用指南 —— 第3章 分類(中)

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    NIUSB6009 采集準確率的問題?

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

    請問AFE4400 SPO2精度和準確率如何?

    請問用TI 的AFE4400 EVM 測量SPO2 的值,有沒有詳細的說明其測量的準確率和精度,抗弱灌注等。謝謝! 比如如下類似: SpO2 測量范圍 0~100% 分辨 1% 精度 70~100%, 2%
    發表于 01-15 07:02

    TF之LoR:基于tensorflow實現手寫數字圖片識別準確率

    TF之LoR:基于tensorflow實現手寫數字圖片識別準確率
    發表于 12-19 17:05

    基于RBM實現手寫數字識別高準確率

    DL之RBM:基于RBM實現手寫數字識別高準確率
    發表于 12-28 10:19

    請問誰做過蟻群算法選擇圖像特征,使識別準確率最高?

    請問誰做過蟻群算法選擇圖像特征,使識別準確率最高?有學習資料或者matlab代碼可以讓我學習一下嗎
    發表于 02-17 17:20

    如何提高Stm32F746G準確率

    你好帶時鐘的教程 3。如何提高準確率?最好的祝福安杰伊
    發表于 01-12 07:26

    BOM準確率提高方法

    BOM錯誤造成的損失出現在產品制造、銷售和售后服務工作中,但根源在產品研發部門,因此BOM準確率需要由專業部門進行專門管理。
    發表于 06-13 10:37 ?5304次閱讀

    交大教授訓練機器通過面部識別罪犯 準確率達到86%以上

    上海交通大學的武筱林教授和他的博士生張熙近期完成了一項研究,他們發現,通過學習機器可以通過照片分辨出誰是罪犯,誰是守法公民,識別準確率在86%以上。
    發表于 12-01 10:59 ?996次閱讀

    深度學習:我國成功研發智能輔助駕駛系統,準確率世界先進水平

    26日從中國航天科工二院二部獲悉,該部近日成功研制“基于深度學習的智能輔助駕駛系統”,憑借方寸幾厘米大小的嵌入式芯片,可以實現對環境的實時準確智能感知,在目標識別準確率方面達到世界先進水平。
    的頭像 發表于 03-31 10:35 ?4663次閱讀

    阿里云ET醫療大腦預測個體的發病概率準確率能達到83%

    日前,阿里云對外披露了ET醫療大腦的新突破。用機器學習算法實現了對妊娠糖尿病的精準預測,準確率達到83%。在孕早期積極干預后有望將實際發病下降65%以上。
    的頭像 發表于 04-26 16:13 ?4487次閱讀

    阿里達摩院公布自研語音識別模型DFSMN,識別準確率達96.04%

    日前,阿里巴巴達摩院機器智能實驗室推出了新一代語音識別模型DFSMN,據悉語音識別準確率達96.04%,未來將用于智能家居設備。
    的頭像 發表于 06-07 14:36 ?3879次閱讀

    科學家用AI識別和統計野生動物 準確率接近100%

    美國奧本大學、哈佛大學、牛津大學、明尼蘇達州立大學和懷俄明州立大學的研究人員開發了一種可以識別、描述并計算野生動物數量的機器學習算法,準確率達到了96.6%。
    的頭像 發表于 07-16 17:16 ?5705次閱讀

    AI垃圾分類的準確率召回達到99%

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

    ai人工智能回答準確率高嗎

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

    微機保護裝置預警功能的準確率

    異常狀態。 微機保護裝置的預警功能準確率是衡量其性能的重要指標,它直接關系到裝置能否及時準確地檢測潛在的故障或異常情況,從而預防事故的發生。 準確率影響因素: 1.硬件性能:高精度的傳感器和強大的數據處理單元直
    的頭像 發表于 11-03 16:10 ?214次閱讀
    百家乐官网布| 蓝盾百家乐官网具体玩法| 百家乐官网真人游戏赌场娱乐网规则| 百家乐的关键技巧| 百家乐有试玩的吗| 伟博娱乐场| 百家乐官网五子棋| 视频百家乐官网平台| 百家乐有没有破解之法| 合法赌博网站| 闲和庄百家乐官网的玩法技巧和规则 | 怎么赌百家乐官网能赢| 百家乐永利娱乐平台| 波音娱乐城送彩金| 澳门顶级赌场国际| 百家乐官网知敌便能制胜| 百家乐5式直缆打法| 六合彩开奖现场| 乐天堂百家乐官网赌场娱乐网规则 | 扑克百家乐官网赌器| 网上百家乐群的微博| 网上百家乐官网正规代理| 涂山百家乐的玩法技巧和规则| 菲律宾百家乐官网试玩| 百家乐官网连开6把小| 金榜百家乐娱乐城| 百家乐官网娱乐城玩法| 金城百家乐买卖路| 百家乐官网怎么赢博彩正网| 阿玛尼百家乐的玩法技巧和规则| 百家乐官网最低投注| 大发888备用网址大发娱乐城| 真人百家乐官网赌场娱乐网规则 | 一博娱乐| 百家乐有什么打法| 百家乐官网百家乐官网伴侣| 百家乐官网视频百家乐官网| 百家乐套利| 羊和鼠做生意摆件| 爱赢百家乐官网开户送现金| 大发888 娱乐|