「日拱一码」033 机器学习——严格划分

目录

简单随机划分(train_test_split)

分组划分(Group Splitting)

简单分组划分 (Group Splitting)

分层分组划分 (Stratified Group Splitting)

交叉验证法(Cross-Validation)

分组K 折交叉验证(GroupKFold)

留一组法(LeaveOneGroupOut)


简单随机划分(train_test_split)

简单随机分组通过随机分配组到训练集和测试集,确保同一组的数据不会同时出现在训练集和测试集中。这种方法简单易实现,但可能无法保证数据分布的平衡性

## 简单随机划分import pandas as pd
from sklearn.model_selection import train_test_splitdata = {'A': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'B': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'C': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'D': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'E': [0.1, 0.2, 0.1, 0.2, 0.3, 0.4],'y': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)# 定义分组特征
df['group'] = df[['A', 'B', 'C', 'D']].apply(lambda row: '_'.join(map(str, row)), axis=1)# 获取所有唯一组
unique_groups = df['group'].unique()# 划分组(而非划分行)
train_groups, test_groups = train_test_split(unique_groups,test_size=0.2,  # 测试集比例random_state=42,  # 随机种子stratify=df.groupby('group')['y'].first().values  # 按目标变量分层
)# 根据组划分数据
train_data = df[df['group'].isin(train_groups)]
test_data = df[df['group'].isin(test_groups)]print(f"训练集: {len(train_data)}条(来自{len(train_groups)}个组)")
print(f"测试集: {len(test_data)}条(来自{len(test_groups)}个组)")# 训练集: 2条(来自1个组)
# 测试集: 4条(来自1个组)

分组划分(Group Splitting)

简单分组划分 (Group Splitting)

简单分组划分的核心思想是将具有相同参数组合的数据划分为同一个组,然后基于这些组进行划分,确保训练集和测试集的组互斥

## 简单分组划分import pandas as pd
from sklearn.model_selection import GroupShuffleSplitdata = {'A': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'B': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'C': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'D': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'E': [0.1, 0.2, 0.1, 0.2, 0.3, 0.4],'y': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)# 定义分组特征
df['group'] = df[['A', 'B', 'C', 'D']].apply(lambda row: '_'.join(map(str, row)), axis=1)# 使用 GroupShuffleSplit 进行分组划分
gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)for train_index, test_index in gss.split(df, groups=df['group']):train = df.iloc[train_index]test = df.iloc[test_index]# 分离特征和目标变量
X_train, y_train = train.drop(columns=['y', 'group']), train['y']
X_test, y_test = test.drop(columns=['y', 'group']), test['y']print("训练集:")
print(X_train)
#      A    B    C    D    E
# 0  1.0  0.5  1.0  0.5  0.1
# 1  1.0  0.5  1.0  0.5  0.2
# 4  1.0  0.5  1.0  0.5  0.3
# 5  1.0  0.5  1.0  0.5  0.4
print("测试集:")
print(X_test)
# 2  2.0  1.5  2.0  1.5  0.1
# 3  2.0  1.5  2.0  1.5  0.2

分层分组划分 (Stratified Group Splitting)

分层分组在随机分组的基础上,确保训练集和测试集在某个关键特征(如目标变量  y )的分布上保持一致,能更好地保持数据的分布特性

## 分层分组划分from sklearn.model_selection import StratifiedShuffleSplit
import pandas as pddata = {'A': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.5, 2, 1.5],'B': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5, 1.5, 2, 1.5],'C': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.5, 2, 1.5],'D': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5, 1.5, 2, 1.5],'E': [0.1, 0.2, 0.1, 0.2, 0.3, 0.4, 1.5, 2, 1.5],'y': [0, 1, 0, 1, 0, 1, 2, 2, 1]
}
df = pd.DataFrame(data)# 定义分组特征df['group_id'] = df[['A', 'B', 'C', 'D']].astype(str).apply('_'.join, axis=1)group_targets = df.groupby('group_id')['y'].first()
unique_groups = group_targets.index.values# 使用 StratifiedShuffleSplit 进行分层分组划分
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.3, random_state=42)for train_groups_idx, test_groups_idx in sss.split(np.zeros(len(unique_groups)), group_targets):train_groups = unique_groups[train_groups_idx]test_groups = unique_groups[test_groups_idx]train_df = df[df['group_id'].isin(train_groups)]test_df = df[df['group_id'].isin(test_groups)]# 分离特征和目标变量
X_train, y_train = train.drop(columns=['y', 'group']), train['y']
X_test, y_test = test.drop(columns=['y', 'group']), test['y']print("训练集:")
print(X_train)
#      A    B    C    D    E
# 0  1.0  0.5  1.0  0.5  0.1
# 1  1.0  0.5  1.0  0.5  0.2
# 4  1.0  0.5  1.0  0.5  0.3
# 5  1.0  0.5  1.0  0.5  0.4
print("测试集:")
print(X_test)
#      A    B    C    D    E
# 2  2.0  1.5  2.0  1.5  0.1
# 3  2.0  1.5  2.0  1.5  0.2

交叉验证法(Cross-Validation)

