机器学习---数据分割

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

为此,需使用一个“测试集"(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.mfbz.cn/a/434690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统系列学习——内核级线程实现

文章目录 前言内核级线程实现 前言 一个本硕双非的小菜鸡,备战24年秋招,计划学习操作系统并完成6.0S81,加油! 本文总结自B站【哈工大】操作系统 李治军(全32讲) 老师课程讲的非常好,感谢 【哈工…

Linux第71步_将linux中的多个文件编译成一个驱动模块

学习目的:采用旧字符设备测试linux系统点灯,进一步熟悉其设计原理。采用多文件参与编译,深度学习编写Makefile,有利于实现驱动模块化设计。 1、创建MyOldLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home…

softmax和sigmoid的区别

sigmoid 公式: s i g m o i d ( x ) 1 1 e − x sigmoid(x) \frac{1}{1 e^{-x}} sigmoid(x)1e−x1​ 函数曲线如下: 导数公式: f ( x ) ′ e − x ( 1 e − x ) 2 f ( x ) ( 1 − f ( x ) ) f(x)\prime \frac{ e^{-x}}{(1 e^{-x})…

备战蓝桥杯————二分搜索(一)

引言 一、二分查找 基本概念 代码框架 二、二分查找 题目描述 解题思路及代码 结果展示 三、寻找左侧边界的二分搜索 使用背景 基本代码 引言 在计算机科学的世界里,二分查找算法无疑是一种经典且强大的工具。它以其高效的性能,在有序数据集中…

95、评估使用多线程优化带来的性能提升

本节评估一下,通过对卷积的 co 维度进行多线程切分之后,对于模型的性能提升。 评估下性能 在进行多线程程序运行时,建议电脑中的 CPU 不要有其他繁重的任务执行。 在相同的环境下,分别运行 5th_codegen 和 6th_multi_thread 下的…

Pytorch 复习总结 6

Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 计算机视觉。 本文先介绍了计算机视觉中两种常见的改进模型泛化性能的方法&#xff1a…

香港投资+移民计划高峰论坛圆满落幕洞察趋势,探索未来财富之路

3月4日,由中国香港太阳联合资本有限公司牵头举办的「香港投资移民计划高峰论坛」在港交所圆满结束。吸引超260位高净值人士参加,已收到近600个投资移民意向。此次论坛汇聚了来自世界各地的投资移民专家、企业家、以及潜在投资者,共同探讨香港…

网络编程(3/4)

广播 ​ #include<myhead.h>int main(int argc, const char *argv[]) {//1、创建套接字int sfd socket(AF_INET, SOCK_DGRAM, 0);if(sfd -1){perror("socket error");return -1;}//2、将套接字设置成允许广播int broadcast 1;if(setsockopt(sfd, SOL_SOC…

docker部署前后端分离项目

docker部署前后端分离项目 前提&#xff0c;服务器环境是docker环境&#xff0c;如果服务器没有安装docker&#xff0c;可以先安装docker环境。 各个环境安装docker&#xff1a; Ubuntu上安装Docker&#xff1a; ubuntu离线安装docker: CentOS7离线安装Docker&#xff1a; Cen…

如何给Vue项目配置好一个nginx.conf文件?

如何给Vue项目配置好一个nginx.conf文件&#xff1f; 一般前端项目中&#xff0c;会有一个docker/nginx/nginx.conf文件&#xff0c;用于配置DockerFile配置等。 那么&#xff0c;如何给项目写好一个nginx.conf文件&#xff0c;以DockerFile为例&#xff1a; # 使用 Node.js …

【LeetCode】并查集OJ

目录 1.省份数量 2. 等式方程的可满足性 1.省份数量 题目地址&#xff1a; 547. 省份数量 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a;对于该题我们直接使用并查集&#xff0c;将可以直接的城市都归类一个集合&#xff0c;最后统计数组中集合的总数就是…

Qt入门(一)Qt概述

Qt是什么&#xff1f; Qt是一个跨平台应用开发框架。 Qt既包括了一系列的Qt库&#xff0c;还包括诸多配套的开发工具如QtCreater&#xff0c;GUI Designer。Qt本身是由C开发的&#xff0c;但是也提供了其他编程语言的接口。 Qt的定位以及同类 学一种技术&#xff0c;最重要的是…

WordPress建站入门教程:忘记数据库名称、用户名和密码了怎么办?

有时候我们需要进入phpMyAdmin管理一些数据库&#xff0c;但是登录phpMyAdmin时却需要我们输入数据库的用户名和密码&#xff0c;但是我们不记得了应该怎么办呢&#xff1f; 其实&#xff0c;我们只需要进入WordPress网站根目录找到并打开wp-config.php文件&#xff0c;就可以…

FPGA- RGB_TFT显示屏原理及驱动逻辑

下图是TFT显示屏的显示效果 该显示屏共分为 2 个版本&#xff0c;4.3 寸版本的 TFT4.3’’_V3.0 和 5.0 寸版本的 TFT5.0’’_V3.0。 两者 PCB 背板电路完全相同&#xff0c;接口脚位定义完全相同&#xff0c;接口时序完全相同&#xff0c;仅使用的显示屏 模组尺寸不同。设计两…

多线程相关面试题(2024大厂高频面试题系列)

1、聊一下并行和并发有什么区别&#xff1f; 并发是同一时间应对多件事情的能力&#xff0c;多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力&#xff0c;4核CPU同时执行4个线程 2、说一下线程和进程的区别&#xff1f; 进程是正在运行程序的实例&#xff…

【Linux】常见指令1(ls指令、pwd指令、cd指令、touch指令、mkdir指令、rmdir指令、man指令、cp指令、mv指令、cat指令)

目录 01.ls指令与ll指令 02.pwd指令 03.cd指令 04.touch指令 05.mkdir指令 06.rmdir指令&&rm指令 07.man指令 08.cp指令 09.mv指令 10.cat指令 01.ls指令与ll指令 ls指令&#xff1a; 原型&#xff1a;list directory contents 语法&#xff1a;ls[选项][目录…

于建筑外窗遮阳系数测试的太阳光模拟器模拟太阳光照射房屋视频

太阳光模拟器是一种用于测试建筑外窗遮阳系数的高科技设备。它能够模拟太阳光照射房屋的情景&#xff0c;帮助建筑师和设计师更好地了解建筑外窗的遮阳性能&#xff0c;从而提高建筑的能源效率和舒适度。 这种模拟器的工作原理非常简单&#xff0c;它通过使用高亮度的光源和精密…

【音视频开发好书推荐】RTC程序设计:实时音视频权威指南

目录 1、WebRTC概述2、好书推荐3、本书内容4、本书特色5、作者简介6、谁适合看这本书 1、WebRTC概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个由Google发起的实时音视频通讯C开源库&#xff0c;其提供了音视频采集、编码、网络传输&#xff0c;解码显…

【python高级编程教程】笔记(python教程、python进阶)第三节:(1)多态与鸭子类型(Polymorphism and Duck Typing)

参考文章1&#xff1a;【比刷剧还爽】清华大佬耗时128小时讲完的Python高级教程&#xff01;全套200集&#xff01;学不会退出IT界&#xff01; 参考文章2&#xff1a;清华教授大力打造的Python高级核心技术&#xff01;整整100集&#xff0c;强烈建议学习&#xff08;Python3…

集成算法(随机森林,AdaBoost,Xgboost,Stacking模型)

目录 一、前言 二、Bagging模型 三、Boosting模型 四、Stacking模型 五、总结 一、前言 集成算法&#xff08;Enseamable learning&#xff09; 集成算法一般考虑树模型&#xff0c;KNN就不太适合 目的&#xff1a;让机器学习效果更好&#xff0c;单个不好&#xff0c;一起…