機器學習-數據集劃分

文章目錄

  • 一. 為什么要劃分數據集
  • 二. 數據集劃分的方法
    • 1. 留出法:
    • 2. 交叉驗證:將數據集劃分為訓練集,驗證集,測試集
    • 3. 留一法:
    • 4. 自助法:

一. 為什么要劃分數據集

為了能夠評估模型的泛化能力,可以通過實驗測試對學習器的泛化能力進行評估,進而做出選擇。因此需要使用一個 “測試集” 來測試學習器對新樣本的判別能力,以測試集上的 “測試誤差” 作為泛化誤差的近似。

一般測試集滿足:

  • 能代表整個數據集
  • 測試集與訓練集互斥
  • 測試集與訓練集建議比例: 2比8、3比7 等

二. 數據集劃分的方法

1. 留出法:

將數據集劃分成兩個互斥的集合:訓練集,測試集

● 訓練集用于模型訓練
● 測試集用于模型驗證
● 也稱之為簡單交叉驗證

from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.model_selection import ShuffleSplit
from collections import Counter
from sklearn.datasets import load_iris#加載數據集
x,y = load_iris(return_X_y=True)
Counter(y)

Counter({0: 50, 1: 50, 2: 50})

#留出法(隨機分割)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0)
Counter(y_train), Counter(y_test)

(Counter({2: 44, 0: 39, 1: 37}), Counter({1: 13, 0: 11, 2: 6}))

#留出法(分層分割)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0,stratify=y)
Counter(y_train), Counter(y_test)

(Counter({0: 40, 1: 40, 2: 40}), Counter({0: 10, 1: 10, 2: 10}))

# 多次劃分(隨機分割)
spliter = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
for train,test in spliter.split(x,y):print('隨機多次分割:', Counter(y[test]))

隨機多次分割: Counter({1: 13, 0: 11, 2: 6})
隨機多次分割: Counter({1: 12, 2: 10, 0: 8})
隨機多次分割: Counter({1: 11, 0: 10, 2: 9})
隨機多次分割: Counter({2: 14, 1: 9, 0: 7})
隨機多次分割: Counter({2: 13, 0: 12, 1: 5})

# 多次劃分(分層分割)
spliter = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
for train,test in spliter.split(x,y):print('隨機多次分割:', Counter(y[test]))

隨機多次分割: Counter({0: 10, 1: 10, 2: 10})
隨機多次分割: Counter({2: 10, 0: 10, 1: 10})
隨機多次分割: Counter({0: 10, 1: 10, 2: 10})
隨機多次分割: Counter({1: 10, 2: 10, 0: 10})
隨機多次分割: Counter({1: 10, 2: 10, 0: 10})

2. 交叉驗證:將數據集劃分為訓練集,驗證集,測試集

在這里插入圖片描述
K-Fold交叉驗證,將數據隨機且均勻地分成k分,如上圖所示(k為10),假設每份數據的標號為0-9
● 第一次使用標號為0-8的共9份數據來做訓練,而使用標號為9的這一份數據來進行測試,得到一個準確率
● 第二次使用標記為1-9的共9份數據進行訓練,而使用標號為0的這份數據進行測試,得到第二個準確率
● 以此類推,每次使用9份數據作為訓練,而使用剩下的一份數據進行測試
● 共進行10次訓練,最后模型的準確率為10次準確率的平均值
● 這樣可以避免了數據劃分而造成的評估不準確的問題

● 訓練集用于模型訓練
● 驗證集用于參數調整
● 測試集用于模型驗證

from sklearn.model_selection import KFold   
from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from collections import Counterfrom sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.model_selection import ShuffleSplit
from collections import Counter
from sklearn.datasets import load_iris#加載數據集
x,y = load_iris(return_X_y=True)
Counter(y)

Counter({0: 50, 1: 50, 2: 50})

#隨機交叉驗證
spliter = KFold(n_splits=5, shuffle=True, random_state=0)
for tain,test in spliter.split(x,y):print('隨機交叉驗證:', Counter(y[test]))

