文章目录

  • pyspark实现(全网唯一)
  • sklearn实现1:划分训练集、测试集
  • sklearn实现2:train_test_split 划分数据集,并保证正负样本比一致

忍不住啰嗦一句,spark做数据处理,是真的麻烦,很麻烦!!!

直接上代码,希望能帮到你

pyspark实现(全网唯一)

代码可以根据需求自己修改,测试没问题了把count去掉跑,能快半个多小时

'''  spark df 采样、分割train、val、test   '''
def data_sample_split_distribution(df, ss, n=1, rate_val=0.1, rate_test=0.1, rate_test_with=30, ifflag=True):'''首先 1:n 采样,再划分train、val、test:param df: dataframe:param ss: sparksession 用于添加自增id:param n: 1:n采样:param rate_val: 验证集划分比例:param rate_test: 测试集划分比例:param rate_test_with: 测试集分布和实际线上持平,例如这里是1:30:return: df_train、df_val、df_test'''df_c = df.count()print(' 样本总量:', df_c)df_pos = df.filter(df.y == 1)df_neg = df.filter(df.y == 0)df_pos_c = df_pos.count()df_neg_c = df_neg.count()print(' 正样本数:{},负样本数:{},正负样本比为:{} : {}'.format(df_pos_c, df_neg_c, 1, df_neg_c / df_pos_c))if ifflag:# 只对负样本添加自增id  tmpiddf_neg = df_neg.withColumn("tmpid", fn.monotonically_increasing_id())# 1:n 采样rate = np.around((df_pos_c * n / df_neg_c), 4) + 0.0002print(' 负样本欠采样概率:', rate)df_neg_sample = df_neg.sample(fraction=rate)df_neg_sample_c = df_neg_sample.count()print(' 1:{} 采样后,样本量:{},正负样本比为:{} : {}'.format(n, df_neg_sample_c + df_pos_c, 1, np.around(df_neg_sample_c / df_pos_c, decimals=4)))if ifflag:# 将采样后的负样本tmpid取出,保证测试集负样本和训练、验证独立rmlst = [c[0] for c in df_neg_sample.select('tmpid').collect()]df_neg_sample = df_neg_sample.drop('tmpid')# 划分train、testdf_pos_train, df_pos_test = df_pos.randomSplit(weights=[1 - rate_test, rate_test], seed=20)df_neg_train, _ = df_neg_sample.randomSplit(weights=[1 - rate_test, rate_test], seed=20)# 划分test负样本df_pos_test_c = df_pos_test.count()df_neg_test_c = df_pos_test_c * rate_test_with  # 测试集和实际线上分布持平df_neg_test = df_neg.filter(~df_neg['tmpid'].isin(rmlst))# 将自增id删除后再添加,目的是取df的 df_neg_test_c 行df_neg_test = df_neg_test.drop('tmpid')df_neg_test = df_neg_test.withColumn("tmpid", fn.monotonically_increasing_id())# df_neg_test = df_neg_test.filter(df_neg_test['tmpid'].between(0, df_neg_test_c + 1000))df_neg_test = ss.createDataFrame(df_neg_test.take(df_neg_test_c + 1000))df_neg_test = df_neg_test.drop('tmpid')dfTest = df_pos_test.unionAll(df_neg_test)dfTest.cache()# 划分train、valdf_pos_train, df_pos_val = df_pos_train.randomSplit(weights=[1 - rate_val, rate_val], seed=20)df_neg_train, df_neg_val = df_neg_train.randomSplit(weights=[1 - rate_val, rate_val], seed=20)dfTrain = df_pos_train.unionAll(df_neg_train)dfVal = df_pos_val.unionAll(df_neg_val)dfTrain.cache()dfVal.cache()# 将采样后的样本洗牌dfTrain = df_shuffle(dfTrain)dfVal = df_shuffle(dfVal)dfTest = df_shuffle(dfTest)sample_cTrain, sample_pos_cTrain, sample_neg_cTrain = pos_neg_rate2(dfTrain, ifspark=True)sample_cVal, sample_pos_cValn, sample_neg_cVal = pos_neg_rate2(dfVal, ifspark=True)sample_cTest, sample_pos_cTest, sample_neg_cTest = pos_neg_rate2(dfTest, ifspark=True)print('  划分后,训练集样本量:{},正样本数:{},负样本数:{},正负样本比:{} : {}'.format(sample_cTrain, sample_pos_cTrain, sample_neg_cTrain, 1, np.around(sample_neg_cTrain / sample_pos_cTrain, decimals=4)))print('  划分后,验证集样本量:{},正样本数:{},负样本数:{},正负样本比:{} : {}'.format(sample_cVal, sample_pos_cValn, sample_neg_cVal, 1, np.around(sample_neg_cVal / sample_pos_cValn, decimals=4)))print('  划分后,测试集样本量:{},正样本数:{},负样本数:{},正负样本比:{} : {}'.format(sample_cTest, sample_pos_cTest, sample_neg_cTest, 1, np.around(sample_neg_cTest / sample_pos_cTest, decimals=4)))return dfTrain, dfVal, dfTestelse:df_new = df_neg_sample.unionAll(df_pos)df_new.cache()return df_new, None, None
def pos_neg_rate2(df, ifspark=True):if ifspark:sample_c = df.count()sample_pos_c = df.filter(df.y == 1).count()sample_neg_c = df.filter(df.y == 0).count()else:sample_c = len(df)sample_pos_c = len(df[df['y'] == 1])sample_neg_c = len(df[df['y'] == 0])return sample_c, sample_pos_c, sample_neg_cdef flat(l):for k in l:if not isinstance(k, (list, tuple)):yield kelse:yield from flat(k)# 给df增加一列连续自增id,用于拼接
def mkdf_tojoin(df, ss):schema = df.schema.add(StructField("tmpid", LongType()))rdd = df.rdd.zipWithIndex()rdd = rdd.map(lambda x: list(flat(x)))df = ss.createDataFrame(rdd, schema)return dfdef df_shuffle(df):df = df.withColumn('rand', fn.rand() * 10000)df = df.orderBy(df['rand'])df = df.drop('rand')return df