交叉验证法通过将数据划分为多个子集(折),每次使用一个子集作为测试集,其余作为训练集,重复多次以评估模型的性能。这种方法充分利用数据,结果更稳定

分组K 折交叉验证(GroupKFold)

GroupKFold  是一种分组 K 折交叉验证方法,它确保每个组(group)的数据完全独立于其他组。这种方法非常适合处理具有明确分组特征的数据

## 分组K折交叉验证
import pandas as pd
from sklearn.model_selection import GroupKFolddata = {'A': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'B': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'C': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'D': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'E': [0.1, 0.2, 0.1, 0.2, 0.3, 0.4],'y': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)# 定义分组特征
df['group'] = df[['A', 'B', 'C', 'D']].apply(lambda row: '_'.join(map(str, row)), axis=1)
# 获取分组标识符
groups = df['group'].values# 使用 GroupKFold 进行分组 K 折交叉验证
gkf = GroupKFold(n_splits=2)  # 假设我们使用 2 折交叉验证for train_index, test_index in gkf.split(df, groups=groups):train = df.iloc[train_index]test = df.iloc[test_index]X_train, y_train = train.drop(columns=['y', 'group']), train['y']X_test, y_test = test.drop(columns=['y', 'group']), test['y']print("训练集:")print(X_train)     
#     A    B    C    D    E
# 0  1.0  0.5  1.0  0.5  0.1
# 1  1.0  0.5  1.0  0.5  0.2
# 4  1.0  0.5  1.0  0.5  0.3
# 5  1.0  0.5  1.0  0.5  0.4print("测试集:")print(X_test)      
#     A    B    C    D    E
# 2  2.0  1.5  2.0  1.5  0.1
# 3  2.0  1.5  2.0  1.5  0.2

留一组法(LeaveOneGroupOut)

## 留一组法import pandas as pd
from sklearn.model_selection import LeaveOneGroupOutdata = {'A': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'B': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'C': [1.0, 1.0, 2.0, 2.0, 1.0, 1.0],'D': [0.5, 0.5, 1.5, 1.5, 0.5, 0.5],'E': [0.1, 0.2, 0.1, 0.2, 0.3, 0.4],'y': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)# 定义分组特征
df['group'] = df[['A', 'B', 'C', 'D']].apply(lambda row: '_'.join(map(str, row)), axis=1)
# 获取分组标识符
groups = df['group'].values# 使用 LeaveOneGroupOut 进行分组划分
logo = LeaveOneGroupOut()for train_index, test_index in logo.split(df, groups=groups):train = df.iloc[train_index]test = df.iloc[test_index]X_train, y_train = train.drop(columns=['y', 'group']), train['y']X_test, y_test = test.drop(columns=['y', 'group']), test['y']print("训练集:")print(X_train)      
#     A    B    C    D    E
# 0  1.0  0.5  1.0  0.5  0.1
# 1  1.0  0.5  1.0  0.5  0.2
# 4  1.0  0.5  1.0  0.5  0.3
# 5  1.0  0.5  1.0  0.5  0.4print("测试集:")print(X_test) 
#     A    B    C    D    E
# 2  2.0  1.5  2.0  1.5  0.1
# 3  2.0  1.5  2.0  1.5  0.2

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

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

相关文章

ASP.NET Core Web API 中集成 DeveloperSharp.RabbitMQ

文章目录前言一、核心特性与设计理念极简API设计二、使用步骤1.配置 RabbitMQ 连接(配置文件设置)2.发送消息(在 Controller 中)3.消费消息(后台服务)4.注册托管服务三、消息生命周期控制四、高级用法延时队…

解决Flutter运行android提示Deprecated imperative apply of Flutter‘s Gradle plugins

文章目录 出现场景 解决方案 编辑android/settings.gradle 编辑android/build.gradle 重新定义库变量 编辑android/app/build.gradle 删除fluttetRoot和plugin字段 添加plugins块 修改dependencies 出现场景 ado@adodeMacBook-Air app_demo % flutter run --profile Launching…

音视频重回顾及nat内网穿透相关再整理笔记

以前系统得粗略对音视频有过技术栈基类,现在重新回顾。 除此之外,最近刚好实现一个双网卡加入内网的测试方案,涉及内网穿透的知识,刚好对内网穿透逻辑进行整理。 1:明确相关基础知识,解惑体系架构。2&#…

深入理解 SemaphoreSlim 在.NET Core API 开发中的应用

目录 什么是 SemaphoreSlim SemaphoreSlim 的核心方法 构造函数 等待方法 释放方法 基本使用模式 同步使用模式 异步使用模式(推荐在 API 中使用) 在 Web 开发中的常见用途 1. 限制 API 接口的并发请求数 2. 保护共享资源的并发访问 3. 控制…

板凳-------Mysql cookbook学习 (十二--------4)

11.0 概述 386 11.1 使用LOAD DATA和mysqlimport导入数据 390 首先创建 mytbl_3 表(结构与 mytbl 相同):sql CREATE TABLE mytbl_3 LIKE mytbl;用文本编辑器(如 Notepad)打开 mytbl.txt,确保格式转换成wind…

