《sklearn機器學習》——交叉驗證迭代器

sklearn 交叉驗證迭代器

scikit-learn (sklearn) 中,交叉驗證迭代器(Cross-Validation Iterators)是一組用于生成訓練集和驗證集索引的工具。它們是 model_selection 模塊的核心組件,決定了數據如何被分割,從而支持模型評估、超參數調優等任務。

這些迭代器實現了不同的數據劃分策略,以適應各種數據類型和問題場景。下面詳細介紹 sklearn 中主要的交叉驗證迭代器。


一、核心概念

所有交叉驗證迭代器都遵循相同的接口:

  • 輸入:數據集大小 n_samples
  • 輸出:一個生成器(generator),每次迭代返回一對 (train_indices, test_indices) 的 NumPy 數組。
  • 用途:可用于 cross_val_score, GridSearchCV 等函數的 cv 參數。

二、主要交叉驗證迭代器

1. KFold - 標準 K 折交叉驗證

用途:最基礎的 K 折 CV,適用于類別均衡的分類或回歸問題。

工作方式

  • 將數據集劃分為 k 個大小基本相等的折(folds)。
  • 每次使用其中 1 折作為驗證集,其余 k-1 折作為訓練集。
  • 重復 k 次,確保每折都恰好被用作一次驗證集。

參數

  • n_splits:折數,默認為 5。
  • shuffle:是否在劃分前打亂數據順序。建議設為 True,除非數據有時間順序。
  • random_state:隨機種子,確保結果可復現。

代碼示例

from sklearn.model_selection import KFold
import numpy as npX = np.array([[1], [2], [3], [4], [5]])
y = np.array([1, 2, 3, 4, 5])kf = KFold(n_splits=3, shuffle=True, random_state=42)
for train_index, test_index in kf.split(X):print("TRAIN:", train_index, "TEST:", test_index)

2. StratifiedKFold - 分層 K 折交叉驗證

用途:分類任務的首選,尤其當類別分布不均衡時。

工作方式

與 KFold 類似,但確保每一折中各類別的比例與原始數據集大致相同。
避免某些折中某個類別樣本過少或缺失,導致評估偏差。
為什么重要?

例如:一個二分類數據集中正類占 10%。使用普通 KFold 可能在某折中正類樣本極少,導致模型無法學習或評估失真。
StratifiedKFold 保證每折中正類比例都接近 10%。
代碼示例:

python
深色版本
from sklearn.model_selection import StratifiedKFoldy = np.array([0, 0, 0, 1, 1])  # 不均衡數據skf = StratifiedKFold(n_splits=2, shuffle=True, random_state=42)
for train_index, test_index in skf.split(X, y):print("TRAIN:", train_index, "TEST:", test_index)print("Y_TRAIN:", y[train_index], "Y_TEST:", y[test_index])

3. LeaveOneOut (LOO) - 留一法交叉驗證

用途:樣本量非常小(如 < 100)時使用。

工作方式

每次留出一個樣本作為驗證集,其余所有樣本作為訓練集。
重復 n_samples 次。
優缺點:

? 幾乎無偏估計(訓練集最大)。
? 計算成本極高(訓練 n 次),且方差可能很大(單個樣本影響大)。
代碼示例:

python
深色版本
from sklearn.model_selection import LeaveOneOutloo = LeaveOneOut()
for train_index, test_index in loo.split(X):print("TRAIN:", train_index, "TEST:", test_index)

4. LeavePOut - 留 P 法交叉驗證

用途:比 LOO 更一般化,但計算更昂貴。

工作方式

每次留出 p 個樣本作為驗證集,其余所有樣本作為訓練集。
所有可能的 p 個樣本組合都會被嘗試,因此總次數為 C(n, p)。
p=1 時退化為 LOO。
注意:當 n 或 p 稍大時,組合數爆炸,極少在實際中使用。

5. ShuffleSplit - 隨機劃分分割

用途:靈活的隨機抽樣 CV,適合大數據集或需要控制訓練/驗證比例時。

工作方式

不強制使用所有樣本。
每次迭代從數據中隨機抽取指定比例作為訓練集,其余作為驗證集(可重疊)。
可指定迭代次數 n_splits。
參數:

n_splits:迭代次數。
train_size, test_size:訓練/驗證集比例。
優點:

