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

news2024/11/15 5:30:12

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

数据集通常被划分为三个部分:训练集(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 KFold

kf = 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.coloradmin.cn/o/1439166.html

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

相关文章

oracle 启动命令以及ORA-01033问题处理、删除归档日志

1 启动数据库:startup 2 关闭数据库:Shutdown immediate 3 查看监听状态:lsnrctl status 4 启动监听:lsnrctl start 5 停止监听:lsnrctl stop 常见问题 1、在服务器重启后会出现,Oracle ORA-01033: ORAC…

CPP项目:Boost搜索引擎

1.项目背景 对于Boost库来说,它是没有搜索功能的,所以我们可以实现一个Boost搜索引擎来实现一个简单的搜索功能,可以更快速的实现Boost库的查找,在这里,我们实现的是站内搜索,而不是全网搜索。 2.对于搜索…

单片机接收PC发出的数据

#include<reg51.h> //包含单片机寄存器的头文件 /***************************************************** 函数功能&#xff1a;接收一个字节数据 ***************************************************/ unsigned char Receive(void) { unsigned char dat; …

Hadoop搭建(完全分布式)

节点分布&#xff1a; bigdata-masterbigdata-slave1bigdata-salve2 NameNode NodeManager NodeManager SecondaryNameNodeDataNodeDataNodeResourceManagerNodeManagerDataNode 目录 一、jdk安装&#xff1a; 二、hadoop安装 一、jdk安装&#xff1a; jdk-8u212链接&am…

03-抓包_封包_协议_APP_小程序_PC应用_WEB应用

抓包_封包_协议_APP_小程序_PC应用_WEB应用 一、参考工具二、演示案例&#xff1a;2.1、WEB应用站点操作数据抓包-浏览器审查查看元素网络监听2.2、APP&小程序&PC抓包HTTP/S数据-Charles&Fiddler&Burpsuite2.3、程序进程&网络接口&其他协议抓包-WireSh…

Logback - 日志框架

引言 在当今的企业级应用开发中&#xff0c;日志管理是一个不可或缺的部分。它不仅帮助我们进行错误跟踪&#xff0c;还能有效监控应用程序的运行状态&#xff0c;为性能优化提供数据支撑。Spring Boot作为一个简化Spring应用开发的框架&#xff0c;自带了强大的日志管理功能。…

pytorch训练指标记录之tensoboard,wandb

详解Tensorboard及使用教程_tensorboard怎么用-CSDN博客文章浏览阅读5.1w次&#xff0c;点赞109次&#xff0c;收藏456次。目录一、什么是Tensorboard二、配置Tensorboard环境要求安装三、Tensorboard的使用使用各种add方法记录数据单条曲线(scalar)多条曲线(scalars)直方图(hi…

如何找准用户真实需求,建立情感连接?

品牌如果想要长久发展&#xff0c;除了独特的理念以及过硬的产品质量外还需要一点&#xff0c;那就在于它能持续、正确的为用户创造生活幸福感。这满足了用户的真实需求&#xff0c;并与其产生了情感连接&#xff0c;从而让品牌有机会逐渐融入、改善用户的生活实现长期价值与口…

ctfshow——命令执行

文章目录 web 29——通配符*绕过web30——调用其他命令执行函数web 31——参数逃逸web 32-web 36——配合文件包含伪协议web 37-web 39——文件包含web 40—— web 29——通配符*绕过 i不区分大小写&#xff0c;直接?csystem(tac fl*.php); web30——调用其他命令执行函数 调用…

三天学会MySQL(十)数据库范式与表关系

目录 一.范式 1.简介 2.第一范式 3.第二范式 4.第四范式 5.范式总结 二.表关系 1.简介 2.一对多关系 3.一对一关系 4.多对多关系 一.范式 1.简介 什么是范式&#xff08; NF NormalForm &#xff09; 范式是符合某一种设计要求的总结。 在数据库中表的设计&#…

休斯顿NASA太空机器人进入最后测试阶段,或可模拟人类执行外星任务!

美国宇航局开发研制的太空智能机器人目前正在德州休斯顿的约翰逊航天中心接受最后的运行测试&#xff0c;距离太空智能化时代又要更进一步了&#xff01; NASA表示&#xff0c;日前在德州休斯顿附近的约翰逊航天中心进行测试的机器人名为Valkyrie&#xff0c;是以北欧神话中的一…

Pandas文本数据处理大全:类型判断、空白字符处理、拆分与连接【第67篇—python:文本数据】

文章目录 Pandas文本数据处理大全&#xff1a;类型判断、空白字符处理、拆分与连接1. 判断文本数据类型2. 去除空白字符3. 文本数据拆分4. 文本数据连接5. 文本数据替换6. 文本数据匹配与提取7. 文本数据的大小写转换8. 文本数据的长度计算9. 文本数据的排序10. 文本数据的分组…

APIfox自动化编排场景(二)

测试流程控制条件 你可以在测试场景中新增流程控制条件&#xff08;循环、判断、等待、分组&#xff09;等。进一步满足了更复杂的测试场景/流程配置的使用&#xff0c;最终借助自动化测试功能解决复杂场景的测试工作。 分组​ 当测试流程中多个步骤存在相关联关系时&#xf…

设计模式理解:单例模式+工厂模式+建设者模式+原型模式

迪米特法则&#xff1a;Law of Demeter, LoD, 最少知识原则LKP 如果两个软件实体无须直接通信&#xff0c;那么就不应当发生直接的相互调用&#xff0c;可以通过第三方转发该调用。其目的是降低类之间的耦合度&#xff0c;提高模块的相对独立性。 所以&#xff0c;在运用迪米特…

【第15届蓝桥杯C++青少组中/高级组选拔赛(STEMA)2023年12月17日真题】

第15届蓝桥杯C青少组中/高级组选拔赛(STEMA)2023年12月17日真题 一、单选题 第 1 题 单选题 定义字符串 string a “Hello C”&#xff0c;下列选项可以获取到字符 ‘C’ 的是&#xff08; &#xff09;。 A.a[7] B.a[6] C.a[5] D.a[4] 答案 B 第 2 题 单选题 下列选项中数值…

最大子数组和[中等]

一、题目 给定一个长度为n的环形整数数组nums&#xff0c;返回nums的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c;nums[i]的下一个元素是nums[(i 1) % n]&#xff0c;nums[i]的前一个元素是nums[(i - 1 n) % n]。 子数…

C 语言学习七:指针

指针 指针与地址指针的声明和初始化指针的解引用指针的比较指针和数组指针数组指针和动态内存分配 指针与函数参数指针作为函数参数二级指针 指向函数的指针 指针与地址 指针的声明和初始化 int variable 42; int *ptr &variable; //间接访问 int value *ptr; // valu…

CTFshow web(命令执行29-36)

?ceval($_GET[shy]);&shypassthru(cat flag.php); #逃逸过滤 ?cinclude%09$_GET[shy]?>&shyphp://filter/readconvert.base64-encode/resourceflag.php #文件包含 ?cinclude%0a$_GET[cmd]?>&cmdphp://filter/readconvert.base64-encode/…

2024/2/7总结

Node.js 什么是node.js node.js是一个基于chrome v8 引擎的 JavaScript 运行环境。 浏览器是JavaScript的前端运行环境node.js是JavaScript的后端运行环境 node.js中无法调用DOM和BOM等浏览器内置API fs模块 是node.js官方提供的、用来操作文件的模块&#xff0c;它提供了一系…

后端创建订单

package com.java1234.entity;import io.jsonwebtoken.Claims;/*** jwt验证信息* author java1234_小锋* site www.java1234.com* company Java知识分享网* create 2019-08-13 上午 10:00*/ public class CheckResult {private int errCode;private boolean success;private Cl…