[蜥蜴书Chapter2] -- 创建测试集

目录

一、规则

二、方法

1、seed

2、identifier

1)选取一个身份号

2)选取一定比例的身份号作为测试集

3)身份号的选取:

 3、利用scikit-learn:

1) 随机生成:

2)注:分类

3)利用对收入的分层样本的数量,按比例抽取训练集

代码解释:

目的:



一、规则

随机选取一些例子,除非数据集超大,否则一般选取20%作为测试集

随机选取的函数代码:

import numpy as npdef split_train(data,test_radio):#生成随机数shuffled_indices = np.random.permutation( len(data) )#按照比例计算测试集中数据个数setsize = int( len(data)*test_radio )#切片:随机后的前一部分作为测试集,其余作为训练集test_indices = shuffled_indices[ : setsize]train_indices = shuffled_indices[setsize : ]return data.iloc[train_indices], data.iloc[test_indices]

二、方法

每次随机所得数据都有可能不同,为了保证选取的测试集中的例子稳定,有两种办法

1、seed

为保留相同的数据集,保留随机数的种子 -- 生成随机数的种子号相同,生成的随机数就相同。

import numpy as npdef split_train(data,test_radio):#生成随机数种子,括号里的数字可为任意数np.random.seed(1)shuffled_indices = np.random.permutation( len(data) )setsize = int( len(data)*test_radio )test_indices = shuffled_indices[ : setsize]train_indices = shuffled_indices[setsize : ]return data.iloc[train_indices], data.iloc[test_indices]

 调用该函数(同一文件夹下不同py文件):

import random_split_trainsettrainset, testset = random_split_trainset.split_train(housing,0.2)
#注:housing变量见下载和加载数据一文
print('~'*40)
#运行两次可验证是否生成相同随机数
print(trainset[:10])
print('~'*30)
#分别输出训练集和测试集的数据量
print(len(trainset))
print(len(testset))

2、identifier

给每个例子一个固定标识号,给每一个标识号排序,选取前20%的标识号。这样能保证每次训练的例子相同,即使更新了数据集。

代码:根据数据集中的标识符,按照一定比例将数据集划分为训练集和测试集,以保证在划分过程中不会出现同一样本在不同数据集中的情况。


from zlib import crc32def test_set_check(identifier, test_radio):return crc32(np.int64(identifier)) & 0xffffffff < test_radio *2**32def split_train_test_by_id(data, test_radio, id_column):ids = data[id_column]in_test_set = ids.apply(lambda id_: test_set_check(id_,test_radio))return data.loc[-in_test_set], data.loc[in_test_set]
  1. from zlib import crc32:从Python标准库中的zlib模块导入crc32函数,用于计算CRC32校验值。

  2. def test_set_check(identifier, test_ratio)::定义了一个名为test_set_check的函数,它接受两个参数:identifier是数据集中的唯一标识符,test_ratio是测试集所占比例。

    • np.int64(identifier)将标识符转换为64位整数类型。
    • crc32(np.int64(identifier))计算标识符的CRC32校验值。
    • crc32(np.int64(identifier)) & 0xffffffff确保CRC32校验值是一个32位无符号整数。
    • crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32比较CRC32校验值是否小于测试比例的2^32倍,用于确定该标识符是否应该被分配到测试集。
  3. def split_train_test_by_id(data, test_ratio, id_column)::定义了一个名为split_train_test_by_id的函数,它用于根据标识符划分训练集和测试集。函数接受三个参数:data是包含数据的DataFrame,test_ratio是测试集所占比例,id_column是数据集中用于标识唯一样本的列名。

    • ids = data[id_column]:从数据集中选择标识符列,存储在ids中。
    • ids.apply(lambda id_: test_set_check(id_, test_ratio)):对每个标识符应用test_set_check函数,返回一个布尔Series,表示每个样本是否应该被分配到测试集。
    • data.loc[-in_test_set]:使用布尔索引选择不在测试集中的样本,得到训练集。
    • data.loc[in_test_set]:使用布尔索引选择在测试集中的样本,得到测试集。