隨機交叉驗證: Counter({1: 13, 0: 11, 2: 6})
隨機交叉驗證: Counter({2: 15, 1: 10, 0: 5})
隨機交叉驗證: Counter({0: 10, 1: 10, 2: 10})
隨機交叉驗證: Counter({0: 14, 2: 10, 1: 6})
隨機交叉驗證: Counter({1: 11, 0: 10, 2: 9})

#分層交叉驗證
spliter = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for tain,test in spliter.split(x,y):print('隨機交叉驗證:', Counter(y[test]))

隨機交叉驗證: Counter({0: 10, 1: 10, 2: 10})
隨機交叉驗證: Counter({0: 10, 1: 10, 2: 10})
隨機交叉驗證: Counter({0: 10, 1: 10, 2: 10})
隨機交叉驗證: Counter({0: 10, 1: 10, 2: 10})
隨機交叉驗證: Counter({0: 10, 1: 10, 2: 10})

KFold:
劃分方式:每一折的數據都是從整個數據集中均勻劃分的。例如,5 折交叉驗證意味著數據集被劃分成 5 個子集,每次驗證時選擇其中一個子集作為測試集,其余 4 個子集作為訓練集。每個樣本都會被用作一次驗證集。
沒有重復樣本:每個樣本僅會出現在一個折(訓練集或驗證集)中,不會有重復。
ShuffleSplit:
劃分方式:ShuffleSplit 每次都會隨機選擇訓練集和測試集,且訓練集和測試集可能會有所重疊,也就是說,某些樣本可能會出現在不同的劃分中。
重復樣本:允許樣本在不同的劃分中重復出現,因此數據集的某些樣本在某次劃分中可能作為訓練集,而在另一劃分中作為測試集。

3. 留一法:

每次從訓練數據中抽取一條數據作為測試集

from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import LeavePOut
from sklearn.datasets import load_iris
from collections import Counter#加載數據集
x,y = load_iris(return_X_y=True)
Counter(y)

Counter({0: 50, 1: 50, 2: 50})

#留一法
spliter = LeaveOneOut()
for train,test in spliter.split(x,y):print('訓練集:', len(train), '測試集:', len(test), test)

在這里插入圖片描述

#留p法
spliter = LeavePOut(p=2)
for train,test in spliter.split(x,y):print('訓練集:', len(train), '測試集:', len(test), test)

在這里插入圖片描述

4. 自助法:

以自助采樣(可重復采樣、有放回采樣)為基礎
每次隨機從D中抽出一個樣本,將其拷貝放入D,然后再將該樣本放回初始數據集D中,使得該樣本在下次采樣時仍有可能被抽到;
這個過程重復執行m次后,我們就得到了包含m個樣本的數據集D′,這就是自助采樣的結果。

● 在數據集D中隨機抽取m個樣本作為訓練集
● 沒被隨機抽取到的D-m條數據作為測試集

import pandas as pd# 1. 構造數據集
data = [[90, 2, 10, 40],[60, 4, 15, 45],[75, 3, 13, 46],[78, 2, 64, 22]]data = pd.DataFrame(data)
data

在這里插入圖片描述

# 2. 產生訓練集
'''
這行代碼的作用是從 data 數據集中進行有放回的隨機抽樣,抽樣比例為 100%(即 frac=1)。這意味著每次抽樣后,數據點會被放回數據集中,因此某些數據點可能會被多次抽樣到,而有些數據點可能一次也不會被抽樣到。具體來說:frac=1 表示抽樣的比例為 100%,即抽取的數據量與原數據集相同。
replace=True 表示抽樣是有放回的,即每次抽樣后數據點會被放回數據集中,允許重復抽樣。
這樣做的結果是生成一個與原數據集大小相同的新數據集 train,其中可能包含重復的數據點。
'''
train = data.sample(frac=1, replace=True,random_state=0)
print('訓練集:\n', train)print('*' * 30)# 3. 產生測試集
test = data.loc[data.index.difference(train.index)]
print('測試集:\n', test)

