机器学习---数据分割

news2025/3/14 23:44:57

之前的文章中写过,我们可以通过实验测试来对学习器的泛化误差进行评估并进而做出选择。

为此,需使用一个“测试集"(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测

试误差”(testing error)作为泛化误差的近似。通常我们假设测试样本也是从样本真实分布中独立同

分布采样而得。但需注意的是,测试集应该尽可能与训练集互斥。

互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过。

测试样本为什么要尽可能不出现在训练集中呢?为理解这一点,不妨考虑这样一个场景:

老师出了10道习题供同学们练习,考试时老师又用同样的这10道题作为试题,这个考试成绩能否

有效反映出同学们学得好不好呢?

答案是否定的,可能有的同学只会做这10道题却能得高分。

回到我们的问题上来,我们希望得到泛化性能强的模型,好比是希望同学们对课程学得很好、获得

了对所学知识“举一反三"的能力;训练样本相当于给同学们练习的习题,测试过程则相当于考试。

显然,若测试样本被用作训练了,则得到的将是过于“乐观”的估计结果。

可是,我们只有一个包含个样例的数据集

既要训练,又要测试,怎样才能做到呢?答案是:通过对D进行适当的处理,从中产生出训练集

S和测试集T。

下面我们一起总结一下几种常见的做法:留出法、交叉验证法、自助法

1. 留出法

“留出法”(hold-ou)直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为

测试集T,即。在S上训练出模型后,用T来评估其测试误差,作为对

泛化误差的估计。大家在使用的过程中,需注意的是,训练/测试集的划分要尽可能保持数据分布

的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要

保持样本的类别比例相似。如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比

例的采样方式通常称为“分层采样"(stratified sampling)。

例如通过对D进行分层样而获得含70%样本的训练集S和含30%样本的测试集T。

若D包含500个正例、500个反例,则分层采样得到的S应包含350个正例、350个反例,而T则包含

150个正例和150个反例:

若S、T中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。

另一个需注意的问题是,即便在给定训练测试集的样本比例后,仍存在多种划分方式对初始数据集

D进行分割。例如在上面的例子中,可以把D中的样本排序,然后把前350个正例放到训练集中,也

可以把最后350个正例放到训练集中,这些不同的划分将导致不同的训练测试集,相应的,模型评

估的结果也会有差别。因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法

时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

例如进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后就得到100个结果,

而留出法返回的则是这100个结果的平均。

此外,我们希望评估的是用D训练出的模型的性能,但留出法需划分训练/测试集,这就会导致一个

窘境:若令训练集S包含绝大多数样本,则训练出的模型可能更接近于用D训练出的模型,但由于T

比较小,评估结果可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大了,

被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity)。

这个问题没有完美的解决方案,常见做法是将大约2/3~4/5的样本用于训练,剩余样本用于测试。

使用Python实现留出法:

from sklearn.model_selection import train_test_split
#使⽤train_test_split划分训练集和测试集
train_X , test_X, train_Y ,test_Y = train_test_split(
X, Y, test_size=0.2,random_state=0)

在留出法中,有一个特例,叫:留一法(Leave.-One-Out,简称LOO),即每次抽取一个样本做为测

试集。显然,留一法不受随机样本划分方式的影响,因为m个样本只有唯一的方式划分为个子集一

每个子集包含个样本;

使用Python实现留一法:

from sklearn.model_selection import LeaveOneOut
data = [1, 2, 3, 4]
loo = LeaveOneOut()
for train, test in loo.split(data):
print("%s %s" % (train, test))
'''结果
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]
'''

留一法优缺点:

优点:留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一

法中被实际评估的模型,与期望评估的用D训练出的模型很相似。因此,留一法的评估结果往往被

认为比较准确。

