機器學習模型可信度與交叉驗證:通俗講解

先從一個故事說起:農場里的火雞科學家,觀察了一年發現“每天上午11點必有食物”,結果感恩節當天,它沒等到食物,反而成了人類的食物。這個故事告訴我們:只靠過去的經驗下結論,很可能出錯——機器學習模型也一樣,不能只看它在“已知數據”上表現好,還要確保它在“新數據”上也靠譜。

一、模型為啥要講“可信度”?怎么用數據驗證?

1. 別被“表面成績”騙了:模型的“真實能力”很重要

我們之前學過“模型評估指標”(比如SSE),能判斷模型擬合得好不好。但問題是:指標好的模型,不一定真能用

舉個例子:你用過去3年的某支股票數據訓練了一個預測模型,在這3年數據上預測準確率90%,但用它預測下周股價,準確率可能只有50%。這是因為模型只“死記硬背”了過去的數據(就像火雞記住了“11點有食物”),卻沒學會應對新情況——這就是模型“可信度”的核心:能不能在沒見過的新數據上做好預測

要理解這個問題,先搞懂兩個核心矛盾和兩種解決思路:

  • 核心矛盾:模型只能用“已知數據”訓練,但我們需要它對“未知數據”有效。
  • 兩種解決思路
    1. 傳統統計分析:假設“已知數據”和“未知數據”都來自同一個“總體”(比如都來自“某地區的用戶消費數據”),先通過數學推導證明“總體有什么規律”,再基于規律建模型。因為模型符合“總體規律”,所以默認它對新數據也有效。
    2. 機器學習:不搞復雜推導,直接用“模擬測試”判斷——把手里的數據分成兩部分:
      • 一部分叫訓練集(比如70%-80%的數據):用來訓練模型,就像學生做練習題。
      • 另一部分叫測試集(比如20%-30%的數據):用來“考試”,模擬“未知數據”,看模型考得怎么樣。

如果模型在測試集上表現好,我們就認為它對未來的新數據也靠譜;反之,就算在訓練集上表現再好,也可能是“死記硬背”,沒用。

這里還要記住兩個詞:

  • 訓練誤差:模型在訓練集上的“錯題率”(比如SSE值)。
  • 泛化能力:模型對“未知數據”的預測能力(沒法直接測,只能通過測試集的表現間接判斷)。

2. 怎么切分數據?像切蛋糕一樣簡單

要做“訓練集-測試集”的模擬,首先得把數據“打亂切分”——就像切蛋糕前先攪勻配料,避免某塊全是奶油、某塊全是面包。

(1)關鍵工具:兩個NumPy函數
  • np.random.shuffle:給數據“洗牌”,按行打亂順序(比如把100條用戶數據打亂,避免按時間順序切分導致“訓練集全是老用戶,測試集全是新用戶”)。
    注意:打亂特征和標簽時,要保證“一一對應”(比如用戶A的特征和他的消費標簽不能分開),所以要給兩者設相同的“隨機種子”(比如都設為24),確保打亂方式一樣。
  • np.vsplit:按行切分數據,比如把打亂后的100條數據,從第70條后面切開,前70條當訓練集,后30條當測試集。
(2)現成的切分函數

基于上面兩個工具,我們可以寫一個“數據切分函數”,輸入特征、標簽,就能自動輸出訓練集和測試集:

def array_split(features, labels, rate=0.7, random_state=24):# 1. 用相同種子打亂特征和標簽,保證對應關系np.random.seed(random_state)np.random.shuffle(features)np.random.seed(random_state)np.random.shuffle(labels)# 2. 計算切分點(比如100條數據,70%就是70條)split_idx = int(len(labels) * rate)# 3. 切分數據Xtrain, Xtest = np.vsplit(features, [split_idx, ])  # 特征切分ytrain, ytest = np.vsplit(labels, [split_idx, ])    # 標簽切分return Xtrain, Xtest, ytrain, ytest
(3)切分比例怎么定?憑經驗,但有道理