在這里插入圖片描述

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

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

相關文章

根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的Spotify音樂 附python代碼

這段代碼是一個Python腳本,它使用了幾個外部庫來創建一個簡單的圖形用戶界面(GUI),讓用戶根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的音樂。 1. **導入庫**: - `openai`:用于與OpenAI API交互(盡管在這段代碼中沒有使用)。 - `sp…

excel導入數據處理前端

dialogErrorVisible false;dialogErrorTitle ;//錯誤標題public get gridErrorOptions(): GridOptions {return {headerHeight: 30, // 表頭高度rowHeight: 30, // 行高columnDefs: [//列定義{headerName: "序號",field: "SerialNumber",width: 40,pinne…

Vue 攔截監聽原理

Vue 漸進式JavaScript 框架 學習筆記 - Vue 攔截監聽原理 目錄 攔截監聽原理 如何跟蹤變化 攔截監聽示例 觀察者 注意:vue3的變化 總結 攔截監聽原理 如何跟蹤變化 當你把一個普通的Javascript 對象傳入 Vue 實例作為data選項,Vue 將遍歷此對象所有的proper…

全面評測 DOCA 開發環境下的 DPU:性能表現、機器學習與金融高頻交易下的計算能力分析

本文介紹了我在 DOCA 開發環境下對 DPU 進行測評和計算能力測試的一些真實體驗和記錄。在測評過程中,我主要關注了 DPU 在高并發數據傳輸和深度學習場景下的表現,以及基本的系統性能指標,包括 CPU 計算、內存帶寬、多線程/多進程能力和 I/O 性…

基于JAVA的校園二手商品交易平臺的設計與開發

摘 要:政府政策引導與社會觀念的轉變使得國內大學生的創業意識逐漸提高,很多高校大學生開始自主創業。目前我國各大高校暫且還沒有較為成型的針對校內學生創業者的校園網絡服務平臺。本文首先主要是介紹了關于java語言以及web開發的相關技術,…

HarmonyOS Next 應用UI生成工具介紹

背景 HarmonyOS Next適配開發過程中難買難要參考之前邏輯,但是可能時間較長文檔不全,只能參考Android或iOS代碼,有些邏輯較重的場景還可以通過AI工具將Android 的Java代碼邏輯轉成TS完成部分復用。對于一些UI場景只能手動去寫,雖…

總結6..

背包問題的解決過程 在解決問題之前,為描述方便,首先定義一些變量:Vi表示第 i 個物品的價值,Wi表示第 i 個物品的體積,定義V(i,j):當前背包容量 j,前 i 個物品最佳組合對應的價值,同…

代碼隨想錄day1

704.二分查找&#xff1a; 1.左閉右閉 int search(vector<int>& nums, int target) {int right nums.size() - 1;int left 0;while(left < right){int middle left ((right - left) >> 1);if(nums.at(middle) target){return middle;}else if(nums[m…

四級詞匯第六期

1.accomplish 完成 2.implication 暗示 3.complicated 復雜的 4.extent 范圍 5.sufficient 充足的 6.remarkable 引人注目的 7.insight 洞察 8.executive 管理的 9.overlook 俯瞰 忽略 10.urge 渴望 激勵 11.urgent 緊急的 12.accumulate 積累 13.appreciate 賞識 …

OpenHarmony OTA升級參考資料記錄

OpenHarmony 作為一個開源分布式操作系統,通過其強大的 OTA(Over-The-Air)升級能力,為開發者和廠商提供了一套靈活而安全的系統升級方案。 OTA升級方式 根據升級包的應用方式,OpenHarmony 的 OTA 升級可以分為兩種:本地升級和網絡OTA升級。 本地升級 本地升級是將已制作…

【數據結構篇】順序表 超詳細

目錄 一.順序表的定義 1.順序表的概念及結構 1.1線性表 2.順序表的分類 2.1靜態順序表 2.2動態順序表 二.動態順序表的實現 1.準備工作和注意事項 2.順序表的基本接口&#xff1a; 2.0 創建一個順序表 2.1 順序表的初始化 2.2 順序表的銷毀 2.3 順序表的打印 3.順序…

SDL2基本的繪制流程與步驟

SDL2(Simple DirectMedia Layer 2)是一個跨平臺的多媒體庫,它為游戲開發和圖形應用提供了一個簡單的接口,允許程序直接訪問音頻、鍵盤、鼠標、硬件加速的渲染等功能。在 SDL2 中,屏幕繪制的流程通常涉及到窗口的創建、渲染目標的設置、圖像的繪制、事件的處理等幾個步驟。…

上位機工作感想-2024年工作總結和來年計劃

隨著工作年限的增增長&#xff0c;發現自己越來越不喜歡在博客里面寫一些摻雜自己感想的東西了&#xff0c;或許是逐漸被工作逼得“成熟”了吧。2024年&#xff0c;學到了很多東西&#xff0c;做了很多項目&#xff0c;也幫別人解決了很多問題&#xff0c;唯獨沒有漲工資。來這…

阿里云-銀行核心系統轉型之業務建模與技術建模

業務領域建模包括業務建模和技術建模&#xff0c;整體建模流程圖如下&#xff1a; 業務建模包括業務流程建模和業務對象建模 業務流程建模&#xff1a;通過對業務流程現狀分析&#xff0c;結合目標核心系統建設能力要求&#xff0c;參考行業建 模成果&#xff0c;形成結構化的…

Unity3D基于Unity整合BEPUphysicsint物理引擎實戰詳解

引言 Unity3D是一款流行的游戲引擎&#xff0c;提供了豐富的功能和工具&#xff0c;使開發者能夠輕松創建各種類型的游戲。其中&#xff0c;幀同步技術是游戲開發中至關重要的一環&#xff0c;它能確保多個玩家在同一時間內看到的游戲狀態是一致的。BEPUphysicsint是一個基于U…

【C++筆記】紅黑樹封裝map和set深度剖析

【C筆記】紅黑樹封裝map和set深度剖析 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;C筆記 文章目錄 【C筆記】紅黑樹封裝map和set深度剖析前言一. 源碼及框架分析1.1 源碼框架分析 二. 模擬實現map和set2.1封裝map和set 三.迭代器3.1思路…

win32匯編環境,怎么得到磁盤的盤符

;運行效果 ;win32匯編環境,怎么得到磁盤的盤符 ;以下代碼主要為了展示一下原理&#xff0c;應用GetLogicalDrives、GetLogicalDriveStrings函數、屏蔽某些二進制位、按雙字節復制內容等。以下代碼最多查8個盤&#xff0c;即返回值中的1個字節的信息 ;直接抄進RadAsm可編譯運行。…

MongoDB vs Redis:相似與區別

前言 在當今的數據庫領域&#xff0c;MongoDB 和 Redis 都是備受關注的非關系型數據庫&#xff08;NoSQL&#xff09;&#xff0c;它們各自具有獨特的優勢和適用場景。本文將深入探討 MongoDB 和 Redis 的特點&#xff0c;并詳細對比它們之間的相似之處和區別&#xff0c;幫助…

mybatis(19/134)

大致了解了一下工具類&#xff0c;自己手敲了一邊&#xff0c;java的封裝還是真的省去了很多麻煩&#xff0c;封裝成一個工具類就可以不用寫很多重復的步驟&#xff0c;一個工廠對應一個數據庫一個environment就好了。 mybatis中調用sql中的delete占位符里面需要有字符&#xf…

重學SpringBoot3-WebClient配置與使用詳解

更多SpringBoot3內容請關注我的專欄&#xff1a;《SpringBoot3》 期待您的點贊??收藏評論 重學SpringBoot3-WebClient配置與使用詳解 1. 簡介2. 環境準備 2.1 依賴配置 3. WebClient配置 3.1 基礎配置3.2 高級配置3.3 retrieve()和exchange()區別 4. 使用示例 4.1 基本請求操…