数据集划分方法

news2024/9/21 23:40:22

        数据集划分是机器学习和数据科学中的一个重要步骤,主要目的是为了确保模型的有效性和可靠性。

        

留出法(简单交叉验证)
将数据集划分为互斥的子集:训练集和测试集。

训练集: 用于训练模型。
测试集: 用于评估模型的性能和验证其准确性。

交叉验证
将数据集分成多个子集,通常包括训练集、验证集和测试集。

训练集: 用于训练模型。
验证集: 用于调整模型的超参数和选择最佳模型。
测试集: 用于最终评估模型的性能。


留一(P)法
留一(P)法是一种特殊的交叉验证方法,每次从数据集中取出一(P)个样本作为测试集,其余样本作为训练集。

测试集: 每次包含单独的一条(P条)数据。
训练集: 包含剩余的所有数据。


自助法
自助法基于有放回采样的概念来生成训练集和测试集。

训练集: 从数据集D中随机抽取m个样本,允许重复抽样(有放回)。
测试集: 包含那些在抽样过程中没有被选中的D-m条数据。

# 从sklearn.datasets模块导入load_iris函数,用于加载鸢尾花数据集
from sklearn.datasets import load_iris

# 从collections模块导入Counter类,用于计算和显示数据中各类别的数量分布
from collections import Counter

# 从sklearn.model_selection模块导入数据集划分和交叉验证工具
from sklearn.model_selection import train_test_split  # 用于随机划分数据集为训练集和测试集
from sklearn.model_selection import ShuffleSplit  # 用于随机划分数据集的交叉验证
from sklearn.model_selection import StratifiedShuffleSplit  # 用于按类别比例随机划分数据集
from sklearn.model_selection import KFold  # 用于K折交叉验证
from sklearn.model_selection import StratifiedKFold  # 用于按类别比例的K折交叉验证
from sklearn.model_selection import LeaveOneOut  # 留一法的交叉验证
from sklearn.model_selection import LeavePOut  # 留p法的交叉验证

# 导入pandas库,主要用于数据处理和操作
import pandas as pd

留出法

# 留出法(简单交叉验证)
def split_data():
    
    # 留出法(随机分割)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=6)
    print('随机分割后的测试集类别分布:', Counter(y_test))

    # 留出法(分层分割)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=6)
    print('分层分割后的测试集类别分布:', Counter(y_test))


# 划分多个训练集和测试集
def multiple_splits():
    # 留出法(随机分割)
    shuffle_splitter = ShuffleSplit(n_splits=2, test_size=0.2, random_state=6)
    for train_indices, test_indices in shuffle_splitter.split(X, y):
        print('随机分割后的测试集类别分布:', Counter(y[test_indices]))

    # 留出法(分层分割)
    stratified_splitter = StratifiedShuffleSplit(n_splits=2, test_size=0.2, random_state=6)
    for train_indices, test_indices in stratified_splitter.split(X, y):
        print('分层分割后的测试集类别分布:', Counter(y[test_indices]))


if __name__ == '__main__':
    print("一次随机分割和一次分层分割:")
    split_data()
    
    print("多次随机分割和多次分层分割:")
    multiple_splits()

 一次随机分割和一次分层分割:
随机分割后的测试集类别分布: Counter({2: 11, 1: 10, 0: 9})
分层分割后的测试集类别分布: Counter({0: 10, 1: 10, 2: 10})
多次随机分割和多次分层分割:
随机分割后的测试集类别分布: Counter({2: 11, 1: 10, 0: 9})
随机分割后的测试集类别分布: Counter({2: 14, 0: 9, 1: 7})
分层分割后的测试集类别分布: Counter({0: 10, 1: 10, 2: 10})
分层分割后的测试集类别分布: Counter({1: 10, 0: 10, 2: 10})

交叉验证法

def cross_validation():
    # 随机交叉验证
    kf_splitter = KFold(n_splits=2, shuffle=True, random_state=6)
    for train_indices, test_indices in kf_splitter.split(X, y):
        print('随机交叉验证测试集类别分布:', Counter(y[test_indices]))
    
    # 分层交叉验证
    stratified_kf_splitter = StratifiedKFold(n_splits=2, shuffle=True, random_state=6)
    for train_indices, test_indices in stratified_kf_splitter.split(X, y):
        print('分层交叉验证测试集类别分布:', Counter(y[test_indices]))

if __name__ == '__main__':
    cross_validation()

随机交叉验证测试集类别分布: Counter({0: 25, 1: 25, 2: 25})
随机交叉验证测试集类别分布: Counter({0: 25, 1: 25, 2: 25})
分层交叉验证测试集类别分布: Counter({0: 25, 1: 25, 2: 25})
分层交叉验证测试集类别分布: Counter({0: 25, 1: 25, 2: 25})

留一(P)法

