[蜥蜴书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,一经查实,立即删除!

相关文章

【杂谈】-电动汽车的通信协议有哪些?

电动汽车的通信协议有哪些&#xff1f; 文章目录 电动汽车的通信协议有哪些&#xff1f;1、控制器局域网 (CAN)2、ISO 151183、CHAdeMO4、组合充电系统&#xff08;CCS&#xff09;5、Modbus6、本地互连网络 (LIN)7、Ethernet8、蓝牙&WIFI9、总结 电动汽车 (Electric vehic…

python判断ip是否是本机

银河麒麟服务器上下载脚本进行部署的时候&#xff0c;需要判断是部署在本机还是部署在远程服务器上&#xff0c;需要走不同的处理逻辑。 在Python中判断一个IP地址是否是本机的&#xff0c;可以采用以下方法&#xff1a; import socketdef is_local_ip(ip_address):# 获取本机…

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;点击“下…

开发小需求:页面滚动一定距离后,顶部导航栏消失

在Vue3和TypeScript中实现网站顶部导航栏固定&#xff0c;并在页面滚动大于200px时&#xff0c;顶部导航栏消失&#xff0c;出现新的固定在顶部的导航栏 创建一个Vue组件来实现顶部导航栏的逻辑&#xff1a; <template><div class"navbar-wrapper"><…

【大厂AI课学习笔记NO.70】GitHub,GitLab,CODING等

GitHub及其相关产品详细介绍 一、GitHub 定义&#xff1a; GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持Git作为唯一的版本库格式进行托管&#xff0c;故名GitHub。它提供Git仓库的托管服务&#xff0c;并且提供多种功能帮助软件开发者更高效地协作和…

k8s安全控制、授权管理介绍

目录 一.Kubernetes安全控制介绍 1.客户端认证操作 2.访问对象资源依次流程 二.授权管理介绍 1.AlwaysDeny 2.AlwaysAllow 3.ABAC 4.Webhook 5.Node 6.RBAC 三.Role解释 1.Role和ClusterRole 2.Rolebinding和ClusterBinding 3.Rolebinding和ClusterRole 四.准入…

LeetCode-22题:括号生成(原创)

【题目描述】 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 【题目链接】. - 力扣&#xff08;LeetCode&#xff09; 【解题代码】 package dp;import java.util.ArrayList; import java.util.Arrays; im…

数字化审计智慧

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

2024年展望:AI辅助研发引领科技创新潮流,重塑未来研发格局

2024 年 AI 辅助研发趋势 随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI正逐渐渗透到研发的各个环节&#xff0c;变革着传统的研发模式。在这一背景下&a…

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

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

【Java项目介绍和界面搭建】拼图小游戏完结——源代码分析以及资料上传

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

AI与IoT之间的融合:预测性维护

预测性维护是利用数据分析和机器学习算法来预测设备故障和计划维护的一种方法。这种方法可以帮助企业减少意外停机时间&#xff0c;延长设备寿命&#xff0c;并优化维护资源。以下是一个简化的预测性维护应用实例&#xff0c;使用Python和机器学习库scikit-learn来实现。 假设我…

一款开源、免费、跨平台的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…

hive中split函数相关总结

目录 split函数示例实战注意事项 split 函数一直再用&#xff0c;居然发现没有总结&#xff0c;遂补充一下&#xff1b; split函数 在Hive中&#xff0c;split函数用于将一个字符串根据指定的分隔符进行分割&#xff0c;并返回一个数组。它的语法如下&#xff1a; split(str…

【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 主要由随机游…