機器學習分類模型性能評估:應對類別不平衡的策略與指標

在機器學習的世界里,模型們就像一群努力破案的偵探,而數據就是它們的“犯罪現場”。今天,咱們的主角——一個自命不凡的分類模型,接到了一個看似簡單的任務:揪出那些患有罕見疾病的患者。這聽起來是不是很容易?畢竟,只要隨便猜猜,就能蒙對大部分結果,輕松拿下高得嚇人的準確率。

可別急,事情沒那么簡單!這個任務背后藏著一個巨大的陷阱,那就是數據的“偏見”——患病的人太少啦!這就像是在一個全是好人的人群里找壞蛋,要是隨便抓幾個好人當嫌疑人,那可就太冤枉人家了。我們的模型偵探們必須使出渾身解數,用各種聰明的指標來衡量自己的表現,才能真正找到那些隱藏在人群中的“壞蛋”。

接下來,就讓我們一起看看,這些模型偵探們是怎么一步步解開這個謎團的吧!

用性能指標評估分類模型

封面圖

親愛的機器學習小伙伴們,快來看看這個有趣的情景吧:

假設你被安排去構建一個機器學習模型,用來檢測醫學患者是否感染了一種罕見疾病。這種疾病實在是太罕見了,患者感染的概率只有1%。你的上司希望你構建的模型能達到最高的準確率。這將是一個二分類器,以患者的信息作為輸入,然后告訴你患者是否患有該疾病,我們可以將輸出分別編碼為1(患病)或0(未患病)。

接下來的幾天,你充分發揮自己的機器學習技能,構建了一個準確率達到85%的模型。干得漂亮!

然而,你的快樂并沒有持續太久,因為你的上司告訴你,團隊里的另一個成員只花了大約10分鐘就構建了一個更簡單的模型,輕松實現了99%的準確率。

啥?!這是咋回事呢?難道那個團隊成員是個超級天才,還是公司給的指令有問題,或者我不是自己想象中的那么厲害的機器學習從業者?

讓我們來一探究竟吧!

性能指標

在機器學習的任何領域,我們都應該從最基本的定義和原理出發。

我們先從混淆矩陣說起,它展示了我們的模型預測得好不好。對于我們的二分類問題,它看起來像一個2×2的網格:第一列給出了實際患有疾病患者的數量,第二列給出了實際未患病患者的數量;行則對應模型做出的預測。舉個例子:

混淆矩陣示例

從現在開始,我們將疾病檢測稱為“陽性”結果,沒有檢測到疾病為“陰性”結果。也就是說,當模型認為檢測到疾病實例時,就會發出陽性信號。

混淆矩陣中的每個單元格代表一定的數量:

  • 真陽性(TP):模型預測患者患有疾病,且患者實際確實患有疾病的人數。
  • 假陽性(FP):模型預測患者患有疾病,但患者實際并沒有患病的人數。
  • 假陰性(FN):模型預測患者沒有患病,但患者實際患有疾病的人數。
  • 真陰性(TN):模型預測患者沒有患病,且患者實際確實沒有患病的人數。

以下是混淆矩陣的示意圖:

混淆矩陣各指標位置

回想一下,公司讓你構建一個優化準確率的模型。分類器的準確率正確分類點的比例

準確率 = TP + TN TP + FP + FN + TN \text{準確率} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{FP} + \text{FN} + \text{TN}} 準確率=TP+FP+FN+TNTP+TN?

由于這是一個比例,準確率的值將在0到1之間,我們也可以將其轉換為百分比。

醫學奇跡

讓我們暫停一下,思考一下公司給我們的分類任務。我們知道,我們數據中只有1%的患者實際上患有這種疾病。因此,如果我們的數據集中有1000名患者,那么只有10人真正患有這種疾病。對于這個問題,分類器的最佳混淆矩陣場景如下:

理想混淆矩陣

事實上,對于任何混淆矩陣,最優分類器是其混淆矩陣僅在主對角線上有值的那個。

按照上面給出的公式,這個分類器的準確率是

