相关文章推荐
帅气的投影仪  ·  ASP.NET MVC 3 | ...·  4 月前    · 
豪气的移动电源  ·  用 Python ...·  1 年前    · 
爱旅游的肉夹馍  ·  关于#.net# ...·  1 年前    · 

分类问题中,经常会碰到类别极度不平衡的情况,这个时候可对样本进行上下采样,让训练数据集的类别接近平衡即可。

数据格式是一个dataframe,数据分为两类:多数类别和少数类别,数据量相差大。一般而言一个数据集中负样本数量远远大于正样本,故数据预处理已将多数类别的Label标记为0,少数类别的Label标记为1。以下分别是python实现采样代码:

一.下采样

下采样则是从多数量的类别中随机抽取样本(抽取的样本数量与少数类别样本量一致)从而减少多数量的类别样本数据,使数据达到平衡的方式。

import numpy as np
import pandas as pd
def lower_sample_data(df, percent=1):
    percent:多数类别下采样的数量相对于少数类别样本数量的比例
    data1 = df[df['Label'] == 0]  # 将多数量的类别样本放在data1
    data0 = df[df['Label'] == 1]  # 将少数量的类别样本放在data0
    index = np.random.randint(
        len(data1), size=percent * (len(df) - len(data1)))  # 随机给定下采样取出样本的序号
    lower_data1 = data1.iloc[list(index)]  # 下采样
    return(pd.concat([lower_data1, data0]))
np.random.seed(28)
arr1 = np.random.randint(6, size=(100, 5))
arr2 = np.random.randint(1000, 1010, size=(10, 5))
columns = ['A', 'B', 'C', 'D', 'E']
df1 = pd.DataFrame(arr1, columns=columns)
df1['Label'] = 0
df2 = pd.DataFrame(arr2, columns=columns)
df2['Label'] = 1
df = pd.concat([df1, df2])
print(lower_sample_data(df))  

二.上采样

上采样则是从少数量的类别中随机抽取样本(抽取的样本数量与多数类别样本量一致,或着增加一定的比例,可控制)从而增多多数量的类别样本数据,使数据达到平衡的方式。

import numpy as np
import pandas as pd
def up_sample_data(df, percent=0.2):
    percent:少数类别样本数量的重采样的比例,可控制,一般不超过0.5,以免过拟合
    data1 = df[df['Label'] == 0]  # 将多数类别的样本放在data1
    data0 = df[df['Label'] == 1]  # 将少数类别的样本放在data0
    index = np.random.randint(
        len(data0), size= int(percent * (len(df) - len(data0))))  # 随机给定上采样取出样本的序号
    up_data0 = data0.iloc[list(index)]  # 上采样
    return(pd.concat([up_data0, data1]))
np.random.seed(28)
arr1 = np.random.randint(6, size=(100, 5))
arr2 = np.random.randint(1000, 1010, size=(10, 5))
columns = ['A', 'B', 'C', 'D', 'E']
df1 = pd.DataFrame(arr1, columns=columns)
df1['Label'] = 0
df2 = pd.DataFrame(arr2, columns=columns)
df2['Label'] = 1
df = pd.concat([df1, df2])

三.当正负样本差异非常极端的时候,上、下采样一起结合,少数量的样本重采样(复制)一定比例,多数量的类别样本随机减少一定比例样本,让两者达到平衡。

import numpy as np
import pandas as pd
def up_lower_sample_data(df, up_percent=0.2,lower_percent=0.5):
    percent:多数类别下采样的数量相对于少数类别样本数量的比例
    data1 = df[df['Label'] == 0]  # 将多数类别的样本放在data1
    data0 = df[df['Label'] == 1]  # 将少数类别的样本放在data0
    up_index = np.random.randint(
        len(data0), size= int(up_percent * (len(df) - len(data0))))  # 随机给定上采样取出样本的序号
    up_data0 = data0.iloc[list(up_index)]  # 上采样
    lower_index = np.random.randint(
        len(data1), size=int(lower_percent * (len(df) - len(data0))))  # 随机给定下采样取出样本的序号
    lower_data1 = data1.iloc[list(lower_index)]  # 下采样
    return(pd.concat([up_data0, lower_data1]))
np.random.seed(28)
arr1 = np.random.randint(6, size=(100, 5))
arr2 = np.random.randint(1000, 1010, size=(10, 5))
columns = ['A', 'B', 'C', 'D', 'E']
df1 = pd.DataFrame(arr1, columns=columns)
df1['Label'] = 0
df2 = pd.DataFrame(arr2, columns=columns)
df2['Label'] = 1
df = pd.concat([df1, df2])
print(up_lower_sample_data(df))

本文参考以下连接,然后加深一步将上采样和两者结合代码写出,根据上下采样的原理,用python代码实现,如有疑惑可指正,谢谢!

参考: https://blog.csdn.net/xiaoxy97/article/details/82898812?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