缺点:留一法也有其缺陷:在数据集比较大时,训练个模型的计算开销可能是难以忍受的(例如数

据集包含1百万个祥本,则需训练1百万个模型,而这还是在未考虑算法调参的情况下。 

2. 交叉验证法

“交叉验证法"(cross validation)先将数据集D划分为k个大小相似的互斥子集,即

。每个子集Di都尽可能保持数据分布的一致

性,即从D中通过分层抽样得到。

然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得k组训练/

测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值。

显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为强调这一点,通常

把交叉验证法称为“k折交叉验证"(k-fold cross validation)。k最常用的取值是10,此时称为10折交

叉验证;其他常用的k值有5、20等。下图给出了10折交叉验证的示意图。

与留出法相似,将数据集D划分为k个子集同样存在多种划分方式。为减小因样本划分不同而引入

的差别,k折交叉验证通常要随机使用不同的划分重复次,最终的评估结果是这p次k折交叉验证结

果的均值,例如常见的有“10次10折交叉验证”。交叉验证实现方法,除了咱们前面讲的

GridSearchCV之外,还有KFold,StratifiedKFold 

from sklearn.model_selection import KFold,StratifiedKFold

用法:

将训练/测试数据集划分n_splits个互斥子集,每次用其中一个子集当作验证集,剩下的n_splits-1个

作为训练集,进行n_splits,次训练和测试,得到n_splits个结果。

StratifiedKFold的用法和Fold的区别是:SKFold是分层采样,确保训练集,测试集中,各类别样本

的比例是和原始数据集中的一致。

注意点:

对于不能均等分数据集,其前n_samples%n_splits-子集拥有n_samples∥n_splits+1个样本,其余

子集都只有n_samples∥n_splits样本

参数说明:n_splits:表示划分几等份;shuffle:在每次划分时,是否进行洗牌 

①若为False时,其效果等同于random state等于整数,每次划分的结果相同

②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的

属性:①split(X,y=None,groups:=None):将数据集划分成训练集和测试集,返回索引生成器

import numpy as np
from sklearn.model_selection import KFold,StratifiedKFold
X = np.array([
[1,2,3,4],
[11,12,13,14],
[21,22,23,24],
[31,32,33,34],
[41,42,43,44],
[51,52,53,54],
[61,62,63,64],
[71,72,73,74]
])
y = np.array([1,1,0,0,1,1,0,0])
folder = KFold(n_splits = 4, random_state=0, shuffle = False)
sfolder = StratifiedKFold(n_splits = 4, random_state = 0, shuffle = False)
for train, test in folder.split(X, y):
print('train:%s | test:%s' %(train, test))
print("")
for train, test in sfolder.split(X, y):
print('train:%s | test:%s'%(train, test))
print("")

 结果:

# 第⼀个for,输出结果为:
train:[2 3 4 5 6 7] | test:[0 1]
train:[0 1 4 5 6 7] | test:[2 3]
train:[0 1 2 3 6 7] | test:[4 5]
train:[0 1 2 3 4 5] | test:[6 7]
# 第⼆个for,输出结果为:
train:[1 3 4 5 6 7] | test:[0 2]
train:[0 2 4 5 6 7] | test:[1 3]
train:[0 1 2 3 5 7] | test:[4 6]
train:[0 1 2 3 4 6] | test:[5 7]

可以看出,sfold进行4折计算时候,是平衡了测试集中,样本正负的分布的;但是fold却没有。

3. 自助法

我们希望评估的是用D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测

试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的

估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。

有没有什么办法可以减少训练样本规模不同造成的影响,同时还能比较高效地进行实验估计呢? 

“自助法"(bootstrapping)是一个比较好的解决方案,它直接以自助采样法(bootstrap sampling)为基

础。给定包含m个样本的数据集D,我们对它进行采样产生数据集D:每次随机从D中挑选一个样

本,将其拷贝放入D,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被

到;这个过程重复执行次后,我们就得到了包含个样本的数据集D',这就是自助采样的结果。

显然,D中有一部分样本会在D'中多次出现,而另一部分样本不出现。可以做一个简单的估计,样

本在次采样中始终不被采到的概率是,取极限得到

即通过自助采样,初始数据集D中约有36.8%的样本未出现在采样数据集D'中。于是我们可将D'用

作训练集,D\D'用作测试集;这样,实际评估的模型与期望评估的模型都使用个训练样本,而我们

仍有数据总量约1/3的、没在训练集中出现的样本用于测试。

这样的测试结果,亦称“包外估计”(out-of-bagestimate)。

自助法优缺点:

优点:自助法在数据集较小、难以有效划分训练测试集时很有用;此外,自助法能从初始数据集中

产生多个不同的训练集,这对集成学习等方法有很大的好处。

缺点:自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足

够时;留出法和交叉验证法更常用一些。

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

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

相关文章

即插即用篇 | YOLOv8 引入 NAM 注意力机制 | 《NAM: Normalization-based Attention Module》

论文名称:《NAM: Normalization-based Attention Module》 论文地址:https://arxiv.org/pdf/2111.12419.pdf 代码地址:https://github.com/Christian-lyc/NAM 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large…

b站小土堆pytorch学习记录——P8-P9 Tensorboard的使用

文章目录 一、前置知识1.Tensorboard是什么2.SummaryWriter3.add_scalar()4.add_image() 二、代码1.一次函数2.蚂蚁和蜜蜂图片 一、前置知识 1.Tensorboard是什么 TensorBoard 是 TensorFlow 的可视化工具,它允许开发者可视化模型的图(graph&#xff0…

Nano 33 BLE Sense Rev2学习第二节——手机蓝牙接收数据

Nano 33 BLE Sense Rev2需要下载的程序 #include <ArduinoBLE.h> #include "Arduino_BMI270_BMM150.h"float x, y, z; int degreesX 0; int degreesY 0;BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214"); // create service// cre…

论文阅读:Dataset Quantization

摘要 最先进的深度神经网络使用大量&#xff08;百万甚至数十亿&#xff09;数据进行训练。昂贵的计算和内存成本使得在有限的硬件资源上训练它们变得困难&#xff0c;特别是对于最近流行的大型语言模型 (LLM) 和计算机视觉模型 (CV)。因此最近流行的数据集蒸馏方法得到发展&a…

如何构建用于物体和标志检测的自定义模型

让我们快速了解一下AWS的机器学习技术栈&#xff0c;它几乎提供了解决我们业务问题所需的所有机器学习方面的支持。 物体检测是什么&#xff1f; 物体检测是从图像或视频帧中检测特定类别实例的任务。我们的目标是在图像/视频帧中找出哪里有什么物体。它是其他依赖物体的任务…

Locust中wait_time中匿名函数使用方法浅析

前言 翻出之前做个压测项&#xff0c;看到locust中对等待时间的实现方式感到好奇&#xff0c;于是总结下来。 源代码实现 def between(min_wait, max_wait):"""Returns a function that will return a random number between min_wait and max_wait.Example:…

数据库:2024/3/6

作业1&#xff1a;使用C语言完成数据库的增删改 代码&#xff1a; #include <myhead.h>//定义添加员工信息函数 int Add_worker(sqlite3 *ppDb) {//准备sql语句printf("请输入要添加的员工信息:\n");//从终端获取员工信息char rbuf[128]"";fgets(r…

centos7安装maven离线安装

1、从官方网站下载maven文件包 官方下载网站&#xff1a;https://maven.apache.org/download.cgi 2、创建文件夹解压文件 将下载好的安装包&#xff0c;放到创建的目录下&#xff0c;并解压 a、创建/app/maven文件 mkdir /app/mavenb、解压文件 tar -zxvf apache-maven-…

AIOps常见问题

AIOps的自动化通常指什么&#xff1f; AIOps 平台的自动化一般包括以下几个方面&#xff1a; 数据收集和整合&#xff1a;AIOps 平台可以从多个 IT 基础架构组件、应用需求与性能监视工具以及服务工单系统等数据源中收集并整合运维数据&#xff0c;形成一个全面的数据平台。数…

FC-AE-1553 协议

FC-AE-1553 协议 MIL-STD-1553B总线协议总线结构字格式消息传输方式 FC协议FC协议栈拓扑结构服务类型帧/序列/交换FC帧格式 FC-AE-1553网络构成帧类型命令帧状态帧数据帧 Information UnitsNC1NC2NC3-4NC5-7NT1-7 传输模式1. NC-NT2. NT-NC3. NT-NT4. 无数据字的模式命令5. 带数…

C++ spfa判断负环

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你判断图中是否存在负权回路。 输入格式 第一行包含整数 n 和 m 。 接下来 m 行每行包含三个整数 x,y,z &#xff0c;表示存在一条从点 x 到点 y 的有向边&#xff0c;边…

GEE 依照范围裁剪 下载Sentinel-2数据

0. GEE介绍 Google Earth Engine&#xff08;GEE&#xff09; 是由Google开发的一种云端平台&#xff0c;旨在提供强大的地理空间数据处理和分析工具。GEE集成了大量的遥感影像数据和地理空间数据集&#xff0c;以及高性能的计算资源&#xff0c;使用户能够在云端高效地进行大规…

Java基础概念 7-计算机中的数据存储

目录 Java基础概念 7-计算机中的数据存储 计算机的存储规则 进制 十进制:0123456789 二进制:01 常见的进制 不同进制在代码中的表现形式 计算机为什么用二进制存储数据? 进制之间的转换 任意进制转十进制 公式: 系数*基数的权次幂 相加 二进制转十进制** 八进制转…

UEFI Secure Boot

一、前言 在计算机世界&#xff0c;安全是一个永恒的话题。微软的Windows的安全性一直深受诟病&#xff0c;但随着操作系统层面的漏洞逐渐减少&#xff0c;黑客们盯上了BIOS固件。那如何保证从开机到进入操作系统这个过程中的安全呢&#xff1f;下图是Intel CPU的整个UEFI安全启…

Python绘图-9饼图(下)

9.6饼图添加阴影 9.6.1图像呈现 9.6.2绘图代码 # 导入相关库 import numpy as np # 导入numpy库&#xff0c;用于处理数组和数值计算 import matplotlib.pyplot as plt # 导入matplotlib的绘图模块&#xff0c;用于可视化 import matplotlib.patheffects as path_effects …

小程序管理平台:助力企业数字化转型

微信小程序生态近年来发展迅猛&#xff0c;已成为中国互联网不可忽视的力量。截至2023年6月&#xff0c;微信小程序数量已超过300万&#xff0c;同比增长25%&#xff0c;涵盖了电商、生活服务、教育、金融等众多行业。微信小程序内容生态已经日趋完善&#xff0c;并满足各领域用…

脾胃,胃肠中医笔记

目录 脾胃的功能思伤脾&#xff0c;脑力工作者过度思考会伤脾胃焦虑会导致脾胃受伤按摩肚子顺时针还是逆时针&#xff0c;顺时针促消化/逆时针促排便脾胃生病症状舌苔腹胀、滞气的原因为什么大便稀&#xff1f;湿气重的原因及解决方案自测湿气重的方法 治疗脾胃药物总结补中益气…

Java开发中遇到最难的问题,多线程面试题高并发

开篇介绍 个人背景&#xff1a; 不说太多废话&#xff0c;但起码要让你先对我有一个基本的了解。本人毕业于浙江某二本院校&#xff0c;算是科班出身&#xff0c;毕业后就进了一家外包公司做开发&#xff0c;当然不是阿里的外包&#xff0c;具体什么公司就不透露了&#xff0…

Java项目:39 springboot008房屋租赁系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 房屋租赁系统的设计基于现有的网络平台&#xff0c;主要有管理员、房东、用户三个角色 管理员可以在线查看系统已有的人中心、房屋类型管理、…

STM32FreeRTOS信号量(STM32cube高效开发)

一、信号量 &#xff08;一&#xff09;信号量概括 信号量是操作系统中重要的一部分&#xff0c;信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。 FreeRTOS 提供了多种信号量&#xff0c;按信号量的功能可分为二值信号量、计数型信号量、互斥信…