Python 按分类样本数占比生成并随机获取样本数据
按分类样本数占比生成并随机获取样本数据
By:授客 QQ:1033553122
开发环境
win 10
python 3.6.5
需求
已知样本分类,每种分类的样本占比数,及样本总数,需要随机获取这些分类的样本。比如,我有4种任务,分别为任务A,任务B,任务C,任务D, 每种任务需要重复执行的总次数为1000,每次执行随机获取一种任务来执行,不同分类任务执行次数占比为 A:B:C:D = 3:5:7:9
代码实现
#!/usr/bin/env python
# -*- coding:utf-8 -*- __author__ = 'shouke' import random def get_class_instance_by_proportion(class_proportion_dict, amount):
"""
根据每种分类的样本数比例,及样本总数,为每每种分类构造样本数据
class_proportion_dict: 包含分类及其分类样本数占比的字典:{"分类(id)": 分类样本数比例}
amount: 所有分类的样本数量总和 返回一个列表:包含所有分类样本的list """ bucket = []
proportion_sum = sum([weight for group_id, weight in class_proportion_dict.items()])
residuals = {} # 存放每种分类的样本数计算差值
for class_id, weight in class_proportion_dict.items():
percent = weight / float(proportion_sum)
class_instance_num = int(round(amount * percent))
bucket.extend([class_id for x in range(class_instance_num)])
residuals[class_id] = amount * percent - round(amount * percent)
if len(bucket) < amount:
# 计算获取的分类样本总数小于给定的分类样本总数,则需要增加分类样本数,优先给样本数计算差值较小的分类增加样本数,每种分类样本数+1,直到满足数量为止
for class_id in [l for l, r in sorted(residuals.items(), key=lambda x: x[1], reverse=True)][: amount - len(bucket)]:
bucket.append(class_id)
elif len(bucket) > amount:
# # 计算获取的分类样本总数大于给定的分类样本总数,则需要减少分类样本数,优先给样本数计算差值较大的分类减少样本数,每种分类样本数-1,直到满足数量为止
for class_id in [l for l, r in sorted(residuals.items(), key=lambda x: x[1])][: len(bucket) - amount]:
bucket.remove(class_id) return bucket class A:
def to_string(self):
print('A class instance') class B:
def to_string(self):
print('B class instance') class C:
def to_string(self):
print('C class instance') class D:
def to_string(self):
print('D class instance') classes_map = {1: A, 2: B, 3:C, 4: D}
class_proportion_dict = {1: 3, 2: 5, 3:7, 4: 9} # {分类id: 样本数比例} ,即期望4个分类的样本数比例为为 3:5:7:9
class_instance_num = 1000 # 样本总数
result_list = get_class_instance_by_proportion(class_proportion_dict, class_instance_num) for class_id in class_proportion_dict:
print('%s %s' % (classes_map[class_id], result_list.count(class_id))) # 制造样本并随机获取样本
random.shuffle(result_list)
while result_list:
class_id = random.sample(result_list, 1)[0]
classes_map[class_id]().to_string()
result_list.remove(class_id)
运行结果

说明
以上方式大致实现思路就是在知道总样本数的情况下,提前为每种分类生成样本,然后随机获取,按这种方式可以实现比较准确的结果,但是得提前知道样本总数及不同分类样本数占比
Python 按分类样本数占比生成并随机获取样本数据的更多相关文章
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- Python解决数据样本类别分布不均衡问题
所谓不平衡指的是:不同类别的样本数量差异非常大. 数据规模上可以分为大数据分布不均衡和小数据分布不均衡.大数据分布不均衡:例如拥有1000万条记录的数据集中,其中占比50万条的少数分类样本便于属于这种 ...
- python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求
一.JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- 关于VisualStudio性能分析数据中的独占样本数和非独占样本数的意义
VisualStudio中自带有Profile工具进行性能性能分析,其中用得比较多的数据是函数调用时间,它主要有独占样本数和非独占样本数两个指标,关于这两个指标代表的意义,MSDN的解释比较文艺: 非 ...
- Python数据分析【炼数成金15周完整课程】
点击了解更多Python课程>>> Python数据分析[炼数成金15周完整课程] 课程简介: Python是一种面向对象.直译式计算机程序设计语言.也是一种功能强大而完善的通用型语 ...
- Python测试开发-浅谈如何自动化生成测试脚本
Python测试开发-浅谈如何自动化生成测试脚本 原创: fin 测试开发社区 前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...
- python 文本分类
python 文本分类 pyhton 机器学习 待续...
- 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型
# -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...
- 【Python】Python获取命令行參数
有时候须要用同一个Python程序在不同的时间来处理不同的文件,此时假设老是要到Python程序中去改动输入.输出文件名称.就太麻烦了. 而通过Python获取命令行參数就方便多了.以下是我写得一个小 ...
- 13、Selenium+python+API分类总结
Selenium+python+API分类总结 http://selenium-python.readthedocs.org/index.html 分类 方法 方法描述 客户端操作 __init__( ...
随机推荐
- 任务Task系列之使用CancellationToken取消Task
本文参考书籍<CLR via C#> Task的取消采用一种形如令牌(Token)的方式.首先先构建一个CancellationTokenSource实例,然后任务中执行的方法必须能接受一 ...
- 记录一次由nginx配置引发出来的一系列的缓存问题
问题描述: 在做一个企业微信的移动端项目时,每次修改代码后并且打包.部署完毕,再次打开页面总是会有上一次的缓存,一开始以为是cookie和webStorage缓存导致的,然后每次清除还是有缓存,后来把 ...
- 计算巢AppFlow-如何在钉钉群实现智能答疑
随着大模型能力越来越强大,利用大语言模型进行智能答疑已经成为了一个非常普遍和常见的场景.然而,各个产品或业务方要能够准确有效地进行答疑,仅依靠大模型的通用能力是远远不够的,这时候利用私有领域FAQ文档 ...
- nginx获取后端真实IP,添加后端服务器响应时间并记录日志
nginx获取后端真实IP,添加后端服务器响应时间并记录日志 1.日志定义 log_format nginx '$remote_addr - $remote_user [$time_local] &q ...
- Windows程序读取不了中文路径问题
问题描述 今天调试发现win32接口GetFileAttributesW居然不支持中文路径,于是寻找解决方案,找了半天,尝试用boost的fileystem库发现能用,而且boost能跨平台! 不支持 ...
- grid 布局兼容性问题
低版本的安卓机上是不生效的 代码 .grid_4 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: ...
- Apache 服务搭建
Apache 一.了解apache Apache(或httpd)是Internet上使用最多的Web服务器技术之一,使用的传输协议是http(Hypertext Transfer Protocol), ...
- (三)Redis 线程与IO模型
1.Redis 单线程 通常说 Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,其他功能,比如持久化.异步删除.集群数据同步等,是由额外的线程执行的,所以严 ...
- 架构与思维:了解Http 和 Https的区别(图文详解)
1 介绍 随着 HTTPS 的不断普及和使用成本的下降,现阶段大部分的系统都已经开始用上 HTTPS 协议. HTTPS 与 HTTP 相比, 主打的就是安全概念,相关的知识如 SSL .非对称加密. ...
- C#.Net筑基-集合知识全解
01.集合基础知识 .Net 中提供了一系列的管理对象集合的类型,数组.可变列表.字典等.从类型安全上集合分为两类,泛型集合 和 非泛型集合,传统的非泛型集合存储为Object,需要类型转.而泛型集合 ...