準確率 = 10 + 990 10 + 0 + 0 + 990 = 1 \text{準確率} = \frac{10 + 990}{10 + 0 + 0 + 990} = 1 準確率=10+0+0+99010+990?=1

🤔 你能看出我們如何構建一個準確率達到99%的超簡單分類器嗎?

💡 我們只需預測每個患者都沒有患病即可。這被稱為天真分類器,其混淆矩陣如下:

天真分類器混淆矩陣

對應的準確率現在是

準確率 = 0 + 990 0 + 0 + 10 + 990 = 0.99 \text{準確率} = \frac{0 + 990}{0 + 0 + 10 + 990} = 0.99 準確率=0+0+10+9900+990?=0.99

瞧!毫不費力就實現了99%的準確率。現在我們知道同事是怎么輕松實現這么高準確率的了……

但更重要的問題是,我們同事的分類器是不是一個好的分類器呢?盡管準確率很高,但它的設計并沒有真正檢測出任何疾病的實例!它只是默認說任何數據實例都沒有疾病。

主要問題是:準確率指標并不適合像我們正在討論的這種存在嚴重類別不平衡的數據集

所以,使用準確率作為模型的性能指標并不總是明智的。那我們該怎么辦呢?

召回率

鑒于疾病診斷的背景,我們希望一個優先檢測疾病的分類器。我們可以使用的一個指標是召回率

召回率 = TP TP + FN \text{召回率} = \frac{\text{TP}}{\text{TP} + \text{FN}} 召回率=TP+FNTP?

分類器的召回率告訴我們,被模型分類為患有疾病的實際患有疾病的患者比例。

另一種說法是:在所有模型預測患有疾病的患者中,實際患有疾病的百分比是多少?

對于醫療診斷來說,這個指標比準確率更適合,因為我們不希望模型遺漏任何疾病的實例。我們不太關心模型輸出了多少假陽性(即模型預測患者患病,但實際上患者并沒有患病)。相反,我們需要盡可能降低假陰性值,否則就會有患有罕見疾病的患者卻不知道自己患病。

盡管假陽性很不方便,但假陰性是有害的

讓我們看看天真分類器的召回率是什么樣的:

召回率 = 0 0 + 10 = 0 \text{召回率} = \frac{0}{0 + 10} = 0 召回率=0+100?=0

哦,這下就對了。

精確率

召回率性能指標適用于我們不想出現太多假陰性的情況。但如果在某些情境下,標記假陽性太不方便而不能忽視呢?

精確率是另一個性能指標,它衡量實際為正的正分類的比例:

精確率 = TP TP + FP \text{精確率} = \frac{\text{TP}}{\text{TP} + \text{FP}} 精確率=TP+FPTP?

當希望向模型強調不要不必要地標記假陽性時,這個指標很有用。例如,在電子郵件垃圾郵件檢測的情境中,過多的假陽性可能意味著重要郵件最終會出現在你的垃圾郵件文件夾中!這當然不太理想。

F1 分數

你的問題背景可能需要結合精確率和召回率的一些特點。F1 分數在精確率和召回率之間提供了平衡:

F1?分數 = 2 × 精確率 × 召回率 精確率 + 召回率 \text{F1 分數} = 2 \times \frac{\text{精確率} \times \text{召回率}}{\text{精確率} + \text{召回率}} F1?分數=2×精確率+召回率精確率×召回率?

也就是說,F1 分數是精確率和召回率的調和平均值。我們也可以用 TP、FP 和 FN 來表示 F1 分數公式:

F1?分數 = 2 × TP 2 × TP + FP + FN \text{F1 分數} = \frac{2 \times \text{TP}}{2 \times \text{TP} + \text{FP} + \text{FN}} F1?分數=2×TP+FP+FN2×TP?

我們可以看到,當 FP 和 FN 的算術平均值較高時,F1 分數會受到影響。特別是,僅最小化 FP 或 FN 中的一個是不夠的。

