机器学习:数据集划分笔记

数据集划分是机器学习中非常关键的步骤,能直接影响模型的训练效果和泛化能力。它的主要目的是为了评估模型对新数据的泛化能力,即模型在未见过的数据上能表现良好。

数据集通常被划分为三个部分:训练集(Training set)、验证集(Validation set)和测试集(Test set)。


目录

原因

1.避免过拟合

2.模型评估

3.模型选择和调参

方法

1.留出法(Hold-out Method)

2.自助法(Bootstrap Method)

3.交叉验证法(Cross-Validation Method)

3.1 K-Fold 交叉验证(K-Fold Cross-Validation)

3.2 留一法交叉验证(Leave-One-Out Cross-Validation)

3.3 分层K-Fold 交叉验证(Stratified K-Fold Cross-Validation)

3.4 分组交叉验证(Group K-Fold Cross-Validation)

应用

1.留出法——train_test_split函数

2.自助法——resample函数

3.交叉验证法——KFold或StratifiedKFold类

注意事项

1.数据泄露

2.数据不平衡

3.数据的代表性


原因

1.避免过拟合

过拟合(Overfitting)是机器学习和统计学中的常见问题,表现为模型在训练集上的正确率显著高于验证集。通常是模型过于复杂或训练数据量太少,导致捕捉到了数据中的噪声和异常值,而不仅仅是底层的数据分布规律。

2.模型评估

机器学习需要一种可靠的方法来评估模型的预测能力和泛化能力。其中验证集用于初步评估模型的性能,而测试集用于最终评估模型的泛化能力(即模拟真实世界的应用场景)。

3.模型选择和调参

训练集和验证集能帮助研究者在机器学习项目的开发过程中选择最佳模型和调整参数,以提高模型的性能。



方法

1.留出法(Hold-out Method)

一种简单直观的数据集划分方法,它将数据集分为两个互斥的集合,即训练集和测试集。有时候,为了进行模型选择和调参,还会从训练集中进一步留出一部分数据作为验证集。这种方法的关键在于保持数据的独立性分布的一致性,避免信息泄露和过拟合。

优点

  • 操作简单,易于实现。
  • 分离的测试集可以提供对模型性能的无偏估计。

缺点

  • 数据的划分可能会导致训练集和测试集的分布不一致。
  • 在数据量较少的情况下,留出大部分数据作为训练集可能会导致测试集较小,评估结果的方差较大。
  • 模型的评估结果极度依赖于数据的划分方式。

2.自助法(Bootstrap Method)

一种有放回的抽样方法,用于从原始数据集中生成多个训练集的技术,适用于样本量不足时的模型评估。在自助法中,我们从原始数据集中随机选择一个样本加入到训练集中,然后再把这个样本放回原始数据集,允许它被再次选中。这个过程重复n次,n是原始数据集中的样本数量。这样,一些样本在训练集中会被重复选择,而有些则可能一次也不被选中。未被选中的样本通常用作测试集。

优点

  • 在数据量有限的情况下,自助法可以有效地增加训练数据的多样性。
  • 对于小样本数据集,自助法可以提供更加稳定和准确的模型评估。
  • 可以用来估计样本的分布和参数的置信区间。

缺点

  • 由于采样是有放回的,可能导致训练集中的某些样本被多次选择,而有些样本则从未被选择,这可能会引入额外的方差。
  • 对于足够大的数据集,自助法可能不如其他方法,如 K-Fold 交叉验证,因为重复的样本可能导致评估效果不是很好。

3.交叉验证法(Cross-Validation Method)

通过将数据集分成多个小子集,反复地进行训练和验证过程,以此来减少评估结果因数据划分方式不同而带来的偶然性和不确定性。以下是几种常见的交叉验证方法:

3.1 K-Fold 交叉验证(K-Fold Cross-Validation)

