csv数据集按比例分割训练集、验证集和测试集,即分层抽样的方法
一、一种比较通俗理解的分割方法
1.先读取总的csv文件数据:
import pandas as pd
data = pd.read_csv('D:\BaiduNetdiskDownload\weibo_senti_100k\weibo_senti_100k\weibo_senti_100k.csv')
data.head(10)#输出前十行

data.label.value_counts()#查看标签类别及数目

2.按照标签将总的dataframe分割为两份,一份为标签为1,一份为标签为0
groups = data.groupby(data.label)
data_true = groups.get_group(1)
data_false = groups.get_group(0)
data_true.head(10),data_false.head(10)

3.
data_true = data_true.sample(frac=1.0) # 全部打乱
data_false = data_false.sample(frac=1.0) # 全部打乱
#给测试集两种标签各600个,按照大概8:1:1的比例取
test_true = data_true.iloc[:600, :]
test_false = data_false.iloc[:600, :]
test_data = pd.concat([test_true, test_false], axis = 0, ignore_index=True).sample(frac=1)
#验证集
valid_true = data_true.iloc[600:1200, :]
valid_false = data_false.iloc[600:1200, :]
valid_data = pd.concat([valid_true, valid_false], axis = 0, ignore_index=True).sample(frac=1)
#训练集
train_true = data_true.iloc[1200:, :]
train_false = data_false.iloc[1200:, :]
train_data = pd.concat([train_true, train_false], axis = 0, ignore_index=True).sample(frac=1)
4.生成csv文件
test_data.to_csv('test.csv')
valid_data.to_csv('val.csv')
train_data.to_csv('train.csv')
二、不通俗方法
可以看出上面的方法不断地生成新的dataframe太麻烦了些,虽然直观醒目,但在代码编写上很是繁冗,于是可以使用apply方法避免这种问题
1.为便于讲解,先生成一个简单的dataframe:
df = pd.DataFrame({'label':[0,0,0,0,1,1,1,1], 'review':['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh']})

2.首先定义一个简单的分层取样函数,frac为取样概率,group为一个单独的dataframe
def simpleSampling(group, frac):
return group.sample(frac=frac)
3.接下来使用apply函数对分组后的每一个组(即一个dataframe)进行函数操作
train_df = df.groupby(df.label).apply(simpleSampling, 0.5)

可以看到多了一列label标签,可以使用sample(frac=1, ignore_index = True)消除它
4.在生成了train数据集后,我们需要把train从原df中删除掉,但是dataframe没有直接删除的方法,我们迂回的使用删除重复行的方法:
df = df.append(train_df.sample(frac=1, ignore_index=True)).drop_duplicates(keep = False)