1)选取一个身份号

2)选取一定比例的身份号作为测试集

3)身份号的选取:

        1、有些例子自带身份号,如学号

        2、使用行号作为身份号:但需要保证:

                确保新增是数据放在最后,原来的数据不会被删除

代码:

housing_with_id = housing.reset_index()
train_set, test_set = split_train_test_by_id(housing_with_id,0.2,"index")
print('~'*40)
print(train_set)
print('~'*40)
print(test_set)

输出:

 

        3、选取最稳定的特征值,如经纬度等

housing_with_id = housing.reset_index()
housing_with_id["id"] = housing["longitude"] * 1000 + housing["latitude"]
train_set, test_set = split_train_test_by_id(housing_with_id,0.2,"index")print('~'*40)
print(train_set)
print('~'*40)
print(test_set)

 3、利用scikit-learn:

1) 随机生成:

#use scikit-learnfrom sklearn.model_selection import train_test_splittrain_set, test_set = train_test_split(housing, test_size = 0.2, random_state = 1)print('~'*40)
print(train_set)
print('~'*40)
print(test_set)

注:如果数据集足够大的时候,可以取得较为理想的效果。但如果不满足,会导致巨大偏差偏心(sampling bias)。

        比如在男女占比为47:53的时候,数据集的理想状态为男女占比为47:53 -->   分层样本(stratified sampling)

        strata:将数据集按照同种类进行划分抽取成的小组

        如果在有分类的情况下仍随机抽取,就会造成约12%的误差,这样结果会产生严重偏移。

2)注:分类

 将一个变量分成五类:

import download_data  # 导入下载数据模块
import random_split_trainset
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 假设 fetch_data() 和 load_data() 函数是正确实现的
download_data.fetch_data()
housing = download_data.load_data()# 添加一个新的列 "income_cat",将 "median_income" 划分为不同的类别
housing["income_cat"] = pd.cut(housing["median_income"], bins=[0., 1.5, 3.0, 4.5, 6.0, np.inf], labels=[1, 2, 3, 4, 5])# 绘制 "income_cat" 的直方图
housing["income_cat"].hist()
plt.show()

3)利用对收入的分层样本的数量,按比例抽取训练集

import download_data  # 导入下载数据模块
import random_split_trainset
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 假设 fetch_data() 和 load_data() 函数是正确实现的
download_data.fetch_data()
housing = download_data.load_data()# 添加一个新的列 "income_cat",将 "median_income" 划分为不同的类别
housing["income_cat"] = pd.cut(housing["median_income"], bins=[0., 1.5, 3.0, 4.5, 6.0, np.inf], labels=[1, 2, 3, 4, 5])from sklearn.model_selection import StratifiedShuffleSplitsplit = StratifiedShuffleSplit( n_splits=1, test_size=0.2, random_state=1 )
for train_index, test_index in split.split(housing, housing["income_cat"]):start_train_set = housing.loc[train_index]start_test_set = housing.loc[test_index]print( start_test_set["income_cat"].value_counts() / len(start_test_set) )for set_in(strat_train_set,strat_test_set):set_drop("income_cat",axis=1,inplace=True)
代码解释:

        1.导入所需的 Python 模块:download_data、random_split_trainset、numpy、pandas 和 matplotlib.pyplot。这些模块通常用于数据处理、可视化和机器学习。
        2.使用 download_data 模块中的 fetch_data() 函数下载数据,并使用 load_data() 函数加载数据。假设这两个函数能够正确地从某个数据源中获取数据并将其转换为 Pandas DataFrame 格式。
        3.在加载的数据中,通过将 median_income 列的值分割为不同的收入类别,创建了一个新的列 income_cat。这里使用了 pd.cut() 函数来实现,该函数将一列连续数值分成几个离散的区间,并使用 labels 参数为这些区间赋予标签。
        4.接下来,代码导入了 StratifiedShuffleSplit 类从 sklearn.model_selection 模块。这个类用于按照指定的分层策略将数据集分割成训练集和测试集。
        5.使用 StratifiedShuffleSplit 对象创建了一个分层的随机分割器 split,指定了分割的参数:分割份数为 1,测试集的比例为 0.2(即 20%),随机数种子为 1。
        6.使用 split.split() 方法对数据集进行分层随机分割,其中 housing 是数据集,housing["income_cat"] 是分层依据。然后,通过迭代将训练集和测试集索引保存到 train_index 和 test_index 中。
        7.在迭代过程中,通过 housing.loc[] 方法根据索引从原始数据集中获取训练集和测试集,并将其保存到 start_train_set 和 start_test_set 中。
        8.最后,通过打印测试集中每个收入类别的比例,了解测试集的分布情况。这里使用了 value_counts() 方法统计每个类别的数量,并除以测试集的总样本数,以获得比例。

        9.将income_cat移走,让数据变回原始数据。