可獨立控制訓練集大小。
適用于大數據,無需完整 K 折。
代碼示例:

python
深色版本
from sklearn.model_selection import ShuffleSplitss = ShuffleSplit(n_splits=3, test_size=0.25, random_state=0)
for train_index, test_index in ss.split(X):print("TRAIN:", train_index, "TEST:", test_index)

6. StratifiedShuffleSplit - 分層隨機劃分

用途:ShuffleSplit 的分層版本,用于類別不均衡的分類任務。

工作方式

在每次隨機劃分時,保持訓練集和驗證集中各類別的比例一致。
適用場景:

大數據集上的分層 CV。
需要固定驗證集大小且保持類別平衡。

7. GroupKFold - 組 K 折交叉驗證

用途:當數據中存在組結構(如:同一用戶多次記錄、同一病人多個樣本),需確保同一組的數據不同時出現在訓練和驗證集中,防止數據泄露。

工作方式

根據 groups 數組劃分,確保一個組的所有樣本要么全在訓練集,要么全在驗證集。
參數:

groups:長度為 n_samples 的數組,表示每個樣本所屬的組。
代碼示例:

python
深色版本
from sklearn.model_selection import GroupKFoldX = [0.1, 0.2, 2.2, 2.4, 2.3, 4.5, 5.7, 5.8]
y = [1, 1, 0, 0, 0, 1, 1, 1]
groups = [1, 1, 2, 2, 2, 3, 3, 3]  # 3 個組gkf = GroupKFold(n_splits=3)
for train_index, test_index in gkf.split(X, y, groups):print("TRAIN:", train_index, "TEST:", test_index)print("GROUPS:", groups[test_index])

8. TimeSeriesSplit - 時間序列交叉驗證

用途:處理時間序列數據,確保不使用未來數據預測過去。

工作方式

按時間順序劃分。
每次迭代,訓練集是過去的數據,驗證集是接下來的一段數據。
訓練集逐漸增長(“前滾”交叉驗證)。
關鍵特性:

不打亂數據。
驗證集始終在訓練集之后。
代碼示例:

python
深色版本
from sklearn.model_selection import TimeSeriesSplittscv = TimeSeriesSplit(n_splits=3)
for train_index, test_index in tscv.split(X):print("TRAIN:", train_index, "TEST:", test_index)

輸出:

深色版本
TRAIN: [0 1 2] TEST: [3]
TRAIN: [0 1 2 3] TEST: [4]

三、如何選擇合適的 CV 迭代器?

場景 推薦迭代器
一般分類(類別均衡) KFold
分類(類別不均衡) ? StratifiedKFold
回歸任務 KFold 或 ShuffleSplit
小樣本數據 LeaveOneOut(謹慎使用)
大數據,靈活劃分 ShuffleSplit, StratifiedShuffleSplit
數據有組結構(避免泄露) GroupKFold, LeaveOneGroupOut
時間序列數據 ? TimeSeriesSplit
需要分層 + 隨機劃分 StratifiedShuffleSplit

四、使用建議

默認選擇:
分類:StratifiedKFold
回歸:KFold
設置 shuffle=True:除非數據有序(如時間序列),否則建議打亂。
固定 random_state:確保實驗可復現。
避免數據泄露:在使用 CV 時,任何數據預處理(如標準化、填充)都應在 CV 循環內部進行(使用 Pipeline)。

python
深色版本
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScalerpipe = Pipeline([('scaler', StandardScaler()),('clf', SVC())
])

在 cross_val_score 中使用 pipe,確保 scaler 只在訓練集上擬合

cross_val_score(pipe, X, y, cv=5)

總結

sklearn 的交叉驗證迭代器提供了豐富且靈活的工具,能夠適應從標準分類到時間序列、組數據等各種復雜場景。選擇合適的迭代器是獲得可靠、無偏模型評估的關鍵第一步。務必根據數據的結構和任務類型,選擇最匹配的 CV 策略。

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

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

相關文章

Trae+Chrome MCP Server 讓AI接管你的瀏覽器

一、核心優勢1、無縫集成現有瀏覽器環境直接復用用戶已打開的 Chrome 瀏覽器&#xff0c;保留所有登錄狀態、書簽、擴展及歷史記錄&#xff0c;無需重新登錄或配置環境。對比傳統工具&#xff08;如 Playwright&#xff09;需獨立啟動瀏覽器進程且無法保留用戶環境&#xff0c;…