example:

 样本总量: 10577260正样本数:300081,负样本数:10277179,正负样本比为:1 : 34.248016368913724负样本欠采样概率: 0.02941:1 采样后,样本量:600662,正负样本比为:1 : 1.0017划分后,训练集样本量:485414,正样本数:242513,负样本数:242901,正负样本比:1 : 1.0016划分后,验证集样本量:54584,正样本数:27272,负样本数:27312,正负样本比:1 : 1.0015划分后,测试集样本量:940176,正样本数:30296,负样本数:909880,正负样本比:1 : 30.033

sklearn实现1:划分训练集、测试集

'''   pandas df 采样,针对直客数据,分割train、test   '''
def df_sample_split(df, n=1, rate_test_with=15):print('样本量:', len(df))df_pos = skl_shuffle(df[df['y'] == 1])df_neg = skl_shuffle(df[df['y'] == 0])df_pos_c = len(df_pos)df_neg_c = len(df_neg)print(' 正样本数:{},负样本数:{},正负样本比为:{} : {}'.format(df_pos_c, df_neg_c, 1, df_neg_c / df_pos_c))df_neg_train = df_neg.iloc[:df_pos_c * n + 1, :]  # epsilon# 测试集和实际线上分布持平df_neg_test = df_neg.iloc[df_pos_c * n + 2: df_pos_c * rate_test_with + 1, :]  # epsilondf_train = skl_shuffle(pd.concat([df_pos, df_neg_train], axis=0, ignore_index=True))df_test = skl_shuffle(pd.concat([df_pos, df_neg_test], axis=0, ignore_index=True))sample_cTrain, sample_pos_cTrain, sample_neg_cTrain = pos_neg_rate2(df_train, ifspark=False)sample_cTest, sample_pos_cTest, sample_neg_cTest = pos_neg_rate2(df_test, ifspark=False)print('  划分后,训练集样本量:{},正样本数:{},负样本数:{},正负样本比:{} : {}'.format(sample_cTrain, sample_pos_cTrain, sample_neg_cTrain, 1, np.around(sample_neg_cTrain / sample_pos_cTrain, decimals=4)))print('  划分后,测试集样本量:{},正样本数:{},负样本数:{},正负样本比:{} : {}'.format(sample_cTest, sample_pos_cTest, sample_neg_cTest, 1, np.around(sample_neg_cTest / sample_pos_cTest, decimals=4)))return df_train, df_test

sklearn实现2:train_test_split 划分数据集,并保证正负样本比一致

https://blog.csdn.net/qq_42363032/article/details/122231322