输出结果:

目的:

按照收入类别分层随机地将数据集分割为训练集和测试集,并检查测试集中每个收入类别的比例是否合理。这是一种常见的数据预处理步骤,以确保在模型训练和评估过程中,各个类别的样本分布保持一致。

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

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

相关文章

Java共享问题 、synchronized 线程安全分析、Monitor、wait/notify

文章目录 1.共享带来的问题1.1 临界区 Critical Section1.2 竞态条件 Race Condition 2. synchronized语法及理解2.1 方法上的 synchronized 3.变量的线程安全分析3.1.成员变量和静态变量是否线程安全&#xff1f;3.2.局部变量是否线程安全&#xff1f;3.2.1 局部变量线程安全分…

Pycharm安装,环境初次配置与运行第一个简单程序

一、Pycharm安装 1.在PyCharm官网中&#xff0c;找到社区版下载链接&#xff0c;下载Pycharm社区版&#xff0c;社区版免费 2.下载成功后&#xff0c;双击下载好的安装包&#xff0c;点击下一步后&#xff0c;点击“浏览”更改安装路径到C盘以外其他硬盘&#xff0c;点击“下…

数字化审计智慧

简析内部审计数字化转型的方法和路径 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进…

ChatGPT预训练的奥秘:大规模数据、Transformer架构与自回归学习【文末送书-31】

文章目录 ChatGPT原理与架构ChatGPT的预训练ChatGPT的迁移学习ChatGPT的中间件编程 ChatGPT原理与架构&#xff1a;大模型的预训练、迁移和中间件编程【文末送书-31】 ChatGPT原理与架构 近年来&#xff0c;人工智能领域取得了巨大的进展&#xff0c;其中自然语言处理&#xf…

一款开源、免费、跨平台的Redis可视化管理工具

前言 经常有小伙伴在技术群里问&#xff1a;有什么好用的Redis可视化管理工具推荐的吗&#xff1f;, 今天大姚给大家分享一款我一直在用的开源、免费&#xff08;MIT License&#xff09;、跨平台的Redis可视化管理工具&#xff1a;Another Redis Desktop Manager。 Redis介绍…

【亲测有效】解决三月八号ChatGPT 发消息无响应!

背景 今天忽然发现 ChatGPT 无法发送消息&#xff0c;能查看历史对话&#xff0c;但是无法发送消息。 可能的原因 出现这个问题的各位&#xff0c;应该都是点击登录后顶部弹窗邀请 [加入多语言 alapha 测试] 了&#xff0c;并且语言选择了中文&#xff0c;抓包看到 ab.chatg…

【Python】成功解决ModuleNotFoundError: No module named ‘matplotlib‘

【Python】成功解决ModuleNotFoundError: No module named ‘matplotlib’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

PyCharm如何添加python库

1.使用pip命令在国内源下载需要的库 下面使用清华源&#xff0c;在cmd中输入如下命令就可以了 pip install i https://pypi.tuna.tsinghua.edu.cn/simple 包名版本号2.如果出现报错信息&#xff0c;Cannot unpack file…这种情况&#xff0c;比如下面这种 ERROR: Cannot unpa…