Shell 編程 —— 正則表達式與文本處理器

目錄 一. 正則表達式 1.1 定義 1.2 用途 1.3 Linux 正則表達式分類 1.4 正則表達式組成 &#xff08;1&#xff09;普通字符 &#xff08;2&#xff09;元字符&#xff1a;規則的核心載體 &#xff08;3&#xff09; 重復次數 &#xff08;4&#xff09;兩類正則的核心…

Springboot 監控篇

在 Spring Boot 中實現 JVM 在線監控&#xff08;包括線程曲線、內存使用、GC 情況等&#xff09;&#xff0c;最常用的方案是結合 Spring Boot Actuator Micrometer 監控可視化工具&#xff08;如 Grafana、Prometheus&#xff09;。以下是完整實現方案&#xff1a; 一、核…

Java 大視界 --Java 大數據在智能教育學習資源整合與知識圖譜構建中的深度應用(406)

Java 大視界 --Java 大數據在智能教育學習資源整合與知識圖譜構建中的深度應用&#xff08;406&#xff09;引言&#xff1a;正文&#xff1a;一、智能教育的兩大核心痛點與 Java 大數據的適配性1.1 資源整合&#xff1a;42% 重復率背后的 “三大堵點”1.2 知識圖譜&#xff1a…

2025年新版C語言 模電數電及51單片機Proteus嵌入式開發入門實戰系統學習,一整套全齊了再也不用東拼西湊

最近有同學說想系統學習嵌入式&#xff0c;問我有沒有系統學習的路線推薦。剛入門的同學可能不知道如何下手&#xff0c;這里一站式安排上。先說下學習的順序&#xff0c;先學習C語言&#xff0c;接著學習模電數電&#xff08;即模擬電路和數字電路&#xff09;最后學習51單片機…

Android的USB通信 (AOA Android開放配件協議)

USB 主機和配件概覽Android 通過 USB 配件和 USB 主機兩種模式支持各種 USB 外圍設備和 Android USB 配件&#xff08;實現 Android 配件協議的硬件&#xff09;。在 USB 配件模式下&#xff0c;外部 USB 硬件充當 USB 主機。配件示例可能包括機器人控制器、擴展塢、診斷和音樂…

人工智能視頻畫質增強和修復軟件Topaz Video AI v7.1.1最新漢化,自帶星光模型

軟件介紹 這是一款專業的視頻修復工具-topaz video ai&#xff0c;該版本是解壓即可使用&#xff0c;自帶漢化&#xff0c;免登陸無輸出水印。 軟件特點 不登錄不注冊解壓即可使用無水印輸出視頻畫質提升 軟件使用 選擇我們需要提升畫質的視頻即可 軟件下載 夸克 其他網盤…

LeetCode 777.在LR字符串中交換相鄰字符

在一個由 ‘L’ , ‘R’ 和 ‘X’ 三個字符組成的字符串&#xff08;例如"RXXLRXRXL"&#xff09;中進行移動操作。一次移動操作指用一個 “LX” 替換一個 “XL”&#xff0c;或者用一個 “XR” 替換一個 “RX”。現給定起始字符串 start 和結束字符串 result&#x…

RK-Android15-WIFI白名單功能實現

實現WIFI白名單功能 。 三個模式: 1、默認模式:允許搜索所有的WIFI顯示、搜索出來 ; 2、禁用模式:允許所有WIFI顯示,能夠搜索出來 ;3、白名單模式:允許指定WIFI名單顯示,被搜索出來 文章目錄 前言-需求 一、參考資料 二、核心修改文件和實現方式 1、修改文件 疑問思考 …

Maven + JUnit:Java單元測試的堅實組合

Maven JUnit&#xff1a;Java單元測試的堅實組合Maven JUnit&#xff1a;Java單元測試的堅實組合一、什么是軟件測試&#xff1f;二、測試的維度&#xff1a;階段與方法&#xff08;一&#xff09;測試的四大階段&#xff08;二&#xff09;測試的三大方法三、main方法測試與…

FFMPEG 10BIT下 Intel b570 qsv 硬解AV1,H265視頻編碼測試

