【機器學習【9】】評估算法:數據集劃分與算法泛化能力評估

文章目錄

  • 一、 數據集劃分:訓練集與評估集
  • 二、 K 折交叉驗證:提升評估可靠性
    • 1. 基本原理
      • 1.1. K折交叉驗證基本原理
      • 1.2. 邏輯回歸算法與L2
    • 2. 基于K折交叉驗證L2算法
  • 三、棄一交叉驗證(Leave-One-Out)
    • 1、基本原理
    • 2、代碼實現
  • 四、ShuffleSplit交叉驗證
    • 1、基本原理
    • 2、為什么能降低方差
    • 3、代碼測試
  • 五、 選擇建議

在機器學習中,評估算法的核心目標是衡量模型在“未知數據”上的表現,而不是僅僅追求訓練集上的高分。只有通過科學的評估方法,我們才能判斷模型是否具備良好的泛化能力,避免“過擬合”陷阱。

因此,合理劃分數據集并選擇合適的評估策略,是每一個機器學習項目的基礎環節。

一、 數據集劃分:訓練集與評估集

常見做法是將原始數據集分為訓練集和評估集(也稱測試集),常用比例為67%訓練,33%評估。這種劃分方式簡單高效,適合數據量較大的場景。

from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 導入數據
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 將數據分為輸入數據和輸出結果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
test_size = 0.33
seed = 4 # 將數據隨機分離
X_train, X_test, Y_traing, Y_test = 
train_test_split(X, Y, test_size=test_size, random_state=seed)model = LogisticRegression() # 初始化邏輯回歸模型。
model.fit(X_train, Y_traing) # 模型進行訓練
result = model.score(X_test, Y_test)
print("算法評估結果:%.3f%%" % (result * 100))算法評估結果:80.709%
  • test_size=0.33:指定33%數據作為評估集。
  • random_state=42:設置隨機種子,保證每次劃分結果一致,便于復現實驗。

注意:評估結果(如準確率)只能代表模型在未見過數據上的表現,不能用訓練集直接評估,否則會高估模型能力。

?

二、 K 折交叉驗證:提升評估可靠性

1. 基本原理

1.1. K折交叉驗證基本原理

當數據量有限時,單次劃分可能導致評估結果不穩定。K 折交叉驗證(K-Fold Cross Validation)通過多次劃分和訓練,有效提升評估的穩健性。

原理簡述

  • 將數據分為 K 份,每次用 K-1 份訓練,剩下1份評估。
  • 重復 K 次,每份都做一次評估,最后取平均分。

?

1.2. 邏輯回歸算法與L2

邏輯回歸是一種用于二分類問題的機器學習算法。它通過一個特殊的函數(sigmoid函數)將線性組合轉換為0到1之間的概率值。

P(y=1)=1/(1+e(?z))P(y=1) = 1 / (1 + e^{(-z)}) P(y=1)=1/(1+e(?z))

其中 z = w?x? + w?x? + … + w?x? + b,這里的權重 w?, w?, ..., w? 決定了每個特征的重要性。當某個特征的權重很大時,這個特征對預測結果的影響就很大。

L2正則化是防止它過擬合的關鍵技術。

當特征很多或數據量較小時,邏輯回歸容易過擬合。模型可能學習到一些噪聲模式,導致在訓練集上表現很好,但在新數據上表現很差。這是因為模型"記住"了訓練數據中的隨機波動,而不是學習到真正的規律。

L2正則化通過懲罰大的權重值來防止過擬合。

總損失=交叉熵損失+λ×Σ(權重2)總損失 = 交叉熵損失 + λ × Σ(權重2)總損失=交叉熵損失+λ×Σ(2)

λ × Σ(權重2):衡量所有權重的平方和。

交叉熵損失=?Σ[y×log(p)+(1?y)×log(1?p)]交叉熵損失 = -Σ[y × log(p) + (1-y) × log(1-p)] 交叉熵損失=?Σ[y×log(p)+(1?y)×log(1?p)]

  • y 是真實標簽(0或1)
  • p 是模型預測的概率