一般按“7:3”或“8:2”切分:

  • 訓練集太少:模型學不到足夠規律(比如只做10道題就去考試,肯定考不好)。
  • 測試集太少:“考試樣本”不夠,沒法判斷模型真本事(比如只考2道題,就算全對也可能是蒙的)。

機器學習里很多這種“經驗值”,雖然不像數學公式那么嚴謹,但實戰中很好用。

3. 實戰:用線性回歸驗證可信度

我們用“訓練集訓練模型,測試集驗證效果”,走一遍完整流程:

(1)準備數據

先造一組簡單的回歸數據(特征和標簽有線性關系,加一點小誤差),再切分成訓練集和測試集:

np.random.seed(24)  # 固定隨機種子,結果可重復
features, labels = arrayGenReg(delta=0.01)  # 造數據(delta是誤差)
Xtrain, Xtest, ytrain, ytest = array_split(features, labels)  # 切分
(2)訓練模型:求線性回歸的參數w

線性回歸的核心是求“最優參數w”,公式是:w^=(XTX)?1XTy\hat{w} = (X^TX)^{-1}X^Tyw^=(XTX)?1XTy(不用死記,NumPy能算):

w = np.linalg.inv(Xtrain.T.dot(Xtrain)).dot(Xtrain.T).dot(ytrain)

這里的w就是模型“學到的規律”——比如“房價=0.8×面積 + 0.2×樓層”里的0.8和0.2。

(3)測試模型:看在測試集上表現

用之前學的SSELoss函數,算模型在測試集上的誤差:

SSELoss(Xtest, w, ytest)  # 輸出誤差值,越小說明模型在測試集上表現越好

如果誤差小,說明模型不僅在訓練集上擬合得好,對測試集(模擬新數據)也有效,可信度高。

4. 一個繞人的問題:測試集的“不可知悖論”

你可能會問:如果測試集表現不好,能不能改模型(比如換個算法、調個參數)再測?
答案是:嚴格來說不能

因為測試集是用來“最終考試”的——就像高考,考砸了不能說“我再復習一周重考”。如果根據測試集結果改模型,相當于“提前知道了高考題,再針對性復習”,測試集就失去了“判斷真實能力”的意義。

那想調整模型怎么辦?再加一種數據:驗證集
可以把數據分成三部分:

  • 訓練集:用來學知識(做練習題)。
  • 驗證集:用來模擬考試,調整復習策略(比如發現數學差,就多練數學)。
  • 測試集:最終高考,一旦考完,不能再改策略。

比如數據按“6:2:2”切分:60%訓練、20%驗證、20%測試。平時用驗證集調模型,最后用測試集看最終效果——這樣測試集的“公正性”就保住了。

(實際中,很多人會把“驗證集”和“測試集”混用,比如用“7:3”切分,30%既當驗證集又當測試集,適合不需要特別嚴謹的場景。)

二、交叉驗證:讓結果更靠譜的“多次考試”

就算分了訓練集和測試集,還有一個問題:一次切分的結果可能有運氣成分
比如你切分數據時,剛好把“簡單題”都分到訓練集、“難題”都分到測試集,模型測試成績就會差;反過來,成績就會好。

怎么解決?用“交叉驗證”——相當于讓模型多考幾次,取平均分,減少運氣影響。

1. 核心思想:K折交叉驗證(最常用)

把“訓練集+驗證集”(暫時不用測試集)分成K等份(比如K=10,叫10折驗證),然后循環做K次訓練和驗證:

  • 第1次:用第1份當驗證集,剩下9份當訓練集,算一次誤差。
  • 第2次:用第2份當驗證集,剩下9份當訓練集,算一次誤差。
  • 第10次:用第10份當驗證集,剩下9份當訓練集,算一次誤差。

最后把10次誤差求平均,這個平均值就是模型的“真實成績”——比一次切分的結果更可信。

舉個例子:10折驗證的過程就像10個學生輪流當“考官”,每個人出一套題(自己的那1份數據),其他人(剩下9份)做題,最后取所有人的平均分,避免某個人的題太簡單或太難。