上10bitffmpeg 8.0 b570最新驅動 &#xff0c;CPU 12100F 顯卡 Intel b570 ffmpeg -hwaccel_output_format qsv -i "XXX.mkv" -vf "formatp010le" -c:v hevc_qsv -global_quality 19 -quality best -rc_mode ICQ -preset veryslow -g 120 -refs 5 -b…

SQL分類詳解:掌握DQL、DML、DDL等數據庫語言類型

如果你是一名數據庫運維工程師&#xff0c;或者正在學習數據庫技術&#xff0c;那么理解SQL的不同類型是非常重要的。讓我們一起看看SQL到底有哪些種類&#xff0c;以及它們各自的作用。 1. 什么是SQL&#xff1f; SQL&#xff08;Structured Query Language&#xff09;是一種…

[特殊字符] 預告!我正在開發一款讓自動化操作變得「像呼吸一樣自然」的AI神器

各位技術愛好者和創作者朋友們&#xff0c;我要解決一個行業痛點&#xff01;在上一個項目中&#xff08;&#x1f525; 重磅預告&#xff01;我要用AI開發一個自媒體神器&#xff0c;徹底解決創作者的7大痛點&#xff01;&#xff09;&#xff0c;我本來雄心勃勃地打算直接用R…

加密軟件哪個好用?加密軟件-為數據共享提供安全保障

企業與合作伙伴協作時需共享大量數據&#xff0c;若缺乏保護&#xff0c;數據可能被非法獲取&#xff0c;影響合作信任&#xff0c;甚至引發商業糾紛。加密軟件可確保共享數據僅授權方可見&#xff0c;為數據共享提供安全保障&#xff0c;推動合作順利開展。?1.固信軟件固信加…

FPGA復位

1:能不復位盡量不要復位&#xff0c;減少邏輯扇出數&#xff1a;比如打拍信號。2:xilinx的FPGA推薦高復位&#xff0c;ATERAL的FPGA推薦低復位。3:盡量使用異步復位&#xff1a;大多數廠商目標庫內的觸發器都只有異步復位端口&#xff0c;采用同步復位需消耗較多邏輯資源。一&a…

Cursor 教我學 Python

文章目錄1. 寫在最前面2. Python 語法2.1 yield2.1.1 yield 和 return 的區別2.1.2 golang 中實現 yield 語法3. aiohttp 庫3.1 原始寫法3.2 修改寫法3.2 耗時對比分析4. 碎碎念5. 參考資料1. 寫在最前面 最近加了很多 Python Coding 的任務&#xff0c;雖然在 AI 加持下能夠順…

Ollama:本地大語言模型部署和使用詳解

1.什么是Ollama&#xff1f; Ollama是一個開源的大語言模型管理工具&#xff0c;具有以下特點&#xff1a; 簡單易用&#xff1a;提供簡單的命令行接口本地部署&#xff1a;模型運行在本地&#xff0c;保護數據隱私跨平臺支持&#xff1a;支持Windows、macOS、Linux豐富的模型…

云計算學習100天-第41天 -普羅米修斯2

目錄 五、添加被監控端 1、在web1[192.168.88.100]上部署node exporter 2、在Prometheus服務器上添加監控節點 3、瀏覽器查看添加結果 六、Grafana的部署 概述 部署步驟 七、監控MySQL數據庫 1、配置MySQL 2、配置mysql exporter 3、配置prometheus監控mysql 五、添…

集成電路學習:什么是SVM支持向量機

SVM:支持向量機 SVM,即支持向量機(Support Vector Machine),是一種常用的機器學習算法,特別適用于分類和回歸問題。以下是對SVM的詳細解析: 一、SVM的基本原理 SVM的基本思想是在特征空間中尋找一個最優的超平面,使得不同類別的樣本能夠被最大化地分開。這個最優…

盲盒抽谷機小程序開發:如何用3D技術重構沉浸式體驗?

在盲盒經濟中&#xff0c;“沉浸感”是提升用戶停留時長與轉化率的核心武器。某品牌通過3D扭蛋機旋轉、卡牌翻轉特效&#xff0c;使用戶停留時長從15秒延長至45秒&#xff0c;轉化率提升25%&#xff1b;另一品牌上線AR試戴功能后&#xff0c;單次抽谷時長延長至2分鐘&#xff0…