可以看到df只剩上图的几行了,接下来生成测试集和验证集
5.我们如果要生成原数据集0.25比例的验证集,那么需要注意的是,在将train删除后,在新的数据集中我们的比例就变成了p(val) = p(test) = 0.25 / 0.5 = 0.5
val_df = df.groupby(df.label).apply(simpleSampling, 0.5).sample(frac=1, ignore_index = True)
test_df = df.append(val_df).drop_duplicates(keep=False)
train_df.to_csv('train_csv')
val_df.to_csv('val_csv')
test_df.to_csv('test_csv')
至此我们的数据集就已经成功分割了,以上两种方法原理相同,只是第二种方法巧妙地应用了apply函数,避免了一个接一个的新的dataframe的生成。
csv数据集按比例分割训练集、验证集和测试集,即分层抽样的方法的更多相关文章
- 斯坦福大学公开课机器学习:advice for applying machine learning | model selection and training/validation/test sets(模型选择以及训练集、交叉验证集和测试集的概念)
怎样选用正确的特征构造学习算法或者如何选择学习算法中的正则化参数lambda?这些问题我们称之为模型选择问题. 在对于这一问题的讨论中,我们不仅将数据分为:训练集和测试集,而是将数据分为三个数据组:也 ...
- 【深度学习的实用层面】(一)训练,验证,测试集(Train/Dev/Test sets)
在配置训练.验证.和测试数据集的过程中做出正确的决策会更好地创建高效的神经网络,所以需要对这三个名词有一个清晰的认识. 训练集:用来训练模型 验证集:用于调整模型的超参数,验证不同算法,检验哪种算法更 ...
- 机器学习入门06 - 训练集和测试集 (Training and Test Sets)
原文链接:https://developers.google.com/machine-learning/crash-course/training-and-test-sets 测试集是用于评估根据训练 ...
- [机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)
在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...
- 训练集(train set) 验证集(validation set) 测试集(test set)
转自:http://www.cnblogs.com/xfzhang/archive/2013/05/24/3096412.html 在有监督(supervise)的机器学习中,数据集常被分成2~3个, ...
- 随机切分csv训练集和测试集
使用numpy切分训练集和测试集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 序言 在机器学习的任务中,时常需要将一个完整的数据集切分为训练集和测试集.此处我们使用numpy完成这个任务. ...
- 训练集(train set) 验证集(validation set) 测试集(test set)。
训练集(train set) 验证集(validation set) 测试集(test set). http://blog.sina.com.cn/s/blog_4d2f6cf201000cjx.ht ...
- AI---训练集(train set) 验证集(validation set) 测试集(test set)
在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...
- sklearn学习3----模型选择和评估(1)训练集和测试集的切分
来自链接:https://blog.csdn.net/zahuopuboss/article/details/54948181 1.sklearn.model_selection.train_test ...
- sklearn——train_test_split 随机划分训练集和测试集
sklearn——train_test_split 随机划分训练集和测试集 sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档:http: ...
随机推荐
- 十大经典排序之桶排序(C++实现)
桶排序 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定 思路: 根据数据规模,初始化合理桶数 将数列中的数据按照桶的规模进行映射,尽量保证数据被均匀的分布到桶 ...
- api接口文档生成,无需其他配置一键生成基于文本注释
<dependency> <groupId>io.github.yedaxia</groupId> <artifactId>japidocs</a ...
- java注解和反射(Annotation and Reflect)
摘要: 注解和反射是相互联系的知识,所以应该放到一起来说. 注解:JDK5之后才有的技术,为了增加对元数据的支持,可以将注解理解为代码中的特殊标记,一种修饰.而这些标记是可以在代码编译,类的加载,和运 ...
- maven2创建的archetypeArtifactId类型
原文:https://www.cnblogs.com/xiziyin/archive/2009/11/22/1608239.html 添加翻译:(我总觉得看汉字比看英文要快得多) 看maven-def ...
- 编写简单的button配合input实现上传文件操作
<template> <button> 导入文件 <input type="file" @change="fileChange" ...
- C语言的导数和积分
用C进行导数和积分的运算 进行求导 设一个dx,利用f(x)-f(x-dx)/dx或f(x)-f(x+dx)/dx进行计算. float qd(float x) { float dx=0.01,y; ...
- 错误:为仓库 'appstream' 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist
sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* sudo sed -i -e &qu ...
- Less-3 和 Less-4 ')闭合绕过
判断注入类型 测试:http://localhost/sqli-labs-master/Less-3/index.php?id=1a 正常回显,可以判断为 字符型注入 闭合字符串执行而已 SQL语句 ...
- mysql5.7修改数据库密码&开通外界访问
mysql修改数据库密码(版本5.7.33) 参考博客: 改密码:https://blog.csdn.net/m0_37482190/article/details/86635339 允许外界访问:h ...
- Go内存管理逃逸分析
1. 前言 所谓的逃逸分析(Escape analysis)是指由编译器决定内存分配的位置吗不需要程序员指定. 函数中申请一个新的对象 如果分配在栈中, 则函数执行结束后可自动将内存回收 如果分配在堆 ...