首页 > 其他分享 >数据不均衡处理一:数据重采样

数据不均衡处理一:数据重采样

时间:2024-03-18 20:29:05浏览次数:25  
标签:采样 Counter fit 样本 resampled 少数类 均衡 数据

数据不均衡是指在数据集中不同类别的样本数量差异较大,这可能会导致模型在训练和预测过程中对少数类样本的识别能力不足。数据重采样是一种常用的处理方法,可以通过增加少数类样本或减少多数类样本来平衡数据集,从而提高模型的性能。

常用的数据重采样方法有:过采样,欠采样和混合采样三种

目录

一:过采样(Oversampling)

二、欠采样(Undersampling)

三、混合采样(Synthetic Sampling)

一:过采样(Oversampling)

通过复制少数类样本来增加其数量,使得少数类样本与多数类样本数量相近。常见的过采样方法包括随机过采样、SMOTE(Synthetic Minority Over-sampling Technique)和 ADASYN(Adaptive Synthetic Sampling)等。

# 使用sklearn.datasets库生成不均衡数据集
from sklearn.datasets import make_classification
from collections import Counter
X, y = make_classification(n_samples=5000, n_features=2, n_informative=2,
                           n_redundant=0, n_repeated=0, n_classes=3,
                           n_clusters_per_class=1,
                           weights=[0.01, 0.05, 0.94],
                           class_sep=0.8, random_state=0)
print('Origin',Counter(y))
from imblearn.over_sampling import RandomOverSampler,SMOTE, ADASYN
'''
   RandomOverSampler:随机采样少数类的样本, 使得每类样本的比例为1:1:1
   SMOTE:对于少数类样本a, 随机选择一个最近邻的样本b, 然后从a与b的连线上随机选取一个点c作为新的少数类样本
   ADASYN: 关注的是在那些基于K最近邻分类器被错误分类的原始样本附近生成新的少数类样本,注意数据比例
'''
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)
print('RandomOverSampler',sorted(Counter(y_resampled).items()))

X_resampled_smote, y_resampled_smote = SMOTE().fit_resample(X, y)
print('SMOTE',sorted(Counter(y_resampled_smote).items()))
'''SMOTE变形
   from imblearn.over_sampling import BorderlineSMOTE
   BorderlineSMOTE(kind='borderline-1').fit_sample(X, y)
    kind = 'borderline-1' # 最近邻中的随机样本b与该少数类样本a来自于不同的类
           'borderline-2' # 随机样本b可以是属于任何一个类的样本
'''

X_resampled_adasyn, y_resampled_adasyn = ADASYN().fit_resample(X, y)
print('ADASYN',sorted(Counter(y_resampled_adasyn).items()))
二、欠采样(Undersampling)

通过删除多数类样本来减少其数量,使得多数类样本与少数类样本数量相近。欠采样方法包括随机欠采样、NearMiss等。

'''
   RandomUnderSampler: 就是从多数类样本中随机选取一些剔除掉,容易剔除重要信息。replacement=True参数, 可以实现自助法(boostrap)抽样.使用默认参数的时候, 采用的是不重复采样;
   EasyEnsemble:基于无监督的方式从多数类样本中生成子集进行欠采样.
                n_subsets控制的是子集的个数, replacement 决定是有放回还是无放回的随机采样。
   BalanceCascade:采用了有监督结合Boosting的方式,Boosting特点则体现在每一轮丢弃被正确分类的样本,进而后续基学习器会更注重那些之前分类错误的样本
   ClusterCentroids:减少数据集的样本数量, 剩下的样本是由原始数据集生成的, 而不是直接来源于原始数据集。
   NearMiss: version=1,选择到最近的K个少数类样本平均距离最近的多数类样本;
             version=2,选择到最远的K个少数类样本平均距离最近的多数类样本;
             version=3,对于每个少数类样本选择K个最近的多数类样本,目的是保证每个少数类样本都被多数类样本包围
   EditedNearestNeighbours:应用最近邻算法来编辑(edit)数据集, 找出那些与邻居不太友好的样本然后移除.
   Tomek Links:寻找的是噪声点或者边界点,这些点是不同类别之间距离比较近的样本对.只适用于2分类
'''
from imblearn.under_sampling import RandomUnderSampler, ClusterCentroids, NearMiss, EditedNearestNeighbours, TomekLinks

rus = RandomUnderSampler(random_state=0, replacement=True)
X_resampled, y_resampled = rus.fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))

# EasyEnsemble和BalanceCascade 变为不均衡数据预处理方法EasyEnsembleClassifier和BalancedBaggingClassifier
from imblearn.ensemble import BalancedBaggingClassifier,BalancedRandomForestClassifier,EasyEnsembleClassifier,RUSBoostClassifier
ee = EasyEnsembleClassifier(random_state=0)
model = ee.fit(X, y)


cc = ClusterCentroids(random_state=0)
X_resampled, y_resampled = cc.fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))