分类问题中,经常会碰到类别极度不平衡的情况,这个时候可对样本进行上下采样,让训练数据集的类别接近平衡即可。数据格式是一个dataframe,数据分为两类:多数类别和少数类别,数据量相差大。一般而言一个数据集中负样本数量远远大于正样本,故数据预处理已将多数类别的Label标记为0,少数类别的Label标记为1。以下分别是python实现采样代码:一.下采样下采样则是从多数量的类别中随机抽取样本(抽取的样本数量与少数类别样本量一致)从而减少多数量的类别样本数据,使数据达到平衡的方式。impor
一、下 采样 所有数据存在DataFrame对象df中。数据分为两类:多数 类别 和少数 类别 ,数据量相差大。数据预处理已将多数 类别 的Label标记为1,少数 类别 的Label标记为0。从多数类中随机抽取样本(抽取的样本数量与少数 类别 样本量一致)从而减少多数 类别 样本数据,使数据达到 平衡 的方式。 import numpy as np import pandas as pd def lower_sam...
毫不奇怪的是,当您需要在可视化之前不降低数据视觉特性的情况下需要对数字时间序列进行降 采样 时, downsample很有用。 是一个NPM模块。 您可以在项目中键入类似以下内容的内容轻松下载它: # for all the npm people out there npm install downsample # or if you are a fan of yarn yarn add downsample 该软件包导出了几种数据下 采样 方法: ASAP自动平滑注意优先级在此处阅读更多 SMA简单移动平均线在此处了解更多 LTTB最大的三角形三个水桶在这里阅读更多 LTOB最大的三角形一个铲斗在这里阅读更多 LTD最大的三角形动态此处了解更多 您可以在下面的API部分中详细了解这些内容。 ASAP :collision: 1
之前对于RF信号下 采样 这个问题特别的懵, 上采样 我是知道的,就是对于矩阵插值等,使得它具有更多的信息。 但是下 采样 ,我查了很多资料,在知网上看到一篇论文(好像不是计算机领域的),他对于矩阵下 采样 就是删除特定的列和行,比如是8 * 8的矩阵,那就删除2 4 6 8列和行,得到一个含1 3 5 7列和行的4 * 4大小的矩阵。 上周开了组会,刚好听一个很厉害的师兄在查新汇报中说到了RF信号下 采样 的问题,我就去请教了师兄,啊,其实,很简单呐,就是矩阵的卷积,比如卷积核大小是33,那就可以让一个55大小的矩阵变为3*
平衡 数据 采样 方法整理 在实际的分类问题中,数据集的分布经常是不均衡的。虽然不均衡的数据在分类时常常能得到较高的分类准确率,但对于某些情况而言,准确率的意义并不大,并不能提供任何有用的信息。 从数据层面上而言,对于不 平衡 数据主要通过重 采样 的方法对数据集进行 平衡 。重 采样 方法是通过增加小众训练样本数的 上采样 和减少大众样本数的下 采样 使不 平衡 样本分布变 平衡 ,从而提高分类器对小众的识别率。 1. 上采样 (1...
resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention=‘start’, kind=None, loffset=None, limit=None, base=0, on=None, level=None) 比较关键的是rule,closed,label下面会随着两个用法说明 对时间数据细粒度增大,可以把每天的数据聚合成一周,可以求和或者均值的方式进行聚合 下面给出列子 times=pd.date_range('20180101',period
K-Means欠 采样 python 实现 1. K-Means欠 采样 原理 为解决分类问题中效果受样本集类间不 平衡 ,并提高训练样本的多样性,可以使用K-Means欠 采样 对样本进行 平衡 处理。该方法利用K-means方法对大类样本聚类,形成与小类样本个数相同的簇类数,从每个簇中随机抽取单个样本与风险样本形成 平衡 样本集。K-means欠 采样 过程如下: Step1:随机初始化k个聚类中心,分别为uj(1,2,…,k); Step2:对于大样本xi(1,2,…,n),计算样本到每个聚类中心uj的距离,将xi划分到聚类最小的簇,c(i)为样本i与k个类中距离最近的那个类,c(i)的值为1到k中的一个,则c(i)
'click':[1,0,0,1]} df = pd.DataFrame.from_dict(temp) #此处默认orient=columns,将字典的key转换成dataframe的列名 print(df) user_id age sex...
本次记录主要 实现 对每行进行排序,并保留前80%以前的偏好。思路:将每行的概率进行排序,然后累加,累加值小于等于0.8的偏好保留,获得一个累加过滤的dataframe,然后映射回原始数据中,保留每行的偏好。接下来是 代码 实现 a = [[0.2, 0.35, 0.45], [0.1,0.2, 0.7], [0.3, 0.5, 0.2]] data = pd.DataFrame(a, ind...
import pandas as pd a = [['01', 'a,b,c', 5], ['02','a,b', 10], ['03', 'b,c', 20]] data = pd.DataFrame(a, index=['user1','user2','user3'], columns=["id", "type", "num"]) print(data) for label in class_counts: if class_counts[label] >= target_size: # 如果该 类别 的样本数已经大于等于目标样本数,直接加入新序列 indices = [i for i, x in enumerate(y) if x == label] new_X.extend([X[i] for i in indices[:target_size]]) new_y.extend([label] * target_size) else: # 否则对该 类别 进行下 采样 indices = [i for i, x in enumerate(y) if x == label] new_X.extend([X[i] for i in indices]) new_y.extend([label] * len(indices)) while len(new_y) < target_size: idx = random.randint(0, len(indices)-1) new_X.append(X[indices[idx]]) new_y.append(label) return new_X, new_y 使用示例: ``` python X = ["hello", "world", "how", "are", "you", "doing", "today", "I", "am", "fine"] y = [0, 0, 0, 0, 0, 0, 1, 1, 1, 1] new_X, new_y = downsample(X, y, 4) print(new_X) # ["hello", "world", "how", "are", "I", "am", "fine"] print(new_y) # [0, 0, 0, 0, 1, 1, 1] 在上面的示例中,我们将目标序列大小设置为 4,由于 类别 0 中的样本数大于 4,因此我们直接选择了前 4 个样本, 类别 1 中的样本数小于 4,因此我们对其进行了下 采样 ,最终得到了大小为 4 的新序列。