現在舉例說明L2原理,假設模型有如下4個權重,現在對不同模型引入懲罰系數,

# 模型A:權重較大
權重_A = [5.0, -4.0, 6.0, -5.0]
預測準確率 = 95%
交叉熵損失 = 0.1
L2懲罰項 = 0.1 × (25+16+36+25) = 0.1 × 102 = 10.2
總損失 = 0.1 + 10.2 = 10.3# 模型B:權重較小
權重_B = [2.0, -1.5, 2.5, -2.0]
預測準確率 = 94%
交叉熵損失 = 0.15
L2懲罰項 = 0.1 × (4+2.25+6.25+4) = 0.1 × 16.5 = 1.65
總損失 = 0.15 + 1.65 = 1.8

結果分析
L2正則化的目標是最小化總損失,而不是最大化預測準確率。雖然模型A的預測準確率更高(95% vs 94%),但它的總損失更大(10.3 vs 1.8)。那為什么總損失更重要?

  1. 過擬合風險:模型A的權重很大,說明它可能"記住"了訓練數據中的噪聲,而不是學習到真正的規律。雖然現在預測準確,但在新數據上可能表現很差。
  2. 泛化能力:模型B的權重較小,說明它更"保守",不會過分依賴某些特征。雖然準確率稍低,但更穩定,在新數據上表現更好。

所以,L2正則化選擇總損失更小的模型,即使它的預測準確率稍低。這是因為較小的權重意味著模型更穩定,泛化能力更強,不容易過擬合。這就是為什么模型B雖然準確率94%,但總損失1.8,比模型A的10.3更優。

?