def leave_one_and_p_out():

    # 留一法
    loo_splitter = LeaveOneOut()
    print('留一法:')
    count1 = 0
    for train_indices, test_indices in loo_splitter.split(X, y):
        if count1 < 5:
            print(f'训练集样本数: {len(train_indices)}, 测试集样本数: {len(test_indices)}, 测试集索引: {test_indices}')
            count1 += 1
        else:
            break
    
    # 留p法
    lpo_splitter = LeavePOut(p=3)
    print('留p法:')
    count2 = 0
    for train_indices, test_indices in lpo_splitter.split(X, y):
       if count2 < 5:  # 仅打印前五个分割
            print(f'训练集样本数: {len(train_indices)}, 测试集样本数: {len(test_indices)}, 测试集索引: {test_indices}')
            count2 += 1
       else:
            break
        
if __name__ == '__main__':
    leave_one_and_p_out()

 留一法:
训练集样本数: 149, 测试集样本数: 1, 测试集索引: [0]
训练集样本数: 149, 测试集样本数: 1, 测试集索引: [1]
训练集样本数: 149, 测试集样本数: 1, 测试集索引: [2]
训练集样本数: 149, 测试集样本数: 1, 测试集索引: [3]
训练集样本数: 149, 测试集样本数: 1, 测试集索引: [4]
留p法:
训练集样本数: 147, 测试集样本数: 3, 测试集索引: [0 1 2]
训练集样本数: 147, 测试集样本数: 3, 测试集索引: [0 1 3]
训练集样本数: 147, 测试集样本数: 3, 测试集索引: [0 1 4]
训练集样本数: 147, 测试集样本数: 3, 测试集索引: [0 1 5]
训练集样本数: 147, 测试集样本数: 3, 测试集索引: [0 1 6]

自助法 

iris = load_iris()
data = pd.DataFrame(data=iris.data[:5], columns=iris.feature_names)
data['target'] = iris.target[:5]
print('数据集:\n', data)
print('=' * 80)

# 产生训练集
train = data.sample(frac=1, replace=True, random_state=6)
print('训练集:\n', train)
print('=' * 80)

# 产生测试集
test = data.loc[data.index.difference(train.index)]
print('测试集:\n', test)

数据集:
    sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)   
0                5.1               3.5                1.4               0.2  \
1                4.9               3.0                1.4               0.2   
2                4.7               3.2                1.3               0.2   
3                4.6               3.1                1.5               0.2   
4                5.0               3.6                1.4               0.2   

   target  
0       0  
1       0  
2       0  
3       0  
4       0  
================================================================================
训练集:
    sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)   
2                4.7               3.2                1.3               0.2  \
1                4.9               3.0                1.4               0.2   
3                4.6               3.1                1.5               0.2   
4                5.0               3.6                1.4               0.2   
2                4.7               3.2                1.3               0.2   

   target  
2       0  
1       0  
3       0  
4       0  
2       0  
================================================================================
测试集:
    sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)   
0                5.1               3.5                1.4               0.2  \

   target  
0       0  

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

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

相关文章

图神经网络揭秘:视觉和实用指南

目录 一、说明 二、图如何网络化&#xff1f; 三、你需要知道的 3.1 进入图神经网络 3.2 消息传递 3.3 我们如何处理最终的向量表示&#xff1f; 四、图神经网络&#xff0c;总结 4.1 为什么选择图形神经网络&#xff1f; 4.2 简而言之 一、说明 了解图神经网络的世界&#xff…

C#中投影运算的深入解析与实例应用

文章目录 1、投影运算的基本语法2、投影运算的高级用法3、投影运算在向量空间中的运用4、投影运算在数据库和XML中的实际应用5、投影运算能用于哪些实际场景&#xff1f;6、结论 在C#编程中&#xff0c;投影运算是一种常用的数据操作技术&#xff0c;它可以将一个数据集合转换成…

开放式耳机推荐?时尚潮流品牌:悠律ringbud pro开放式耳机实测测评

作为一位音乐发烧友&#xff0c;什么类型的耳机都体验过&#xff0c;有些几百上千的耳机音质还是差点意思&#xff0c;还是会有听久了感觉不舒服的情况&#xff0c;低音量感不够的问题&#xff0c;直到用了悠律ringbud pro开放式耳机&#xff0c;才算真正打开新世界的大门&…

C语言程序设计-[2] 数据类型、常量和变量

1、数据类型 C语言支持的数据类型如下&#xff1a; 2、常量 常量就是不同数据类型下的值。这里主要讲整型、实型和字符型常量。 &#xff08;1&#xff09;整型常量&#xff1a;用十进制、八进制和十六进制三种形式表示。 &#xff08;1&#xff09;实型常量&#xff1a;由整…

HCIP实验-MGRE