bc = BalancedBaggingClassifier(random_state=0)
model = bc.fit(X, y)
# print(sorted(Counter(y_resampled[0]).items()))

nm1 = NearMiss(random_state=0, version=1)
X_resampled_nm1, y_resampled = nm1.fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))

enn = EditedNearestNeighbours(random_state=0)
X_resampled, y_resampled = enn.fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))

tl = TomekLinks()
X_resampled, y_resampled = tl.fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))
三、混合采样(Synthetic Sampling)

当由边界的样本与其他样本进行过采样差值时, 很容易生成一些噪音数据。因此, 在过采样之后需要对样本进行清洗。即将前面的过采样和欠采样一起进行的混合模式,常见的有 SMOTEENN和SMOTETomek。

''' 
   SMOTEENN:SMOTE(过采样)+EditedNearestNeighbours(欠采样)
   SMOTETomek:SMOTE(过采样)+Tomek(欠采样)
'''
from imblearn.combine import SMOTEENN
smote_enn = SMOTEENN(random_state=0)
X_resampled, y_resampled = smote_enn.fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))

from imblearn.combine import SMOTETomek
smote_tomek = SMOTETomek(random_state=0)
X_resampled, y_resampled = smote_tomek.fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))

标签:采样,Counter,fit,样本,resampled,少数类,均衡,数据
From: https://blog.csdn.net/a2313179618/article/details/136819887

相关文章

  • 数据结构318
    1.整理链栈、循环队列的代码2.猴子吃桃问题,猴子第一天摘了若干个桃,当即就吃了一半数量的桃,没吃过瘾,又多吃一个,第二天,在剩下的桃里有吃了一半数量的桃,没吃过瘾,又多吃了一个,依此类推,直到第10天,想吃桃的时候,发现只剩下一个桃了,问:猴子第一天摘了多少个桃。(递归完成)3.整理思维导......
  • 数据库、表的创建、修改、删除
    一、数据库1.1、创建数据库语法:CREATEDATABASEIFNOTEXISTS数据库名CHARACTERSET字符集;例子:(推荐)CREATEDATABASEIFNOTEXISTS数据库名CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ci;1.2、使用数据库查看当前所有的数据库SHOWDATABASES;#有一个S,代......
  • 数据的压缩编码
    \(\newcommand{\E}{\mathbb{E}}\)\(\newcommand{\X}{\mathcal{X}}\)现在我们要开始讨论熵的意义,为此我们依然要回到数据的压缩编码这一核心概念上。首先我们要严格地定义编码。在这里,我们默认是用二进制进行编码。事实上,我们将要证明的所有结论对于一般的\(\mathcal{D}\)进制而言......
  • 数据结构(六)串,Trie字符串统计---以题为例
    维护一个字符串集合,支持两种操作:Ix 向集合中插入一个字符串 x;Qx 询问一个字符串在集合中出现了多少次。共有 N 个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为......
  • JAVA--数据库(增删改)
    增(INSERT)#给指定字段添加数据insertinto表名(字段1,字段2...)values(值1,值2...);给全部字段添加数据insertinto表名values(值1,值2...);批量添加数据insertinto表名(字段1,字段2...)values(值1,值2...),(值1,值2...),(值1,值2...);   insertinto......
  • 数据可视化-ECharts Html项目实战(3)
    在之前的文章中,我们学习了如何创建堆积折线图,饼图以及较难的瀑布图并更改图标标题。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。数据可视化-EChartsHtml项目实战(2)-CSDN博客文章浏览阅读1.2k次,点赞33次,收藏16......
  • 搭建springboot项目,链接数据库测试,并跑通流程
    步骤>>新建项目>>修改pom.xml文件>>创建文件mvc框架>>在主文件下创建Application启动类(注解@SpringBootApplication)>>resources文件下创建application.yml文件>>在domain下创建实体类(注解@Data)>>在mapper下创建mapper类(注解@Mapper)>>在service下创建接口>>在service下创建impl并......
  • OpenAI Sora训练数据非法?&ChatGPT参数规模被扒?
    关注文章底部公众号,获取更多AI新闻资讯Sora训练数据被质疑非法训练AI模型数据所面临的巨大版权争议,是这一年多全球相关人士讨论最多的话题。近日OpenAICTOMurati接受采访时,被问及Sora训练数据来源时语焉不详、支支吾吾,已经成了全网热议的话题。女记者:「Sora是用什么数......
  • 一文搞懂LVS负载均衡工作原理
    LVS(LinuxVirtualServer)是企业中常用的负载均衡方案,是一种基于Linux虚拟服务器,也是Linux标准内核的一部分。它能够实现高性能、高可用的服务器集群,具有良好可靠性、可扩展性和可操作性。说白了: LVS就是在计算机网络中,利用Linux虚拟服务器的作为一种媒介,实现请求的负载均衡策......
  • Springboot+Redis:实现缓存 减少对数据库的压力
    ......