相关文章推荐
销魂的杯子  ·  Box | Login·  2 月前    · 
开心的书包  ·  吕雪光课题组在mRNA疫苗冷冻保存领域取得重 ...·  3 月前    · 
高大的李子  ·  区域交通_萧县人民政府·  4 月前    · 
聪明的手术刀  ·  Samsung unveils ...·  4 月前    · 
被表白的盒饭  ·  T90在叙利亚表现并没那么好,俄军会继续采购 ...·  4 月前    · 
Code  ›  python 下采样和上采样[通俗易懂]开发者社区
python javascript dataframe 上采样
https://cloud.tencent.com/developer/article/2016297
含蓄的铁板烧
1 年前
Java架构师必看

python 下采样和上采样[通俗易懂]

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
Java架构师必看
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > python 下采样和上采样[通俗易懂]

python 下采样和上采样[通俗易懂]

作者头像
Java架构师必看
发布 于 2022-06-06 09:35:08
1.3K 0
发布 于 2022-06-06 09:35:08
举报
文章被收录于专栏: Java架构师必看

前言

由于工作数据量较大,训练模型很少直接单机python,一般都采用SparkML,最近把SparkML的工作使用python简单的写了一下,先写个上下采样,最终目的是为了让正负样本达到均衡(有人问:正负样本必须是1:1吗?1:1效果就一定最好吗?答:不一定)

数据准备

在这里插入图片描述
在这里插入图片描述

共20条数据,正样本1共有5条,负样本0共有15条。

基础知识准备

  1. 如何获取dataframe的行数 pandas.DataFrame.shape 返回数据帧的形状
代码语言: javascript
复制
df.shape[0]  返回行数
de.shape[1]  返回列数

只听到从架构师办公室传来架构君的声音: 道别来、浑是不关心,东堂桂。 有谁来对上联或下联?

或者直接使用

代码语言: javascript
复制
此代码由Java架构师必看网-架构君整理
len(df)

当然如果要统计每个字段不同类别的数量,可以类似于SQL中的count(*) group by 操作

代码语言: javascript
复制
df.groupby('字段名').size()
  1. 创建一个数据结构和之前一致,但空的dataframe

方法1:

代码语言: javascript
复制
此代码由Java架构师必看网-架构君整理
df = df.iloc[0:0].copy()

方法2:

代码语言: javascript
复制
df.drop(df.index, inplace=True)

方法3:

代码语言: javascript
复制
df_1 = df.drop(range(len(df)),axis=0)

读取数据和获取正负样本数量

代码语言: javascript
复制
import pandas as pd
data = pd.read_csv('./test.csv')
# 获取正样本的数量
z = data[data['label'] == 1]
# 获取负样本的数量
f = data[data['label'] == 0]

上采样

就是不断复制样本少的数据达到和样本多的数据平衡

代码语言: javascript
复制
frac = int(len(f) / len(z))
# 创建一个数据结构和之前一致,但空的dataframe
zcopy = z.iloc[0:0].copy()
# 上采样就是复制少量的样本直到和多量的达到平衡
for i in range(frac):
    if i != frac:
        zcopy = zcopy.append(z)  
sample_data = pd.concat([zcopy,f])

查看采样的结果:

在这里插入图片描述
在这里插入图片描述

下采样

下采样就是从多量的样本中抽取一部分数据直到和少量的样本达到平衡

  1. 利用dataframe的sample方法
代码语言: javascript
复制
frac = float(len(z) / len(f))
# 下采样就是从多量的样本中抽取一部分数据直到和少量的样本达到平衡
sample_data = pd.concat([f.sample(frac=frac),z])

结果:

在这里插入图片描述
在这里插入图片描述

2. 利用np.random.choice() (个人感觉有点繁琐,不推荐)

代码语言: javascript
复制
import numpy as np
# 得到所有正样本的索引
z_index = np.array(z.index)
# 下采样就是从多量的样本中抽取一部分数据直到和少量的样本达到平衡,并取其索引
random_f_index = np.random.choice(f.index,len(z),replace = False)
 
推荐文章
销魂的杯子  ·  Box | Login
2 月前
开心的书包  ·  吕雪光课题组在mRNA疫苗冷冻保存领域取得重要进展--中国科学院化学研究所
3 月前
高大的李子  ·  区域交通_萧县人民政府
4 月前
聪明的手术刀  ·  Samsung unveils ISOCELL sensor trio: 200MP HP9, 50MP GNJ and 50MP JN5 - comments - page 2
4 月前
被表白的盒饭  ·  T90在叙利亚表现并没那么好,俄军会继续采购?还是这么办更划算_主战坦克
4 月前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号