總的來說,F1 分數是在處理不平衡數據集時的一個有用指標。

小小的注意事項

似乎對于混淆矩陣中預測值和實際值應該如何顯示,并沒有全球統一的共識。在本文中,我將預測值放在行上,實際值放在列上。總之,當查看在線資源時要小心,因為有些可能使用的是我所描述的轉置版本。

總結一下

性能指標對于評估模型性能至關重要,有助于以符合預測目標的方式進行評估。希望這篇文章能幫你理解模型評估時需要考慮的細微差別。現在,像往常一樣,簡單總結一下:

  • 準確率:告訴你模型正確分類的數據點比例。這個指標并不適合包含類別不平衡的數據集。
  • 召回率:表示實際為正的數據點中被預測為正的比例。當你希望盡量減少模型漏掉的陽性結果時,這個指標很理想。召回率關注混淆矩陣的第一列。
  • 精確率:表示被預測為正的數據點中實際為正的比例。當你希望盡量減少模型做出的錯誤陽性預測時,這個指標很理想。精確率關注混淆矩陣的第一行。

下面的動畫中,綠色和紅色的高亮顯示幫助我記住召回率和精確率在混淆矩陣中的位置:

召回率和精確率記憶動畫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903294.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3代碼規范管理;基于vite和vue3、 eslint、prettier、stylelint、husky規范;git觸發eslint校驗

前言 為提高前端代碼格式化和規范開發。主要使用eslint、prettier、husky完成對git提交commit信息校驗和代碼eslint格式化校驗,不符合要求的代碼,提交不到倉庫。 參考鏈接1 參考鏈接2 文章目錄 前言一、效果圖1.git提交觸發eslint規范校驗2.版本與分支名…

GCC 內建函數匯編展開詳解

1. 引言 GNU 編譯器集合(GCC)是廣泛使用的開源編譯器套件,支持多種編程語言,其中 C 語言編譯器是其核心組件之一。在 C 語言編譯過程中,GCC 不僅處理用戶編寫的標準 C 代碼,還提供了一類特殊的函數——內建…

uniapp利用生命周期函數實現后臺常駐示例

在 Uniapp 中,利用生命周期函數實現“后臺常駐”主要是通過監聽應用的前后臺狀態變化( onHide 和 onShow ),并結合 定時器、后臺任務或狀態保持邏輯 來實現。但需注意: 純前端 JS 代碼無法突破系統對后臺應用的限制&am…

layui時間范圍

//時間范圍String time_range para.getString("time_range", "");if (!StrUtil.isEmpty(time_range)) {String dateArr[] time_range.split("-");if (dateArr.length 2) {para.put("start_date", dateArr[0].trim().replace("…

入門版 鴻蒙 組件導航 (Navigation)

入門版 鴻蒙 組件導航 (Navigation) 注意:使用 DevEco Studio 運行本案例,要使用模擬器,千萬不要用預覽器,預覽器看看 Navigation 布局還是可以的 效果:點擊首頁(Index)跳轉到頁面&#xff08…

VUE3:封裝一個評論回復組件

之前用React封裝的評論回復組件,里面有三個主要部分:CommentComponent作為主組件,CommentItem處理單個評論項,CommentInput負責輸入框。現在需要將這些轉換為Vue3的組件。 Vue3和React在狀態管理上有所不同,Vue3使用r…

制作一款打飛機游戲27:精靈編輯器UI

繼續開發我們的編輯器——Sprit Edit。我們已經創建了這個小編輯器,它可以顯示很多精靈(sprites),并且我們可以遍歷所有精靈。這真的很棒,我們可以創建新的精靈,這也不錯。但是,唉,我…

k8s(9) — zookeeper集群部署(親和性、污點與容忍測試)

一、部署思路 1、前期設想 zookeeper集群至少需要運行3個pod集群才能夠正常運行,考慮到節點會有故障的風險這個3個pod最好分別運行在3個不同的節點上(為了實現這一需要用到親和性和反親和性概念),在部署的時候對zookeeper運行的pod打標簽加…