把数据集平均划分成 K个大小相等的子集,对于每一次验证,选取其中一个子集作为验证集,而其余的 K-1个子集合并作为训练集。这个过程会重复K次,每次选择不同的子集作为验证集。最后,通常取这K次验证结果的平均值作为最终的性能评估。适用于数据集不是非常大的情况。

  • 优点:减少了评估结果因数据划分不同而产生的偶然性,提高了评估的准确性和稳定性。
  • 缺点:计算成本高,尤其是当K值较大或数据集较大时。

3.2 留一法交叉验证(Leave-One-Out Cross-Validation)

留一法是 K-Fold 交叉验证的一个特例,其中K等于样本总数。这意味着每次只留下一个样本作为验证集,其余的样本作为训练集。这个过程重复进行,直到每个样本都被用作过一次验证集。

  • 优点:可以最大限度地利用数据,每次训练都使用了几乎所有的样本,这在样本量较少时尤其有价值。
  • 缺点:计算成本非常高,尤其是对于大数据集来说,几乎是不可行的。

3.3 分层K-Fold 交叉验证(Stratified K-Fold Cross-Validation)

分层K-Fold 交叉验证是对 K-Fold 交叉验证的一个改进,特别适用于处理类别不平衡的数据集。在这种方法中,每次划分数据时都会保持每个类别的样本比例,确保在每个训练集和验证集中各类的比例与整个数据集中的比例大致相同。

  • 优点:对于分类问题,可以保持类别比例,提高模型的泛化能力。
  • 缺点:实现相对复杂,需要根据数据的具体类别分布来进行样本的分层抽样。

3.4 分组交叉验证(Group K-Fold Cross-Validation)

分组交叉验证是处理具有明显组结构数据的交叉验证策略。该方法的关键在于确保来自同一组的数据在分割过程中不会被分散到不同的训练集或测试集中。特别适用于数据中存在自然分组的情况,如医学领域(按病人分组)、

原理:

假设我们的数据集中有若干个组,每个组包含多个观察(或样本)。在分组交叉验证中,数据不是随机分成K个子集,而是根据组的标识来分。整个数据集被分为K个子集,但划分的依据是组而不是单个样本。每一次迭代中,选定的一个或多个组整体作为测试集,其余的组作为训练集。这个过程重复进行,直到每个组都有机会作为测试集。

示例:

假设我们有一个医疗影像数据集,这个数据集包含来自100个不同病人的MRI扫描图像。每个病人的图像数量不同,但我们知道哪些图像属于同一个病人。如果我们的目标是开发一个模型,用于根据新病人的MRI图像预测某种疾病的存在,那么在训练和验证模型时,我们需要确保来自同一病人的图像要么全部在训练集中,要么全部在测试集中。这样做的原因是避免模型仅仅因为学习了某个病人图像的特定特征(而不是疾病的普遍特征)而表现出看似良好的性能。

在分组交叉验证中,我们首先将数据按病人分组(即每个组是一个病人的所有图像)。如果我们选择进行 5-fold 交叉验证,那么数据集将被分为5个子集,每个子集包含大约20个病人的所有图像。在验证过程的每一步中,我们选择其中一个子集作为测试集(包含20个病人的图像),剩余的子集(包含其余80个病人的图像)合并作为训练集。这个过程重复5次,每次都更换测试集,以确保每个病人的图像都有机会用于验证模型。

优点:

  • 避免数据泄露:确保模型评估不会受到来自同一组但不同样本的数据相似性的影响。
  • 更准确的泛化能力评估:通过模拟真实场景(即,对未见过的组进行预测)的方式,更准确地评估模型对新数据的处理能力。

缺点:

  • 实现复杂性:需要有明确的组标识,且在数据划分时要根据这些组标识来进行。
  • 可能的样本不均衡:如果各组的大小差异很大,可能导致训练和测试集的样本分布不均。


应用

在Python中,主要通过 scikit-learn 来实现数据划分,该库提供了一系列的函数和类来支持不同的数据划分方法。以下是几种常用的数据集划分方法的Python实现

1.留出法——train_test_split函数