2. 注意:交叉驗證和測試集不沖突

嚴謹的流程是:

  1. 先把所有數據分成“訓練驗證集”(比如80%)和“測試集”(20%),測試集先藏起來,不用。
  2. 在“訓練驗證集”上做K折交叉驗證,調整模型(比如選最優的參數)。
  3. 最后用調好的模型,在“測試集”上做一次最終測試,得到最終結果。

這樣既用交叉驗證保證了模型的穩定性,又用測試集保證了結果的公正性。

總結:關鍵記住3點

  1. 模型可信度=泛化能力:別只看訓練集成績,一定要用測試集模擬新數據。
  2. 數據切分要合理:訓練集70%-80%,測試集20%-30%,打亂順序避免偏見;需要調模型時加驗證集。
  3. 交叉驗證減誤差:一次切分有運氣成分,用K折交叉驗證(比如10折)取平均分,結果更靠譜。

掌握這些,就能避免做“農場里的火雞科學家”,讓模型在真實場景中真的好用。

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

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

相關文章

HTML5和CSS3新增的一些屬性

1、HTML5新增特性這些新特性都有兼容性問題&#xff0c;基本是IE9以上版本瀏覽器才支持1&#xff09;新增語義化標簽2&#xff09;新增多媒體標簽音頻&#xff1a;<audio>視頻&#xff1a;<video>&#xff08;1&#xff09;視頻<video>---盡量使用mp4格式<…

Redis的RedLock

RedLock算法深度解析RedLock是Redis作者針對分布式環境設計的多節點鎖算法&#xff0c;核心目標是解決單點Redis在分布式鎖場景中的可靠性缺陷。傳統方案的局限性單節點Redis鎖的問題單點故障&#xff1a;單個Redis實例宕機導致所有鎖服務不可用可靠性不足&#xff1a;無法保證…

SpringMVC @RequestMapping的使用演示和細節 詳解

目錄 一、RequestMapping是什么&#xff1f; 二、RequestMapping 的使用演示 1.RequestMapping在方法上的使用&#xff1a; 2.RequestMapping同時在類和方法上使用&#xff1a; 3.RequestMapping指定請求參數&#xff1a; 4.RequestMapping使用Ant風格URL&#xff1a; 5.Requ…

flutter項目 -- 換logo、名稱 、簽名、打包

1、換logo, 透明底&#xff0c;下面5個尺寸&#xff0c;需要UI設計2、換名沒配置型的改名方式如下 打開app/src/main/AndroidManifest.xml3、簽名 運行 flutter doctor -vD:\project\Apk\keystore 自己建立的keystore文件夾&#xff0c; 注意命令后是 megoai-release-key(自…

【貪心算法】day9

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代碼&#xff1b;&#xff08;2&#xff09;優質解法 優質代碼&#xff1b;&#xff…

linux C 語言開發 (八) 進程基礎