实验拓扑&#xff1a; 实验要求&#xff1a; 1.R2为ISP&#xff0c;其上只能配置IP地址 2.R1-R2之间为HDLC封装 3.R2-R3之间为PPP封装&#xff0c;pap认证&#xff0c;R2为主认证方 4.R2-R4之间为PPP分装&#xff0c;chap认证&#xff0c;R2为主认证方 5.R1、R3、R4构建MG…

unity拖拽物品遇到的bug及解决思路

记录一下拖拽实现过程中遇到的bug RectTransform 专门用在UI中transform 判断点击是否在UI中 使用这个函数就可以判断点击的是否是UI面板&#xff0c;返回true表明在UI面板中 EventSystem.current.IsPointerOverGameObject()值得一提的是&#xff0c;如果发现了有UI穿透效…

【C语言】分支与循环(分支篇)

前言 C语言是一种结构化的计算机语言&#xff0c;这里指的通常是顺序结构、选择结构、循环结构&#xff0c;掌握这三种结构之后我们就可以解决大多数问题。 分支结构可以使用if、switch来实现&#xff0c;而循环可以使用for、while、do while来实现。 1. if语句 1.1 if if…

【滴水三期】32/64位——PE文件节表打印与解析

【作业内容】 1、手动查&#xff0c;画个PE文件图。 2、编写程序打印节表中的信息。 3、根据节表中的信息&#xff0c;到文件中找到所有的节&#xff0c;观察节的开始位置与大小是否与节表中的描述一致 【PE file_buffer文件图】 【IMAGE_SECTION_HEADER解析】 <winNT.h…

web浏览器播放rtsp视频流,海康监控API

概述 这里记录一下如何让前端播放rtsp协议的视频流 ​ 项目中调用海康API&#xff0c;生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放&#xff0c;说明视频流有问题&#xff0c;唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的&#xff0c;即使…

Qt3D给圆环等立体图形添加纹理图片

添加纹理图片&#xff0c;首先需要自己找一个纹理图&#xff0c;当然了&#xff0c;随便什么图片都行。 创建3D图形的主要步骤查看另一篇文章。 这里主要代码如下&#xff1a; 使用QTextureLoader加载图片&#xff0c;图片路径需为qrc:/的路径。 auto *planeTransform1 ne…

PyMongo

什么是PyMongo PyMongo 是一个 Python 库&#xff0c;用于与 MongoDB 数据库进行交互。MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;提供高性能、可扩展性和灵活的架构。PyMongo 提供了一套工具&#xff0c;使得在 Python 程序中操作 MongoDB 变得简单和高效。 安装PyMo…

【C++程序设计】——利用数组处理批量数据(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…

17085 工作分配问题(优先做)

这个问题可以通过回溯法来解决。我们可以遍历所有可能的工作分配方案&#xff0c;然后找出总劳务费用最小的方案。 以下是C代码实现&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespace std;const int INF 1e9; co…

羌活基因组--文献精读-36

The chromosome-scale assembly of the Notopterygium incisum genome provides insight into the structural diversity of coumarins 羌活&#xff08;Notopterygium incisum&#xff09;基因组的染色体级别组装为香豆素的结构多样性提供了新的见解 摘要 香豆素是由苯丙素途…

内网安全:多种横向移动方式

1.MMC20.Application远程执行命令 2.ShellWindows远程执行命令 3.ShellBrowserWindow远程执行命令 4.WinRM远程执行命令横向移动 5.使用系统漏洞ms17010横向移动 DCOM&#xff1a; DCOM&#xff08;分布式组件对象模型&#xff09;是微软的一系列概念和程序接口。它支持不同…

Java中操作文件

认识⽂件 我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进⾏数据保存时&#xff0c; 往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概 念&#xff0c;就类似办公桌…

【Linux】深入理解线程

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

基于ssm的图书管理系统/图书借阅管理系统

获取源码联系方式请查看文章结尾&#x1f345; 摘 要 网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于图书管理将是又一个传统管理到智能化信息管理的改革&#xff0c;对于传统的图书借阅的管理&#xff0c;所包…

最长上升子序列LIS(一般+优化)

1. 题目 题目链接&#xff1a; B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 输入样例&#xff1a; 6 1 2 4 1 3 4 输出样例&#xff1a; 4 说明/提示&#xff1a; 分别取出 1、2、3、4 即可。 2. 具体实现 2.1 一般做法 dp[i]表示第i个位置的…

医院管理系统读取身份证源码- CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、身份证读取 提高效率&#xff1a;快速获取身份信息&#xff0c;避免手动输入的繁琐和耗时&#xff0c;极大地提升业务办理速度。 准确性高&#xff1a;减少人工输入错误&#xff0c;确保身份信息的精准无误。 便捷操作&#xff1a;简化流程&#xff0c;使工作人员操作更轻…