from sklearn.model_selection import train_test_split# 假设X是特征,y是标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2024)

测试集:训练集 = 2:8。

2.自助法——resample函数

from sklearn.utils import resample# 假设X是特征,y是标签
X_bootstrap, y_bootstrap = resample(X, y, replace=True, n_samples=len(X), random_state=2024)

通过有放回的抽样,创建了一个新的 训练集X_bootstrap 和对应的 标签y_bootstrap。

3.交叉验证法——KFoldStratifiedKFold

from sklearn.model_selection import KFoldkf = KFold(n_splits=5, shuffle=True, random_state=2024)for train_index, test_index in kf.split(X):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]

n_splits=5表示分成5份,shuffle=True确保了数据在分割前会被随机打乱。



注意事项

1.数据泄露

在划分数据集时,要确保测试集(有时也包括验证集)中的信息在训练阶段对模型完全不可见,避免数据泄露导致评估结果不准确。

2.数据不平衡

对于不平衡的数据集,需要特别注意采用分层抽样等技术,确保每个类别的样本在各个子集中都有合理的分布。

3.数据的代表性

数据集划分后,需要确保训练集、验证集和测试集在统计特性上都能代表整个数据集,避免由于数据划分导致的偏差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683930.shtml

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

相关文章

Spring boot整合redisson报错

Spring boot整合redisson报错 org.redisson.client.RedisConnectionException: Unable to connect to Redis server: localhost/127.0.0.1:6379 原因 原因是计算机连接不上redis导致的 解决方案 重启redis 在redis文件目录下打开cmd 1.检查redis是否在运行 redis-cli p…

AutoSAR(基础入门篇)9.5-实验:配置通信

目录 一、为通信创建Ports 二、Data Mapping 三、Task Mapping 四、实验总结 终于到了实验篇了,前面的通信内容大家可能看的有点懵,这里确实没什么好的讲解顺序,所以博主自己也觉得讲的有点乱。但是不要紧,前面讲的通信的内容基本上大家很难用到。特别是对于初学者来说…

问题:实行网络化管理,为此需要做好以下几个方面的工作。() #知识分享#其他#职场发展

问题:实行网络化管理,为此需要做好以下几个方面的工作。() A、建立“公共部门—私人部门—第三部门”的合作网络 B、采用平等协商、双向互动、共同参与的决策方式,参与式决策应当成为网络化管理中的主要决策方式 C、建立“公共部门—私人部…

vue axios 请求后端无法传参问题

vue请求后端无法传参问题 问题描述处理过程总结 问题描述 在学习vue时,使用axios调用后端,发现无法把参数正确传到后端,现象如下: 使用vue发起请求,浏览器上已经有传参,但是后端没接收到对应的用户名密码&…

算法之贪心

1.部分背包问题 代码1: 代码2: 但如果金币不能分割,那贪心就不是最优解,正确的做法是搜索或动态规划。 2.排队接水 3.在规定时间内参加最多的比赛 4.合并果子 使用memset初始化int数组时,第二个参数如果是0&#xff0…

Vue源码系列讲解——模板编译篇【五】(优化阶段)

1. 前言 在前几篇文章中,我们介绍了模板编译流程三大阶段中的第一阶段模板解析阶段,在这一阶段主要做的工作是用解析器将用户所写的模板字符串解析成AST抽象语法树,理论上来讲,有了AST就可直接进入第三阶段生成render函数了。其实…

uniapp 开发一个密码管理app

密码管理app 介绍 最近发现自己的账号密码真的是太多了,各种网站,系统,公司内网的,很多站点在登陆的时候都要重新设置密码或者通过短信或者邮箱重新设置密码,真的很麻烦 所以准备开发一个app用来记录这些站好和密码…

软件风险分类整理

软件项目风险分类整理 1.需求分析 2.软件设计 3.编码和单元测试 4.集成和测试 5.验收和维护 6.团队管理 7.成本管理 8.组织管理

事务及在SpringBoot项目中使用的两种方式

