-
SMOTE过采样方法解决类不平衡问题
2018-12-25 12:55:16最近在帮师兄处理一个二分类问题,其中的类别不平衡问题很严重.然后不管用什么模型,roc_auc_score得到的结果都不好. 然后网上找资料想办法解决数据倾斜问题.看到了SMOTE过采样算法. SMOTE过采样算法 JAIR'2002...最近在帮师兄处理一个二分类问题,其中的类别不平衡问题很严重.然后不管用什么模型,roc_auc_score得到的结果都不好. 然后网上找资料想办法解决数据倾斜问题.看到了SMOTE过采样算法.
SMOTE过采样算法
JAIR'2002的文章《SMOTE: Synthetic Minority Over-sampling Technique》提出了一种过采样算法SMOTE。概括来说,本算法基于“插值”来为少数类合成新的样本。下面介绍如何合成新的样本。
设训练集的一个少数类的样本数为 TT ,那么SMOTE算法将为这个少数类合成 NTNT 个新样本。这里要求 NN 必须是正整数,如果给定的 N<1N<1 那么算法将“认为”少数类的样本数 T=NTT=NT ,并将强制 N=1N=1 。
考虑该少数类的一个样本 ii ,其特征向量为 xi,i∈{1,...,T}xi,i∈{1,...,T} :
1. 首先从该少数类的全部 TT 个样本中找到样本 xixi 的 kk 个近邻(例如用欧氏距离),记为 xi(near),near∈{1,...,k}xi(near),near∈{1,...,k} ;
2. 然后从这 kk 个近邻中随机选择一个样本 xi(nn)xi(nn) ,再生成一个 00 到 11 之间的随机数 ζ1ζ1 ,从而合成一个新样本 x
xi1 :
xi1=xi+ζ1⋅(xi(nn)−xi)
3. 将步骤2重复进行 NN 次,从而可以合成 NN 个新样本:xinew,new∈1,...,Nxinew,new∈1,...,N。
那么,对全部的 TT 个少数类样本进行上述操作,便可为该少数类合成 NTNT 个新样本。
如果样本的特征维数是 22 维,那么每个样本都可以用二维平面上的一个点来表示。SMOTE算法所合成出的一个新样本 xi1xi1 相当于是表示样本 xixi 的点和表示样本 xi(nn)xi(nn) 的点之间所连线段上的一个点。所以说该算法是基于“插值”来合成新样本
实现代码:
from collections import Counter from sklearn.datasets import make_classification from imblearn.over_sampling import SMOTE # doctest: +NORMALIZE_WHITESPACE X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10) print('Original dataset shape %s' % Counter(y)) sm = SMOTE(random_state=42) X_res, y_res = sm.fit_resample(X, y) print('Resampled dataset shape %s' % Counter(y_res))
SMOTE过采样算法实现 有一个专门实现的库,imblearn.over_sampling.SMOTE这里合成了若干数量少的类别,最终两种类别的数量是一样的.
输出结果:
Original dataset shape Counter({1: 900, 0: 100})
Resampled dataset shape Counter({0: 900, 1: 900})
参考链接:
https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.SMOTE.html
-
pytorch利用pos_weight解决分类不平衡问题
2020-12-18 16:45:49下面重点介绍pos_weight的问题,直接上代码 import torch import torch.nn as nn device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") a=torch.tensor([1.0,2.0]) m=nn.Sigmoid() b=torch....首先简单介绍损失函数,放两张之前的笔记,这里不再赘述,可直接跳过。
下面重点介绍pos_weight的问题,直接上代码import torch import torch.nn as nn device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") a=torch.tensor([1.0,2.0]) m=nn.Sigmoid() b=torch.Tensor([0,1]) loss_function = nn.BCEWithLogitsLoss() loss_function1 = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([10.0,1.0])) loss_function2 = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([1.0,10.0])) loss_function3 = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([1.0,1.0])) loss_function4 = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([1.0,100.0])) loss = loss_function(a,b) loss1 = loss_function1(a,b) loss2 = loss_function2(a,b) loss3 = loss_function3(a,b) loss4 = loss_function4(a,b) print(loss,loss1,loss2,loss3,loss4)
预测值为1.0和2.0,标签值为0和1.预测值经过sigmoid之后为[0.7311,0.8808]
带入二分类交叉熵公式
和程序输出结果一致。
简单解释下loss1=loss的问题,注意公式中的Pc是加在了第一项,就是说仅对标签一生效,而我们的标签[0,1],因此pos_weight的值[1,1]和[10,1]是等价的。 -
分类中解决类别不平衡问题?(解决样本不平衡的问题?)
2020-04-13 11:28:58解决不平衡问题? 类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况。在现实的分类学习任务中,我们经常会遇到类别不平衡,例如在通过拆分法解决多分类问题时,即使原始问题中...解决不平衡问题?
类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况。在现实的分类学习任务中,我们经常会遇到类别不平衡,例如在通过拆分法解决多分类问题时,即使原始问题中不同类别的训练样例数目相当,在使用OvR(一对其余,One vs. Rest,简称OvR)、MvM(多对多,Many vs. Many,简称MvM)策略后产生的二分类任务扔可能出现类别不平衡现象,因此有必要了解类别不平衡性处理的基本方法。
1、欠采样方法
含义:直接对训练集中多数类样本进行“欠采样”(undersampling),即去除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。
随机欠采样顾名思义即从多数类S_major中随机选择一些样样本组成样本集E 。然后将样本集E 从 S_major 中移除。新的数据集 S_new_major = S_major - E。
缺点:随机欠采样方法通过改变多数类样本比例以达到修改样本分布的目的,从而使样本分布较为均衡,但是这也存在一些问题。对于随机欠采样,由于采样的样本集合要少于原来的样本集合,因此会造成一些信息缺失,即将多数类样本删除有可能会导致分类器丢失有关多数类的重要信息。
为了克服随机欠采样方法导致的信息缺失问题,又要保证算法表现出较好的不均衡数据分类性能,出现了欠采样法代表性的算法EasyEnsemble和BalanceCascade算法。
EasyEnsemble:
1)从多数类中有放回的随机采样n次,每次选取与少数类数目相近的样本个数,那么可以得到n个样本集合记作。
2)然后,将每一个多数类样本的子集与少数类样本合并并训练出一个模型,可以得到n个模型。
3)最终将这些模型组合形成一个集成学习系统,最终的模型结果是这n个模型的平均值。
BalanceCascade:
BalanceCascade算法基于Adaboost,将Adaboost作为基分类器,其核心思路是:1)在每一轮训练时都使用多数类与少数类数量相等的训练集,训练出一个Adaboost基分类器。
2)然后使用该分类器对全体多数类进行预测,通过控制分类阈值来控制假正例率(False Positive Rate),将所有判断正确的类删除。
3)最后,进入下一轮迭代中,继续降低多数类数量。
2、过采样方法
含义:对训练集里的少数类进行“过采样”(oversampling),即增加一些少数类样本使得正、反例数目接近,然后再进行学习。
随机过采样是在少数类S_min中随机选择一些样本,然后通过复制所选择的样本生成样本集E,将它们添加到S_min中来扩大原始数据集从而得到新的少数类集合S_new_min。新的数据集S_new_min = S_min + E。
缺点:对于随机过采样,由于需要对少数类样本进行复制来扩大数据集,造成模型训练复杂度加大。另一方面也容易造成模型的过拟合问题,因为随机过采样是简单的对初始样本进行复制采样,这就使得学习器学得的规则过于具体化,不利于学习器的泛化性能,造成过拟合问题。
为了解决随机过采样中造成模型过拟合问题,又能保证实现数据集均衡的目的,出现了过采样法代表性的算法SMOTE和Borderline-SMOTE算法。
过采样代表性算法-SMOTE
SMOTE全称是Synthetic Minority Oversampling即合成少数类过采样技术。SMOTE算法是对随机过采样方法的一个改进算法,由于随机过采样方法是直接对少数类进行重采用,会使训练集中有很多重复的样本,容易造成产生的模型过拟合问题。而SOMT算法的基本思想:
1)对于少数类中的每一个样本Xi,以欧氏距离为标准计算它到少数类样本集S_min中所有样本的距离,得到其k近邻
2)2).根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本Xi,从其k近邻中随机选择若干个样本Xi,假设选择的是 。
3)对于每一个随机选出来的近邻Xi,分别与Xi按照如下公式构建新的样本。SMOTE算法也存以下两个缺点:
1)由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠的问题。
2)在SMOTE算法中,出现了过度泛化的问题,主要归结于产生合成样本的方法。特别是,SMOTE算法对于每个原少数类样本产生相同数量的合成数据样本,而没有考虑其邻近样本的分布特点,这就使得类间发生重复的可能性增大。------------------------------------------
解决办法总结:-
过抽样
抽样处理不平衡数据的最常用方法,基本思想就是通过改变训练数据的分布来消除或减小数据的不平衡。
过抽样方法通过增加少数类样本来提高少数类的分类性能 ,最简单的办法是简单复制少数类样本,缺点是可能导致过拟合,没有给少数类增加任何新的信息。改进的过抽样方法通过在少数类中加入随机高斯噪声或产生新的合成样本等方法。
注意:好像对svm没用 -
欠抽样方法通过减少多数类样本来提高少数类的分类性能,最简单的方法是通过随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类的一些重要信息,不能够充分利用已有的信息。
-
算法层面,采用代价敏感方法。
(1)重构训练集的方法。不改变已有算法,而是根据样本的不同错分代价给训练集中的每一个样本赋一个权值,接着按权重对原始样本集进行重构。
(2)引入代价敏感因子,设计出代价敏感的分类算法。通常对小样本赋予较高的代价,大样本赋予较小的代价,期望以此来平衡样本之间的数目差异。 -
特征选择
样本数量分布很不平衡时,特征的分布同样会不平衡。尤其在文本分类问题中,在大类中经常出现的特征,也许在稀有类中根本不出现。因此,根据不平衡分类问题的特点,选取最具有区分能力的特征,有利于提高稀有类的识别率 。
按照一个经验性的样本比例,挑选正负2个样本集,分别从中选择最能表示该类样本的特征集,然后将这些特征集合并作为最后挑选的特征。 -
不平衡学习的评价方法
1.F1度量2.ROC曲线和AUC面积
3.G-Mean
如何选择:
(1)在正负样本都非常少的情况下,应该采用数据合成的方式,例如:SMOTE算法和Borderline-SMOTE算法。
(2)在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样的方法或者是加权的方法。
-
-
分类中解决类别不平衡问题
2020-11-09 16:17:04分类中解决类别不平衡问题 在现实环境中,采集的数据(建模样本)往往是比例失衡的。比如网贷数据,逾期人数的比例是极低的(千分之几的比例);奢侈品消费人群鉴定等 在这一节中,我们一起看一下,当遇到数据类别不...分类中解决类别不平衡问题
在现实环境中,采集的数据(建模样本)往往是比例失衡的。比如网贷数据,逾期人数的比例是极低的(千分之几的比例);奢侈品消费人群鉴定等
在这一节中,我们一起看一下,当遇到数据类别不平衡的时候,我们该如何处理。在Python中,有Imblearn包,它就是为处理数据比例失衡而生的。
安装Imblearn包
pip3 install imbalanced-learn解决类别不平衡数据方法介绍
过采样方法
对训练集里的少数类进行“过采样”(oversampling),即增加一些少数类样本使得正、反例数目接近,然后再进行学习。随机过采样方法
复制# 使用imblearn进行随机过采样 from imblearn.over_sampling import RandomOverSampler ros = RandomOverSampler(random_state=0) X_resampled, y_resampled = ros.fit_resample(X, y) #查看结果 Counter(y_resampled) #过采样后样本结果 # Counter({2: 4674, 1: 4674, 0: 4674}) # 数据集可视化 plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled) plt.show()
过采样代表性算法-SMOTE
对每个少数类样本 [公式] ,从它的最近邻中随机选择一个样本 [公式] ( [公式] 是少数类中的一个样本),然后在 [公式] 和 [公式] 之间的连线上随机选择一点作为新合成的少数类样本。# SMOTE过采样 from imblearn.over_sampling import SMOTE X_resampled, y_resampled = SMOTE().fit_resample(X, y) Counter(y_resampled) # 采样后样本结果 # [(0, 4674), (1, 4674), (2, 4674)] # 数据集可视化 plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled) plt.show()
欠采样
直接对训练集中多数类样本进行“欠采样”(undersampling),即去除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。随机欠采样 from imblearn.under_sampling import RandomUnderSampler rus = RandomUnderSampler(random_state=0) X_resampled, y_resampled = rus.fit_resample(X, y) Counter(y_resampled) # 采样后结果 [(0, 64), (1, 64), (2, 64)] # 数据集可视化 plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled) plt.show()
缺点:
随机欠采样方法通过改变多数类样本比例以达到修改样本分布的目的,从而使样本分布较为均衡,但是这也存在一些问题。对于随机欠采样,由于采样的样本集合要少于原来的样本集合,因此会造成一些信息缺失,即将多数类样本删除有可能会导致分类器丢失有关多数类的重要信息。 -
分类:类不平衡问题的解决方法
2020-07-27 13:39:01分类:类不平衡问题的解决方法 现实世界的数据集通常会存在**类不平衡(class imbalance)**问题,具有较少样本的类,由于模型习得的较少,因而更容易被误分类。极端情况下,所设计的网络会直接忽略小样本类。 解决这... -
解决分类样本不平衡问题
2018-07-31 22:06:59样本不平衡会导致出现以下的问题: (1)少数类所包含的信息很有限,难以确定少数类数据的分布,即难以在内部挖掘规律,造成少数类的识别率低; (2)很多分类算法采用分治法,样本空间的逐渐划分会导致数据碎片... -
时间序列分类不平衡 python_如何解决时间序列数据中的类不平衡问题?
2020-12-18 20:40:57我想通过过采样来修复类不平衡,同时保留每一天的序列。理想情况下,我可以使用ADASYN或其他方法,而不是随机过采样。数据如下:import pandas as pdimport numpy as npfrom datetime import datetime, timedeltanp.... -
分类中解决数据类别不平衡问题的方案
2020-04-08 20:24:10分类中解决类别不平衡问题 在现实环境中,采集的数据(建模样本)往往是比例失衡的。比如网贷数据,逾期人数的比例是极低的(千分之几的比例);奢侈品消费人群鉴定等。 1 类别不平衡数据集基本介绍 在该博客中,... -
深度学习分类类别不平衡_分类中数据不平衡问题的解决经验
2020-12-22 11:15:20问题:研究表明,在某些应用下,1∶35的...很多分类算法采用分治法,样本空间的逐渐划分会导致数据碎片问题,这样只能在各个独立的子空间中寻找数据的规律,对于少数类来说每个子空间中包含了很少的数据信息,一些跨... -
分类中常见的类别不平衡问题解决方法
2017-08-29 11:01:32常见的类别不平衡问题解决方法 通常的分类学习方法中都有一个共同的假设,即不同类别的训练样例数目相同。如果不同类别的训练样例数目稍有差别,通常对分类影响不大,但是若差别很大,则会对学习造成影响,测试结果... -
R语言解决数据不平衡问题
2019-07-07 11:16:23R语言解决数据不平衡问题 一、项目环境 开发工具:RStudio R:3.5.2 相关包:dplyr、ROSE、DMwR 二、什么是数据不平衡?为什么要处理数据不平衡? 首先我们要知道的第一个问题就是“什么是数据不平衡”,从字面... -
Python imblearn 解决 类别不平衡问题
2019-11-12 13:05:46类别不平衡问题,顾名思义,即数据集中存在某一类样本,其数量远多于或远少于其他类样本,从而导致一些机器学习模型失效的问题。例如逻辑回归即不适合处理类别不平衡问题,例如逻辑回归在欺诈检测问题中,因为绝大... -
解决样本不平衡问题
2017-03-22 19:45:31样本不平衡会导致出现以下的问题: (1)少数类所包含的信息很有限,难以确定少数类数据的分布,即难以在内部挖掘规律,造成少数类的识别率低; (2)很多分类算法采用分治法,样本空间的逐渐划分会导致数据碎片... -
分类问题中类别不平衡问题的有效解决方法
2019-04-14 14:13:51在LGBM的文档中,可以看到有两个参数来处理类别不平衡,分别是is_unbalance和scale_pos_weight 。 在上图中的介绍中,这2个参数只能选其一,不能同时选。这说明了什么呢?这2个参数肯定是起到了相同的作用。这2个... -
分类中数据不平衡问题的解决经验
2017-07-27 09:20:43问题:研究表明,在某些应用下,1∶35的比例就会使...很多分类算法采用分治法,样本空间的逐渐划分会导致数据碎片问题,这样只能在各个独立的子空间中寻找数据的规律,对于少数类来说每个子空间中包含了很少的数据信息 -
解决不平衡数据集问题
2019-07-29 16:39:38解决不平衡数据集问题 数据不平衡通常反映数据集中类的不均匀分布。例如,在信用卡欺诈检测数据集中,大多数信用卡交易都不是欺诈,只有很少...另一类是从学习算法入手 , 根据算法在解决不平衡问题时的缺陷 , 适当地... -
分类中训练集中不平衡问题解决办法
2016-07-29 14:43:091.改变数据集规模 增加小类样本+减少大类样本 ...决策树往往在类别不均衡数据上表现不错。 6.对模型惩罚 小类样本数据增加权值,降低大类样本的权值 7.业务理解角度 异常点检测+变化趋势检测 8.
-
密封:这是一个Slack机器人,一旦提供了组织名称,团队成员的github名称以及要遵循的回购清单,便会将团队的拉取请求发布到其Slack频道。 这是我在GDS的第一个20%项目-源码
-
幼儿美术课件 扑克国王.ppt
-
QT编程思想【C++,基于QT 6】
-
VMware vSphere ESXi 7 精讲/VCSA/VSAN
-
Unity RUST 逆向安全开发
-
正支共焦非稳腔输出功率方程及其数值计算方法
-
python Flask+scrapy+人工智能 实现高性能搜索引擎
-
《文本处理 awk sed grep ”三剑客”》
-
小白学习[leetcode][玩转双指针]之88合并两个有序数组
-
bumblebee:Jaxcore Bumblebee-一个JavaScript语音应用程序框架-源码
-
java excel maven_Java代码将数据导出Excel表格(Maven版本)
-
precede和previous_Previous Analyses of Hungarian Phrase Structure
-
键盘:with使用Web Audio API进行有趣的实验:musical_notes:-源码
-
幼儿美术课件 创意课程. 营火剪影ppt.ppt
-
信息系统与信息化
-
Sandboxie-Classic-x64-v5.48.5.exe
-
幼儿美术课件 创意水彩笔风景-灿烂时光.ppt
-
java常用的断言方法_TestNG常用的3种断言方法
-
幼儿美术课件 创意水粉-影子在跳舞.ppt
-
基于所有介电超材料的透射/反射可切换频率选择表面