文章的目的為了記錄使用C語言進行linux 開發學習的經歷。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; linux C 語言開發 (一) Window下用gcc編譯和gdb調試 linux C 語言開發 (二) VsCode遠程開發 linux linux C 語言開發 (…

從零學算法1094

1094.拼車 車上最初有 capacity 個空座位。車 只能 向一個方向行駛&#xff08;也就是說&#xff0c;不允許掉頭或改變方向&#xff09; 給定整數 capacity 和一個數組 trips , trips[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他…

B2B企業營銷型AI Agent服務商推薦:誰更專業?如何選型?

一、引言&#xff1a;為什么B2B企業需要營銷型AI Agent&#xff1f;在當前競爭激烈的B2B市場中&#xff0c;企業普遍面臨幾大挑戰&#xff1a;線索獲取難&#xff1a;獲客成本持續上升&#xff0c;高質量線索難以篩選。銷售周期長&#xff1a;從初步接觸到簽單&#xff0c;往往…

算法-雙指針5.6

目錄 &#x1f33f;力扣611-有效三角形得個數 &#x1f9ca;題目鏈接&#xff1a;https://leetcode.cn/problems/valid-triangle-number/description/ &#x1f9ca;題目描述&#xff1a;?編輯 &#x1f9ca;解題思路&#xff1a; &#x1f9ca;解題代碼&#xff1a; &a…

超參數自動化調優指南:Optuna vs. Ray Tune 對比評測

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;從"手動煉丹"到"自動化…

軟考-局域網基礎考點總結

這篇文章用于整理軟考網絡相關的知識點&#xff0c;囊括了詳細的局域網基礎的考點&#xff0c;能夠讓你認真備考&#xff0c;基礎知識一網打盡&#xff0c;讓后續的學習更加通暢~ 第一部分&#xff1a;OSI七層參考模型 OSI(Open System Interconnection)模型是一個理論框架&am…

Node.js核心模塊介紹

1. fs 模塊fs&#xff08;File System&#xff09;模塊允許對文件系統進行操作&#xff0c;提供了文件讀寫、文件夾操作等功能。fs 支持同步和異步兩種 API。1.1. 常用方法讀取文件&#xff1a;異步: fs.readFile()同步: fs.readFileSync()寫入文件&#xff1a;異步: fs.writeF…

緩存三大劫攻防戰:穿透、擊穿、雪崩的Java實戰防御體系(二)

第二部分&#xff1a;緩存擊穿——熱點key過期引發的“DB瞬間高壓” 緩存擊穿的本質是“某個熱點key&#xff08;高并發訪問&#xff09;突然過期”&#xff0c;導致大量請求在同一時間穿透緩存&#xff0c;集中沖擊DB&#xff0c;形成“瞬間高壓”。 案例3&#xff1a;電商秒殺…

Linux相關概念和易錯知識點(45)(網絡層、網段劃分)

目錄1.網絡層&#xff08;1&#xff09;IP協議頭格式&#xff08;2&#xff09;工作流程2.網段劃分&#xff08;1&#xff09;五類地址&#xff08;2&#xff09;回環地址&#xff08;3&#xff09;網段的特殊地址&#xff08;4&#xff09;網絡建設我們前面暫時跳過了網絡層&a…

transition(過渡)和animation(動畫)——CSS

1.transition過渡可以為一個元素在不同狀態之間進行切換時添加過渡效果&#xff0c;實現不同狀態間的變化效果。通過觸發事件(鼠標懸停、點擊等)&#xff0c;在兩個狀態間切換。1.1 使用語法&#xff1a;transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud項目國產化改造MySQL遷移達夢數據庫,SQL變更

達夢數據庫下載地址&#xff1a;https://eco.dameng.com/download 達夢數據庫安裝文檔&#xff1a;https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 數據遷移SQLark工具使用 首先&#xff0c;本次MySQL遷移使用了SQLark工具 1.下載安裝SQLark https…

Cesium---1.133版本不修改源碼支持arcgis MapServer 4490切片

參照了這篇博文&#xff1a;https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源碼進行了修改&#xff0c;可以實現服務加載&#xff1a; Event.js import { Check,defined} from &qu…

迭代器和生成器的區別與聯系

目錄 1.可迭代對象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函數 vs 生成器表達式 4.三者之間的聯系與區別 5.關系圖&#xff08;幫助你一眼看懂&#xff09; 6.核心結論&#xff08;記住這三句話&#xff09; 1.可迭代對象 (Iterable) 定義&…

Dropout:深度學習中的隨機丟棄正則化技術

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度學習中最廣泛使用的正則化…

vue2遷移到vite[保姆級教程]

vue2遷移到vite[保姆級教程]使用vue CLI創建項目進行vite遷移詳細步驟1. 安裝 Vite 和 Vue 2 支持插件2. 創建 vite.config.js3. 修改 package.json 腳本4. 創建 index.html5. 確保 main.js 正確引入6. 處理靜態資源7. 構建優化&#xff08;可選&#xff09;8. 啟動項目常見問題…