【Git#6】多人协作 企业级开发模型

一、多人协作 1. 同一分支下的协作 目前,我们所完成的工作如下: 基本完成 Git 的所有本地库的相关操作,git基本操作,分支理解,版本回退,冲突解决等等申请码云账号,将远端信息clone到本地&…

C# 中的强大运算符

C# 中鲜为人知的强大运算符 C# 还提供了一些"冷门"但功能强大的运算符,这些运算符在特定场景下能极大简化代码并提高效率。 1. 空合并赋值运算符 ?? // 传统写法 if (variable null) {variable defaultValue; }// 使用 ?? variable ?? defaultVal…

用window字体替换zabbix 默认的字体

我们先需要在windows系统下的C:\Windows\Fonts目录,找到一个喜欢的字体,我选择的是微软雅黑。复制到其它路径下,选取一个msyh.ttc。到服务器上。要把msyh.ttc改为msyh.ttf才可以。不然最后中英文都不显示[roothadoop105.yinzhengjie.com ~]# …

MySQL 17 如何正确地显示随机消息?

假设有一个场景,一个英语学习APP首页有一个随机显示单词的功能,用户每次访问首页的时候,都会随机滚动显示三个单词。 已知表里有10000条记录,来看看随机选择3个单词有什么方法,又存在什么问题。 建表语句&#xff1a…

7-Zip 曝出两个可导致拒绝服务的中危漏洞

研究人员在全球使用最广泛的开源文件压缩软件7-Zip中新发现两个漏洞(CVE-2025-53816和CVE-2025-53817)。这两个漏洞影响7-Zip 25.0.0之前的所有版本,虽然不能实现远程代码执行,但可能引发内存损坏和拒绝服务(Denial of…

史上最简单Conda+Ollama+Open-Webui安装方法!

史上最简单CondaOllamaOpen-Webui安装方法 一、安装Anaconda 1、到Anaconda官网下载conda_24.10.1 链接:https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Windows-x86_64.exe 2.双击安装包,开始安装 选择All Users 切记安装路径不要选C盘&am…

Python-数据库概念-pymysql-元编程-SQLAlchemy-学习笔记

序 欠4前年的一份笔记 ,献给今后的自己。 数据库 概念 数据库:按照数据结构来组织、存储、管理数据的仓库。 诞生 计算机的发明是为了做科学计算的,而科学计算需要大量的数据输入和输出。 早期,可以使用打孔卡片的孔、灯泡的亮灭来…

Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上

借助 U 盘或 TF 卡拷贝程序到开发板上我们已经学习了怎么在 ubuntu 和 windows 上互传文件,那么怎么把 ubuntu 或 win 上的程序拷贝到开发板呢,这里给大家介绍第一种方法,使用 U 盘或者 TF 卡来完成,如果大家使用的是 U 盘&#x…

【亲测有效】防检测插件playwright_stealth 2.X版本快速使用

这里写自定义目录标题核心方法apply_stealth_syncuse_sync和use_async一. playwright_stealth 2.0以上版本1.同步方法2.异步方法3.实例二.playwright_stealth 2.0以下版本playwright-stealth 是一个用于 Playwright 的库,旨在帮助自动化脚本避开一些检测机制&#x…

docker安装与简单项目上手

1.docker安装 系统版本为almalinux9.6 首先添加一下docker的软件安装源(源选择的阿里云,只要是rhel的系统都适用,无论是rockylinux还是almalinux还是红帽企业版) dnf config-manager --add-repo https://mirrors.aliyun.com/doc…

计算机网络基础:从协议到通信全解析(大致框架)

本节重点:1.了解网络发展背景,对局域网/广域网的概念有基本认识2.了解网络协议的意义,重点理解TCP/IP五层结构模型3.学习网络传输的基本流程,理解封装和解包分用一、计算机网络发展背景:人与人之间是需要协同工作的&am…

PDF 编辑器:多文件合并 拆分 旋转 顺序随便调 加水印 密码锁 页码背景

各位打工人、学生党们,你们是不是也遇到过这种情况,领导甩来一个PDF让你改,结果你捣鼓半天,发现这玩意儿根本动不了,简直想原地爆炸!别急别急,今天就给你们安利一个办公软件——PDF编辑器&#…

【软件基础学习配置那些事 4-3】3ds Max2026 菜单栏常用命令-----文件、视图、编辑、工具、组

3ds Max学习的笔记小知识!!!!!!!!后续都会补充添加!!!!(个人的一些学习笔记,如有不对,欢迎订正&am…

网络爬虫的介绍

网络爬虫库网络爬虫通俗来讲就是使用代码将HTML网页的内容下载到本地的过程。爬取网页主要是为了获取网中的关键信息,例如网页中的数据、图片、视频等。Python语言中提供了多个具有爬虫功能的库,下面将具的介绍。urlib库:是Python自带的标准库&#xff0…

C# 编程实战进阶:字符串与字符串数组 (3)

目录 1、给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 2、无重复字符的最长字符串 ,给定一个字符串 s 请你找出其中不含有重复字符的最长字符串的长度。 3、给定两个字符串 s 和 t ,它们只包含小…