机器学习-数据集划分

文章目录

  • 一. 为什么要划分数据集
  • 二. 数据集划分的方法
    • 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 Counter

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})

#随机交叉验证
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)

在这里插入图片描述

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

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

相关文章

最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机

CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机 一、前言二、设备要求三、环境要求四、安装4.1 环境安装4.2 JumpServer安装4.3 访问JumpServerWeb端,进行登录 五、登录Web控制台 一、前言 JumpServer是广受欢迎的开源堡垒机。运维必备神器!JumpServe…

解决CentOS9系统下Zabbix 7.2图形中文字符乱码问题

操作系统:CentOS 9 Zabbix版本:Zabbix7.2 问题描述:主机图形中文字符乱码 解决方案: # 安装字体配置和中文语言包 sudo yum install -y fontconfig langpacks-zh_CN.noarch # 检查是否已有中文字体: fc-list :lan…

JAVA-快速排序

一、快速排序基本思想 快速排序是 Hoare 于 1962 年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中的某元 素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值&#…

WPF1-从最简单的xaml开始

1. 最简单的WPF应用 1.1. App.config1.2. App.xaml 和 App.xaml.cs1.3. MainWindow.xaml 和 MainWindow.xaml.cs 2. 正式开始分析 2.1. 声明即定义2.2. 命名空间 2.2.1. xaml的Property和Attribute2.2.2. xaml中命名空间2.2.3. partial关键字 学习WPF,肯定要先学…

Spring 框架:配置缓存管理器、注解参数与过期时间

在 Spring 框架中,可通过多种方式配置缓存具体行为,常见配置方法如下。 1. 缓存管理器(CacheManager)配置 基于内存的缓存管理器配置(以SimpleCacheManager为例) SimpleCacheManager 是 Spring 提供的简单…

【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中,制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动,旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…

计算机图形学:实验二 三维模型读取与控制

一、程序功能设计 通过键盘和鼠标结合实现了对三维牛模型的变换控制,可以灵活调整旋转的轴、方向、速度以及暂停或复位三维牛模型状态。 动画启动和暂停: 按键:鼠标左键(启动),鼠标右键(暂停…

代码随想录算法训练营day34

代码随想录算法训练营 —day34 文章目录 代码随想录算法训练营前言一、62.不同路径动态规划动态规划空间优化 二、63. 不同路径 II动态规划动态规划优化空间版 三、343. 整数拆分动态规划贪心算法 96.不同的二叉搜索树总结 前言 今天是算法营的第34天,希望自己能够…

DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步

题目 请使用互斥锁 和 信号量分别实现5个线程之间的同步 代码:信号量实现 void* task1(void* arg); void* task2(void* arg); void* task3(void* arg); void* task4(void* arg); void* task5(void* arg);sem_t sem[5]; //信号量变量int main(int argc, const …

不写Sql进行CRUD——MybatisPlus的基本用法

目录 使用步骤 引入依赖 在XXXMapper接口里实现BaseMapper<>接口&#xff08;找爸爸&#xff09; 之后就可以在项目中直接使用XXXMapper内定义的crud方法了 使用mabatis-plus时常用的注解 常见配置 核心功能 条件构造器 查询数据 修改数据 条件构造器的用法&a…

go-zero框架基本配置和错误码封装

文章目录 加载配置信息配置 env加载.env文件配置servicecontext 查询数据生成model文件执行查询操作 错误码封装配置拦截器错误码封装 接上一篇&#xff1a;《go-zero框架快速入门》 加载配置信息 配置 env 在项目根目录下新增 .env 文件&#xff0c;可以配置当前读取哪个环…

JavaScript学习笔记(1)

html 完成了架子&#xff0c; css 做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习 JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 一、引入方式 1.内部脚本 将 JS 代码定义在 HTML 页面中 Jav…

FPGA自分频产生的时钟如何使用?

对于频率比较小的时钟&#xff0c;使用clocking wizard IP往往不能产生&#xff0c;此时就需要我们使用代码进行自分频&#xff0c;自分频产生的时钟首先应该经过BUFG处理&#xff0c;然后还需要进行时钟约束&#xff0c;处理之后才能使用。

(1)STM32 USB设备开发-基础知识

开篇感谢&#xff1a; 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …

9、Docker环境安装Nginx

一、拉取镜像 docker pull nginx:1.24.0二、创建映射目录 作用&#xff1a;是将docker中nginx的相关配置信息映射到外面&#xff0c;方便修改配置文件 1、创建目录 # cd home/ # mkdir nginx/ # cd nginx/ # mkdir conf html log2、生成容器 docker run -p 80:80 -d --name…

linux 下tensorrt的yolov8的前向推理(c++ 版本)的实现

一、环境搭建 cuda 11.4 ubuntu 20.04 opencv-4.5.2 1.1 配置tensorrt 根据本机的硬件配置及cuda的版本&#xff0c;选择TensorRT-8.6.1.6的版本&#xff0c;下载网址为: TensorRT SDK | NVIDIA Developer 根据官网的说明&#xff0c;下载对应的压缩包即可。解压后&…

【前端】Hexo 建站指南

文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验&#xff1a;https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了&#xff0c;想要分享给同学们一起交流进步&#xff0c;该怎么办&#xff1f;想要搭建一个属于自己的知识库…

LetsWave脑电数据简单时频分析及画图matlab(二)

在笔记&#xff08;一&#xff09;中的文档链接&#xff0c;有很详细的介绍时频分析。这里简单描述&#xff0c;letswave7中有两种方法&#xff0c;一种是STFT&#xff08;短时傅里叶变换&#xff09;和CWT&#xff08;连续小波变换&#xff09;。&#xff08;一&#xff09;中…

【二叉树的深搜】二叉树剪枝

文章目录 814. 二叉树剪枝解题思路&#xff1a;深度优先遍历 后序遍历另一种写法 814. 二叉树剪枝 814. 二叉树剪枝 ​ 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 ​ 返回移除了所有不包含 1 的子树的原二叉树。 ​ 节点…

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)

本文基于服务器端环境展开&#xff0c;使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版&#xff0c;仅包含Conda和Python&#xff0c;如果只做深度学习&#xff0c;可使用miniconda。 [注]&#xff1a;Anaconda、Conda与Miniconda Conda&#xff1a;创建和管…