1.事务简介 事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 事物的四大特性: 原子性(Atomicity)&#xf…

ubuntu22.04@laptop OpenCV Get Started: 010_blob_detection

ubuntu22.04laptop OpenCV Get Started: 010_blob_detection 1. 源由2. blob应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 Threshold3.2 Area3.3 Circularity3.4 Convexity3.5 Inertia Ratio 4. 总结5. 参考资料6. 补充 1. 源由 Blob是图像中的一组连接像素&#…

Go教程-Go语言简介

这篇文章我们来聊聊Go语言。 Go语言发展历史 以下是Go语言发展的几个里程碑节点: Go一开始是Google内部的一个项目,由三位大佬Rob Pike、Robert Griesemer、Ken Thompson早2007年发起。在2009年11月,Go语言正式对外开源。在2010年&#xf…

Java中的String类的常用方法(对于字符串的常用操作)

目录 一、获取指定索引的字符 二、 获取指定字符或者字符串的索引位置 三、判断字符串是否以指定内容开头或结尾 四、替换指定的字符或者是字符串 五、获取字符串的子串 六、将字符串转换为字符数组 七、比较字符串的内容是否相等 八、连接字符串 九、比较两个字符串的大…

2024-02-16 AIGC-数字人-硅基DUIX-记录

摘要: 2024-02-16 AIGC-数字人-硅基DUIX-记录 文档: https://duix.guiji.ai/duix-website/localHuman Digital Humans (guiji.ai) 文档中心 (guiji.ai) DUIX本地渲染SDK安卓集成文档_v1 | 文档中心 (guiji.ai) 本地化部署duix说明: 将DUIX离线部署到本地并在本地生成数字人需要…

ESP32学习(3)——连接WIFI

1.简介 Wi-Fi是基于IEEE 802.11标准的无线网络技术 让联网设备以无线电波的形式,加入采用TCP/IP通信协议的网络. Wi-Fi设备有两种模式: 1.Access Point(AP) 模式,此为无线接入点,家里的光猫就是结合WiFi和internet路由功能的AP。…

【Java程序员面试专栏 分布式中间件】Redis 核心面试指引

关于Redis部分的核心知识进行一网打尽,包括Redis的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 明确redis的特性、应用场景和数据结构 什么是Redis,Redis有哪些应用场景 Redi…

【十九】【C++】 priority_queue简单使用和仿函数

priority_queue文档介绍翻译 优先队列是一种容器适配器,专门设计成其中的第一个元素始终是根据某种严格的弱排序准则最大的元素。 这种上下文类似于堆,其中元素可以在任何时刻插入,而只能检索最大堆元素(在优先队列中顶部的元素&a…

Stable Diffusion系列(五):原理剖析——从文字到图片的神奇魔法(扩散篇)

文章目录 DDPM论文整体原理前向扩散过程反向扩散过程模型训练过程模型生成过程概率分布视角参数模型设置论文结果分析 要想完成SD中从文字到图片的操作,必须要做到两步,第一步是理解文字输入包含的语义,第二步是利用语义引导图片的生成。下面…

【Java基础题型】力扣88、合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 (要合并到的目标数组)中,使合并后的数组同样按 非递减顺序 排列。 注意:最终&a…

使用redis实现手机短信验证码和lua完成重置功能

文章目录 前言一、介绍二、代码1.LoginController2.reset.lua 总结 前言 2024了,各种各样的门户网站和APP都需要登录,登录方式也各种各样,由于都要绑定用户手机号码,所以大部分都支持了手机验证码登录的方式,接下来我们使用redis来完成验证码的功能。 一、介绍 方法名描述get…

深度学习入门-第2章-感知机

感知机(perceptron) 严格地讲,本章中所说的感知机应该称为“人工神经元”或“朴素感知机”,但是因为很多基本的处理都是共通的,所以这里就简单地称为“感知机”。2.1 感知机是什么 感知机接收多个输入信号&#xff0c…