如何处理不平衡数据集(附代码)

作者:童蒙
编辑:amethyst

上一篇中,我们给大家介绍了featuretools这个工具,可以很快速的根据数据的特征来生成各种新的数据组合,之后进行机器学习或者深度学习。这次我们给大家介绍在特征工程中,经常遇到的另一个问题的解决方法。这个问题就是不平衡数据集。

数据不平衡通常反映了数据集中类别的不均匀分布。比如在一个疾病的预测模型中,对照组可能有两百个,而疾病组只有二十个,数据不平衡比例达到10:1。如果不对数据集进行平衡,那么在后续的MLP抽样中,就会导致算法达不到收敛。因此,我们需要对不平衡数据集进行处理,下面我们来介绍三种方法,两个包,来解决这个办法。

一、欠采样

欠采样就是一个随机删除一部分多数类(数量多的类型)数据的过程,这样可以使多数类数据数量可以和少数类(数量少的类型)相匹配。

首先我们来生成一套数据

from sklearn.datasets import load_iris
from imblearn.datasets import make_imbalance
iris = load_iris(as_frame=True)

sampling_strategy = {0: 10, 1: 20, 2: 47}
X, y = make_imbalance(iris.data, iris.target, sampling_strategy=sampling_strategy)
y.value_counts()

可以看到各个类别的个数,类别与{0: 10, 1: 20, 2: 47} 一致。下面我们拿这个数据进行下一步的分析。

方法1 可以用imblearn的 字符串方法 来进行欠采样

from imblearn.under_sampling import RandomUnderSampler
sampling_strategy = "not minority"
rus = RandomUnderSampler(sampling_strategy=sampling_strategy)
X_res, y_res = rus.fit_resample(X, y)
y_res.value_counts()

可以看到结果为:

2    10
1    10
0    10

其中 sampling_strategy可以选择以下几种,大家可以去试试:

  • 'majority':resample only the majority class;
  • 'not minority':resample all classes but the minority class;
  • 'not majority':resample all classes but the majority class;
  • 'all':resample all classes;
  • 'auto':equivalent to 'not minority'。

方法2 使用dict方法
使用方法如下:

from imblearn.under_sampling import RandomUnderSampler
sampling_strategy = {0: 10, 1: 15, 2: 20}
rus = RandomUnderSampler(sampling_strategy=sampling_strategy)
X_res, y_res = rus.fit_resample(X, y)
y_res.value_counts()

结果如下

2    20
1    15
0    10

可以看出,是按照dict指定的比例来。

二、过采样

这是一个生成合成数据的过程,通过学习少数类样本特征随机地生成新的少数类样本数据。

有许多方法对数据集进行过采样,最常见的技术是SMOTE(Synthetic Minority Over-sampling Technique)。使用方法也很简单,如下:

方法1 可以用imblearn的 字符串方法 来进行过采样

from imblearn.over_sampling import RandomOverSampler
sampling_strategy = "not majority"
ros = RandomOverSampler(sampling_strategy=sampling_strategy)
X_res, y_res = ros.fit_resample(X, y)
y_res.value_counts()

可以看到结果为:

2    47
1    47
0    47

其中 sampling_strategy可以选择以下几种,大家可以去试试:

  • 'minority':resample only the minority class;
  • 'not minority':resample all classes but the minority class;
  • 'not majority':resample all classes but the majority class;
  • 'all':resample all classes;
  • 'auto':equivalent to 'not majority'。

方法2 使用dict方法
使用方法如下:

from imblearn.over_sampling import RandomOverSampler
sampling_strategy = {0: 25, 1: 35, 2: 47}
ros = RandomOverSampler(sampling_strategy=sampling_strategy)
X_res, y_res = ros.fit_resample(X, y)
y_res.value_counts()

结果如下

2    47
1    35
0    25

可以看出,是按照dict指定的比例来。

三、使用pytorch集成的抽样方法来调整

如果大家习惯用torch的话,可以使用如下脚本:

import torch
import torch.utils.data as Data
X_torch = torch.from_numpy(X.values).float()
y_torch = torch.from_numpy(y.values).float()
class_sample_count = torch.tensor([(y_torch == t).sum() for t in torch.unique(y_torch, sorted=True)])
weight = 1. / class_sample_count.float()
sample_weight = torch.tensor([weight[int(t)] for t in y])
sampler = torch.utils.data.sampler.WeightedRandomSampler(sample_weight , len(samples_weight))
train_data = Data.TensorDataset(X,y)
train_loader = Data.DataLoader( dataset = train_data , batch_size =200  ,sampler = sampler )

使用WeightedRandomSampler来进行进行不平衡抽样。

结语

相信大家对如何处理不平衡数据有了一定的了解,请大家以后继续关注我们相关系列。

参考阅读

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容