WXT+Vue3+sass+antd+vite搭建項目開發chrome插件

WXTVue3sassantdvite搭建項目開發chrome插件 前言一、初始化項目二、項目配置調整三、options頁面配置四、集成antd五、集成sass六、環境配置七、代碼注入 vue3:https://cn.vuejs.org/ axios:https://www.axios-http.cn/docs/api_intro antd:…

JSAPI2.4——正則表達式

一、語法 const str 一二三四五六七八九十 //判斷內容 const reg /二/ //判斷條件 console.log(reg.test(str)); //檢查 二、test與exec方法的區別 test方法:用于判斷是否符合規則的字符串,返回值是布爾值 exec方法&…

燃氣用戶檢修工考試精選題

燃氣用戶檢修工考試精選題: 我國國家標準規定民用天然氣中硫化氫含量最高允許濃度是( )。 A. 20mg/m B. 15mg/m C. 5mg/m D. 50mg/m 答案:A 城市燃氣應具有可以察覺的臭味,當無毒燃氣泄漏到空氣中,達到爆炸…

【前端】1h 搞定 TypeScript 教程_只說重點

不定期更新,建議關注收藏點贊。 目錄 簡介使用基本類型、類型推斷和類型注解接口、類型別名、聯合類型類與繼承泛型GenericsReact 與 TS 進階高級類型裝飾器Decorators模塊系統TypeScript 編譯選項 簡介 TypeScript(簡稱 TS)是一種由微軟開發…

MyBatis 參數綁定

一、MyBatis 參數綁定機制 1.1 核心概念 當 Mapper 接口方法接收多個參數時,MyBatis 提供三種參數綁定方式: 默認參數名:arg0、arg1(Java 8)或 param1、param2Param 注解:顯式指定參數名稱POJO/DTO 對象…

【解決方案】Linux解決CUDA安裝過程中GCC版本不兼容

Linux解決CUDA安裝過程中GCC版本不兼容 目錄 問題描述 解決方法 安裝后配置 問題描述 Linux環境下安裝 CUDA 時,運行sudo sh cuda_10.2.89_440.33.01_linux.run命令出現 “Failed to verify gcc version.” 的報錯,提示 GCC 版本不兼容,查…

人工智能數學基礎(一):人工智能與數學

在人工智能領域,數學是不可或缺的基石。無論是算法的設計、模型的訓練還是結果的評估,都離不開數學的支持。接下來,我將帶大家深入了解人工智能數學基礎,包括微積分、線性代數、概率論、數理統計和最優化理論,并通過 P…

Shell腳本-嵌套循環應用案例

在Shell腳本編程中,嵌套循環是一種強大的工具,可以用于處理復雜的任務和數據結構。通過在一個循環內部再嵌套另一個循環,我們可以實現對多維數組、矩陣操作、文件處理等多種高級功能。本文將通過幾個實際的應用案例來展示如何使用嵌套循環解決…

勘破養生偽常識,開啟科學養生新篇

?在養生潮流風起云涌的當下,各種養生觀點和方法層出不窮。但其中有不少是缺乏科學依據的偽常識,若不加分辨地盲目跟從,不僅難以實現養生目的,還可能損害健康。因此,勘破這些養生偽常識,是邁向科學養生的關…

Nacos-3.0.0適配PostgreSQL數據庫

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編…

機器學習第三篇 模型評估(交叉驗證)

Sklearn:可以做數據預處理、分類、回歸、聚類,不能做神經網絡。原始的工具包文檔:scikit-learn: machine learning in Python — scikit-learn 1.6.1 documentation數據集:使用的是MNIST手寫數字識別技術,大小為70000,數據類型為7…

如何在 IntelliJ IDEA 中編寫 Speak 程序

在當今數字化時代,語音交互技術越來越受到開發者的關注。如果你想在 IntelliJ IDEA(一個強大的集成開發環境)中編寫一個語音交互(Speak)程序,那么本文將為你提供詳細的步驟和指南。 一、環境準備 在開始編…