2. 基于K折交叉驗證L2算法

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression。。。數據集劃分見上
# 創建K折交叉驗證對象
# n_splits=num_folds: 將數據集分成num_folds份,進行num_folds次訓練和驗證
# random_state=seed: 設置隨機種子,確保每次運行結果一致
# shuffle=True: 在分割前先打亂數據,避免數據順序對結果的影響
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)# 創建邏輯回歸模型
# LogisticRegression(): 默認使用L2正則化,適用于二分類問題
# 可以通過參數調整正則化強度、求解器等
model = LogisticRegression()# 使用交叉驗證評估模型性能
# cross_val_score(): 自動進行K折交叉驗證,返回每折的得分
# model: 要評估的模型
# X: 特征矩陣
# Y: 目標變量
# cv=kfold: 使用上面定義的K折交叉驗證策略
result = cross_val_score(model, X, Y, cv=kfold)# 輸出評估結果
print("算法評估結果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))算法評估結果:77.864% (4.735%)

優缺點

  • 優點:充分利用數據,評估更穩健。
  • 缺點:計算量較大,尤其是K值較高時。

?

三、棄一交叉驗證(Leave-One-Out)

1、基本原理

棄一交叉驗證(LOOCV)是一種特殊的交叉驗證方法,專門用于極小數據集。它的核心思想很簡單:每次只留一個樣本做測試,其余全部用于訓練,這樣循環N次(N為樣本總數)。

當數據集很小時,傳統的K折交叉驗證可能不夠可靠。比如只有10個樣本,分成5折意味著每折只有2個樣本,這樣的評估結果波動很大,不夠穩定。LOOCV通過最大化訓練數據來解決這個問題。

每次訓練時,模型都能使用N-1個樣本,這在小數據集上是非常寶貴的。同時,每個樣本都會被用作測試集一次,確保了評估的全面性。

?

2、代碼實現

from sklearn.model_selection import LeaveOneOut# 創建棄一交叉驗證對象
# loocv:自動實現每次留一個樣本的驗證策略
# 如果數據集有N個樣本,會進行N次訓練和測試
loocv = LeaveOneOut()# 使用棄一交叉驗證評估模型性能
# cross_val_score:自動進行N次訓練和測試,返回每次的得分
# model:要評估的模型(如邏輯回歸、隨機森林等)
# X:特征矩陣
# Y:目標變量
# cv=loocv:使用棄一交叉驗證策略
result = cross_val_score(model, X, Y, cv=loocv)# 輸出評估結果
# result.mean():計算所有N次評估的平均得分
# result.std():計算所有N次評估的標準差,衡量模型穩定性
print("算法評估結果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))

棄一交叉驗證是極小數據集上最可靠的評估方法。它通過最大化訓練數據利用,為每個樣本提供最全面的評估,從而獲得最穩定的性能指標。雖然計算成本高,但在數據稀缺的情況下,這種"奢侈"是值得的。

?

四、ShuffleSplit交叉驗證

1、基本原理

傳統的K折交叉驗證雖然有效,但在某些情況下可能不夠靈活。比如當數據分布不均勻(某折訓練集某些特征數據很少),或者我們希望獲得更穩健的評估結果時,需要一種更靈活的驗證方法。

ShuffleSplit通過隨機劃分數據來解決這個問題。每次隨機選擇一部分數據作為測試集,其余作為訓練集,然后重復這個過程多次。這樣既保證了評估的隨機性,又通過多次重復降低了結果的方差。

假設設置10次劃分,測試集比例為33%:

  1. 第1次:隨機選擇33%數據做測試,67%做訓練
  2. 第2次:重新隨機選擇33%數據做測試,67%做訓練
  3. 第3次:再次重新隨機選擇…
  4. …重復10次

?

2、為什么能降低方差

1. 減少偶然性
傳統K折使用固定劃分,如果某折恰好包含異常數據,整個評估結果就會受影響。而ShuffleSplit通過多次隨機劃分,將異常數據的影響分散到不同次評估中,從而降低了單次異常對整體結果的影響。

2. 更全面的評估
傳統K折中每個樣本只在固定的某折中測試一次,而ShuffleSplit中每個樣本可能在不同次評估中被測試,獲得更全面的性能評估。這種隨機性確保了評估結果更加客觀和全面。

3. 統計穩定性
傳統K折通常只進行5次評估,結果可能波動很大。而ShuffleSplit可以進行10次或更多次評估,通過增加評估次數來提高統計穩定性,使結果更加可靠。

&nbsp

3、代碼測試


from sklearn.model_selection import ShuffleSplit# 創建ShuffleSplit對象
# n_splits=10:重復10次劃分,獲得10個評估結果
# test_size=0.33:每次33%數據做測試,67%數據做訓練
# random_state=7:設置隨機種子,確保結果可重現
kfold = ShuffleSplit(n_splits=10, test_size=0.33, random_state=7)# 使用ShuffleSplit評估模型性能
# cross_val_score:自動進行10次訓練和測試,返回每次的得分
# model:要評估的模型(如邏輯回歸、隨機森林等)
# X:特征矩陣
# Y:目標變量
# cv=kfold:使用ShuffleSplit驗證策略
result = cross_val_score(model, X, Y, cv=kfold)# 輸出評估結果
# result.mean():計算10次評估的平均得分
# result.std():計算10次評估的標準差,衡量模型穩定性
# *100:將小數轉換為百分比顯示
# %.3f:保留3位小數
print("算法評估結果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))

優缺點分析

  1. 優點:通過多次隨機劃分降低方差,提高評估結果的穩定性;同時具有很高的靈活性,可以自由設置劃分次數和測試集比例,適應各種數據分布情況。

  2. 缺點:需要多次訓練模型,計算成本較高;不同次劃分的測試集可能有重疊,影響評估的獨立性。

ShuffleSplit通過隨機重復劃分的方式,在保持計算效率的同時,顯著降低了評估結果的方差。它特別適合需要穩健評估結果的場景,是傳統交叉驗證方法的有益補充。

?

五、 選擇建議

數據規模推薦方法說明
數據量大67%/33%分割或K折K=3、5、10均可
數據量小棄一交叉或ShuffleSplit最大化數據利用,降低方差
需最終評估K折(K=10)行業“黃金準則”

最佳實踐

  • 每次劃分都要設置random_state,保證實驗可復現。
  • 評估指標要與業務目標一致(如類別不平衡時優先關注AUC等)。
  • 不要用訓練集直接評估模型。

?

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

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

相關文章

CodeBuddy三大利器:Craft智能體、MCP協議和DeepSeek V3,編程效率提升的秘訣:我的CodeBuddy升級體驗之旅(個性化推薦微服務系統)

🌟 嗨,我是Lethehong!🌟 🌍 立志在堅不欲說,成功在久不在速🌍 🚀 歡迎關注:👍點贊??留言收藏🚀 🍀歡迎使用:小智初學計…

Spring Boot 整合 Redis 實現發布/訂閱(含ACK機制 - 事件驅動方案)

Spring Boot整合Redis實現發布/訂閱&#xff08;含ACK機制&#xff09;全流程一、整體架構二、實現步驟步驟1&#xff1a;添加Maven依賴<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

Sklearn 機器學習 線性回歸

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Sklearn 機器學習線性回歸實戰詳解 線性回歸是機器學習中最基礎也最經典的算法之一,…

AJAX案例合集

案例一&#xff1a;更換網站背景JS核心代碼<script>document.querySelector(.bg-ipt).addEventListener(change, e > {//選擇圖片上傳&#xff0c;設置body背景const fd new FormData()fd.append(img, e.target.files[0])axios({url: http://hmajax.itheima.net/api/…

vscode環境下c++的常用快捷鍵和插件

本文提供一些能夠在vscode的環境下&#xff0c;提高c代碼書寫效率的快捷鍵&#xff0c;插件以及設置等等。 快捷鍵ctrlshiftx&#xff1a; 彈出插件菜單ctrlshiftp&#xff1a;彈出命令面板可以快捷執行一些常見命令插件安裝這個后&#xff0c;可以按住ctrl跳轉到方法的實現&am…

React + ts 中應用 Web Work 中集成 WebSocket

一、Web Work定義useEffect(() > {let webSocketIndex -1const websocketWorker new Worker(new URL(./websocketWorker.worker.ts?worker, import.meta.url),{type: module // 必須聲明模塊類型});//初始化WEBSOCKET&#xff08;多個服務器選擇最快建立連接…

RabbitMQ面試精講 Day 3:Exchange類型與路由策略詳解

【RabbitMQ面試精講 Day 3】Exchange類型與路由策略詳解 文章標簽 RabbitMQ,消息隊列,Exchange,路由策略,AMQP,面試題,分布式系統 文章簡述 本文是"RabbitMQ面試精講"系列第3天內容&#xff0c;深入解析RabbitMQ的核心組件——Exchange及其路由策略。文章詳細剖析…

深入解析Hadoop MapReduce Shuffle過程:從環形緩沖區溢寫到Sort與Merge源碼

MapReduce與Shuffle過程概述在大數據處理的經典范式MapReduce中&#xff0c;Shuffle過程如同人體血液循環系統般連接著計算框架的各個組件。作為Hadoop最核心的分布式計算模型&#xff0c;MapReduce通過"分而治之"的思想將海量數據處理分解為Map和Reduce兩個階段&…

Kafka MQ 消費者

Kafka MQ 消費者 1 創建消費者 在讀取消息之前,需要先創建一個KafkaConsumer對象。創建KafkaConsumer對象與創建KafkaProducer對象非常相似—把想要傳給消費者的屬性放在Properties對象里。本章后續部分將深入介紹所有的配置屬性。為簡單起見,這里只提供3個必要的屬性:boo…

人工智能——Opencv圖像色彩空間轉換、灰度實驗、圖像二值化處理、仿射變化

一、圖像色彩空間轉換&#xff08;一&#xff09;顏色加法1、直接相加1、直接相加2、調用cv.add()函數進行飽和操作 在OpenCV中進行顏色的加法&#xff0c;我們說圖像即數組&#xff0c;所以從數據類型來說我們可以直接用numpy的知識來進行直接相加&#xff0c;但是存在…

【JToken】JToken == null 判斷無效的問題

if (innerNode null) {continue; }Debug.Log($"toNode type: {node["toNode"]?.GetType()}");發現這個JToken 無法正確的判斷 是否為 null&#xff0c;再排除邏輯問題后&#xff0c;我基本能確定的是 這個對象 不返回的不是真正的C# NULL 輸出類型后是 N…

C++基于libmodbus庫實現modbus TCP/RTU通信

今天看到了一個參考項目中用到了modbus庫&#xff0c;看著使用很是方便&#xff0c;于是記錄一下。后面有時間了或者用到了再詳細整理。 參考&#xff1a;基于libmodbus庫實現modbus TCP/RTU通信-CSDN博客 一、介紹 1.1庫文件包含 1.2最簡單的使用 本人在QT6.5下&#xff0…

【原創】微信小程序添加TDesign組件

前言 TDesign 是騰訊公司推出的一款UI界面庫,至于騰訊的實力嘛,也不用多說了。 官網:https://tdesign.tencent.com/ 源碼:https://github.com/Tencent/tdesign 目前處于活躍狀態,發文前5日,該庫仍在更新中… 遇到的問題 雖然騰訊為微信小程序開發提供了一個討論的論壇,…

Vue的路由模式的區別和原理

路由模式 Vue 的路由模式指的是 Vue Router 提供的 URL 處理方式&#xff0c;主要有兩種&#xff1a;Hash 模式和History 模式。 Hash模式 在 Vue Router 中&#xff0c;默認使用的是 hash 模式&#xff0c;即 mode: hash。如果想要使用 history 模式&#xff0c;可以設置 mode…

通過TPLink路由器進行用戶行為審計實戰

用戶行為審計是指對用戶在網絡平臺上的行為進行監控和記錄&#xff0c;以便對其行為進行分析和評估的過程。隨著互聯網的普及和發展&#xff0c;用戶行為審計在網絡安全和數據隱私保護方面起到了重要的作用。 用戶行為審計可以幫助發現和預防網絡安全威助。通過對用戶的行為進行…

MYSQL 第一次作業

新建產品庫mysql> CREATE DATABASE mydb6_product;使用產品庫mysql> USE mydb6_product;創建employess表mysql> CREATE TABLE employees (-> id INT PRIMARY KEY,-> name VARCHAR(50) NOT NULL,-> age INT,-> gender VARCHAR(10) NOT NULL DEFAULT unknow…

暑期前端訓練day7——有關vue-diff算法的思考

前言 今天分享一下我對vue的diff的探究&#xff0c;跟我一起深入底層&#xff0c;看一看vue是怎么進行diff的&#xff0c;它的復雜度如何&#xff0c;為什么性能這么高&#xff0c;diff的目標是盡可能的復用原來的真實dom&#xff0c;減少刪除真實dom和創建真實的dom的開銷&…

【Docker】Docker的初步認識以及Ubuntu下的Docker環境安裝、配置

前言 在當今快速迭代的軟件開發與部署領域&#xff0c;容器化技術已成為不可或缺的核心力量&#xff0c;而 Docker 作為容器化技術的杰出代表&#xff0c;正以其輕量、高效、可移植的特性深刻改變著開發與運維的模式。它有效解決了 “在我機器上能運行&#xff0c;在你那里卻不…

【密碼學】2. 古典密碼

目錄2. 古典密碼2.1 經典加密技術基礎2.2 代換技術2.2.1 算術密碼2.2.2 代換密碼&#xff08;Substitution Cipher&#xff09;2.3 置換技術2.4 乘積密碼2.5 歷史上的教訓2. 古典密碼 2.1 經典加密技術基礎 分類 代換&#xff08;Substitution&#xff09;&#xff1a;明文內…

CSS3文本陰影特效全攻略

CSS3文本陰影效果實現 下面我將創建一個展示各種CSS3文本陰影效果的頁面&#xff0c;包含多種樣式示例和代碼實現。 設計思路 創建具有視覺吸引力的標題區域提供多種文本陰影效果實例顯示對應的CSS代碼以供參考添加交互元素讓用戶自定義效果 實現代碼 <!DOCTYPE html&g…