数据结构奇妙旅程之二叉平衡树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

图神经网络实战(4)——基于Node2Vec改进嵌入质量

图神经网络实战&#xff08;4&#xff09;——基于Node2Vec改进嵌入质量 0. 前言1. Node2Vec 架构1.2 定义邻居1.2 在随机游走中引入偏向性1.3 实现有偏随机游走 2. 实现 Node2Vec小结系列链接 0. 前言 Node2Vec 是一种基于 DeepWalk 的架构&#xff0c;DeepWalk 主要由随机游…

qt 格式化打印 日志 QMessagePattern 格式词法语法及设置

一、qt源码格式化日志 关键内部类 QMessagePattern qt为 格式化打印日志 提供了一个简易的 pattern(模式/格式) 词法解析的简易的内部类QMessagePattern,作用是获取和解析自定义的日志格式信息。 该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qloggi…

[LeetCode][226]翻转二叉树

题目 226. 翻转二叉树 给你一棵二叉树的根节点 root&#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#x…

深度学习500问——Chapter02:机器学习基础(5)

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 2.14 贝叶斯分类器 2.14.1 图解极大似然估计 极大似然估计的原理&#xff0c;用一张图片来说明&#xff0c;如下图所示&#xff1a; 例&#xff1a;有两个外形完全相同的箱子&#xff0c;1号箱…

重学SpringBoot3-内容协商机制

重学SpringBoot3-内容协商机制 ContentNegotiationConfigurer接口配置内容协商URL参数Accept头使用Url扩展名 自定义内容协商格式步骤1: 注册自定义媒体类型步骤2: 实现HttpMessageConverter接口步骤3: 使用自定义HttpMessageConverter 注意点 在 Spring Boot 3 中&#xff0c;…

vue学习笔记21-组件传递数据_Props

组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组件之间是可以传递数据的 传递数据的解决方案就是props 父级&#xff1a; 在父级中引入子集 <template><h3>Parent</h3><Child/> </template><script> i…

GFP-GAN环境搭建推理测试

引子 近期&#xff0c;文生图&#xff0c;wav2lip很火&#xff0c;文生图&#xff0c;见识的太多&#xff0c;不多说了。wav2lip其通过语音驱动唇部动作并对视频质量进行修复&#xff0c;里面一般涉及到三个步骤&#xff0c;文本到语音转化&#xff0c;语音驱动唇部动作&#…

【C++初阶】第五站:C/C++内存管理 (匹配使用,干货到位)

前言&#xff1a; 本文知识点&#xff1a; 1. C/C内存分布2. C语言中动态内存管理方式3. C中动态内存管理4. operator new与operator delete函数 5. new和delete的实现原理 &#xff08;干货在此&#xff09; 6. 定位new表达式(placement-new)7. 常见面试题 目录 C/C内…

Java反射、枚举类和lambda表达式

前言&#xff1a; 本章我们就来了解Java中的反射和枚举类。枚举类和反射其实有些关系&#xff0c;接下来我们就来学习他们的使用。 反射&#xff1a; 反射的作用&#xff1a; 反射&#xff1a;反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问。 Java中有…

CVE-2021-31440:eBPF verifier __reg_combine_64_into_32 边界更新错误

文章目录 前言漏洞分析构造 vuln reg 漏洞利用漏洞修复参考 前言 影响版本&#xff1a;Linux 5.7 ~ 5.11.20 8.8 编译选项&#xff1a;CONFIG_BPF_SYSCALL&#xff0c;config 所有带 BPF 字样的编译选项。General setup —> Choose SLAB allocator (SLUB (Unqueued Allocat…

从0到1手把手实现RPC|01 RpcProvider本地实现

RPC的简化版原理如下图&#xff08;核心是代理机制&#xff09;。 1.本地代理存根: Stub2.本地序列化反序列化3.网络通信4.远程序列化反序列化5.远程服务存根: Skeleton6.调用实际业务服务7.原路返回服务结果8.返回给本地调用方 注意处理异常。 RpcProvider的本地实现 1、工…