机器学习-数据集划分

文章目录

  • 一. 为什么要划分数据集
  • 二. 数据集划分的方法
    • 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.mzph.cn/web/66724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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 个物品最佳组合对应的价值,同…

【数据结构篇】顺序表 超详细

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口: 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长,发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了,或许是逐渐被工作逼得“成熟”了吧。2024年,学到了很多东西,做了很多项目,也帮别人解决了很多问题,唯独没有涨工资。来这…

阿里云-银行核心系统转型之业务建模与技术建模

业务领域建模包括业务建模和技术建模,整体建模流程图如下: 业务建模包括业务流程建模和业务对象建模 业务流程建模:通过对业务流程现状分析,结合目标核心系统建设能力要求,参考行业建 模成果,形成结构化的…

【C++笔记】红黑树封装map和set深度剖析

【C笔记】红黑树封装map和set深度剖析 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】红黑树封装map和set深度剖析前言一. 源码及框架分析1.1 源码框架分析 二. 模拟实现map和set2.1封装map和set 三.迭代器3.1思路…

win32汇编环境,怎么得到磁盘的盘符

;运行效果 ;win32汇编环境,怎么得到磁盘的盘符 ;以下代码主要为了展示一下原理,应用GetLogicalDrives、GetLogicalDriveStrings函数、屏蔽某些二进制位、按双字节复制内容等。以下代码最多查8个盘,即返回值中的1个字节的信息 ;直接抄进RadAsm可编译运行。…

mybatis(19/134)

大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符&#xf…

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备 2.1 依赖配置 3. WebClient配置 3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例 4.1 基本请求操…

.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)

系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…

深度学习系列75:sql大模型工具vanna

1. 概述 vanna是一个可以将自然语言转为sql的工具。简单的demo如下: !pip install vanna import vanna from vanna.remote import VannaDefault vn VannaDefault(modelchinook, api_keyvanna.get_api_key(my-emailexample.com)) vn.connect_to_sqlite(https://va…

【线性代数】列主元法求矩阵的逆

列主元方法是一种用于求解矩阵逆的数值方法,特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵,然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤: [精确算法] 列主元高斯消元法 步骤 1&am…

[0242-06].第06节:SpringBoot对SpringMVC的自动配置

SpringBoot学习大纲 一、基于SpringBoot搭建Web工程: 1.1.编码实现步骤: a.创建SpringBoot项目 b.选中依赖:选中我们所需要的模块 1.2.SSM中的WEB开发配置与SpringBoot中WEB开发自动配置对比: a.SSM中的WEB开发: 1…

【21】Word:德国旅游业务❗

目录 题目 NO1.2.3 NO4 NO5.6 NO7 NO8.9.10.11 题目 NO1.2.3 F12:另存为布局→页面设置→页边距:上下左右选中“德国主要城市”→开始→字体对话框→字体/字号→文本效果:段落对话框→对齐方式/字符间距/段落间距 NO4 布局→表对话框…

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper:是C标准库中的字符分类函数,用于检查一个字符是否为小写字母或大写字母,需包含头文件cctype.h(也可用万能头文件包含)。返回布尔类型值。例如: #…

微服务知识——4大主流微服务架构方案

文章目录 1、微服务聚合模式2、微服务共享模式3、微服务代理模式4、微服务异步消息模式 微服务是大型架构的必经之路,也是大厂重点考察对象,下面我就重点详解4大主流微服务架构方案。 1、微服务聚合模式 微服务聚合设计模式,解决了如何从多个…

【HTML+CSS】使用HTML与后端技术连接数据库

目录 一、概述 1.1 HTML前端 1.2 后端技术 1.3 数据库 二、HTML表单示例 三、PHP后端示例 3.1 连接数据库 3.2 接收数据并插入数据库 四、安全性 4.1 防止SQL注入 4.2 数据验证与清洗 五、优化 5.1 索引优化 5.2 查询优化 六、现代Web开发中的最佳实践 6.1 使用…