pyspark 划分训练集、验证集、测试集(全网之最)相关推荐

  1. 【小白学PyTorch】 2.浅谈训练集验证集和测试集

    文章目录: 经验误差与过拟合 评估方法 经验误差与过拟合 关键词:错误率(error rate),精度(accuracy). 错误率好理解,就是m个样本中,a个样本分类错误,则错误率E = a/m . ...

  2. 训练集 验证集_训练与验证、测试集数据分布不同的情况

    在不同分布的数据集上进行训练与验证.测试 深度学习需要大量的数据,但是有时我们可获得的满足我们真实需求分布的数据并不是那么多,不足以对我们的模型进行训练.这时我们就会收集大量相关的数据加入到训练集中, ...

  3. 训练集、验证集和测试集的概念及划分原则

    深度学习中,常将可得的数据集划分为训练集(training set),验证集(development set/validation set)和测试集(test set).下文主要回答以下几个问题:一是 ...

  4. YOLOv5将自己数据集划分为训练集、验证集和测试集

    在用自己数据集跑YOLOv5代码时候,需要将自己的VOC标签格式数据集转为yolo格式. 首先是要获取自己的数据集,然后再对数据集进行标注,保存为VOC(xml格式).然后再把标注完的数据集划分为训练 ...

  5. python 训练集 测试集 验证集划分_将自己的图片数据集分成训练集、验证集和测试集并用 Tensorflow2.0 导入...

    文章目录项目介绍 划分数据集1.在 dataset 目录下创建三个文件夹 2.将原来 dataset 文件夹中的子文件夹分别复制到这三个文件夹中 3.在 python 中指定所有路径 4.将这三个文件 ...

  6. 机器学习典型步骤以及训练集、验证集和测试集概念

    1. 机器学习典型步骤 数据采集和标记 数据清洗 特征选择 如房子的面积.地理位置.朝向.价格等. 模型选择 有监督还是无监督,问题领域.数据量大小.训练时长.模型准确度等多方面有关. 模型训练和测试 ...

  7. 【入门篇】如何正确使用机器学习中的训练集、验证集和测试集?

    [注] ·本文为转载文章,原文作者是王树义老师,原文链接为 https://zhuanlan.zhihu.com/p/71961236 训练集.验证集和测试集,林林总总的数据集合类型,到底该怎么选.怎 ...

  8. 训练集(train set) 验证集(validation set) 测试集(test set)

    在有监督(supervise)的机器学习中,数据集常被分成2~3个,即:训练集(train set) 验证集(validation set) 测试集(test set). http://blog.si ...

  9. 机器学习中训练集、验证集和测试集的区别

    通常,在训练有监督的机器学习模型的时候,会将数据划分为训练集.验证集合测试集,划分比例一般为0.6:0.2:0.2.对原始数据进行三个集合的划分,是为了能够选出效果(可以理解为准确率)最好的.泛化能力 ...

  10. [机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)

    在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...

最新文章

  1. RHEL/CentOS/OEL5/6.x高危漏洞修补
  2. 脑电植入:治疗抑郁症的新方法?重磅!UCSF研究人员成功治疗一例重度抑郁症患者...
  3. python 字符串函数 center_Python字符串处理
  4. Citrix XenDesktop中VDA无法注册到DDC案例分享(一)
  5. [原创] 在XP/2K 下实现 Win+Ctrl+Del 等键的屏蔽的方法,附源码与演示程序下载。...
  6. [转]Terraform 使用 - 从最简单例子开始
  7. winform 项目获取app.config 中appSettings节点数据
  8. SQL每日学习——insert into语句
  9. 【登陆设计】-【技术上】你会做WEB上的用户登录功能吗?
  10. 基于Java swing+mysql+eclipse的【水电费管理系统】
  11. 史上最全 | 编程入门指南
  12. 编译项目时报出已经定义了构造器
  13. 2015.11--360校招面试-后台C++开发工程师
  14. python3 yield from用法
  15. 怎么判断自己的牙齿是否需要做矫治
  16. matlab默认英文字体是什么?我使用console之后出现了乱码
  17. 如何防止滴滴出行后台自启
  18. date_sub() 函数
  19. 扬州大学转专业计算机科学与技术,扬州大学级本科生转专业情况一览表.doc
  20. 2021年我国单身成年人将升至9200万,单身人口的增加会带来哪些影响?

热门文章

  1. Oracle数据库(三)Oracle 数据备份
  2. XMOS 开发探索2-麦克风拾音
  3. Android Root工程仓库万能大法
  4. php 数据库万能引擎类,ADODB PHP 数据库万能引擎类
  5. Virtual Serial Port Driver PRO使用
  6. 利用ntp服务同步时间(史上最简单)
  7. A100 MIG 使用说明
  8. 盛大出手机输入法 亮点不多需改进点多多
  9. Cesium-通过Shader添加雨雪天气效果
  10. 一文读懂BLDC电机控制算法