数据处理笔记11 类别不平衡处理-抽样方法

目录

失衡的程度

分层抽样

分层抽样示例

上采样

下采样


失衡的程度

不平衡数据即类别之间的分布不均匀

一般多少比例为严重不平衡, 参考:

数据比例达到多少才是不平衡数据? - 知乎

根据少数类占比, 可对类别不平衡情况进行划分

轻度:20-40%

中度:1-20%

极度:<1%

分层抽样

分层比例/定额抽样原理, 参考:

按比例分层抽样和定额抽样的区别? - 知乎

(比例)分层抽样是概率抽样的一种,是指先分层再按总体群种中各层的比例随机抽样。定额抽样是非概率抽样的一种,是指分层并事先设定各层的主观配额比例,再进行抽样。举例:调查某高中学生的作息状况,该校高中1000人,高一350人,高二330人,高三320人。比例分层抽样:抽样100,高一35人,高二33人,高三32人。定额抽样(主观因素:调查者可能认为高三作息问题更严重,因此将更多配额事先给了高三):抽样100,高一30人,高二30人,高三40人。

定额抽样缺点是有偏差, 但此处不是为了估计发病比例, 而是为了根据特征训练模型, 所以应该没有影响.

分层抽样也有非比例分层抽样, 参考:

分层抽样的非比例抽样是不是属于概率抽样,为什么? - 知乎

分层抽奖分为等比例抽样和不等比例抽样;

不等比例抽样即非比例抽样,是说从某一层抽取样本的比例要大于其他层。但是每层内部被抽到的概率仍然是均等的,随机的。

并且分层抽样属于概率抽样。大类都属于了,下面的分支自然也属于。

找了些代码, 都只有通用的均衡分层抽样, 不等比例的也许可以利用数据集分割函数手动分割. (最后仔细看一下官方文档)

分层抽样示例

各种抽样方法的示例

基于 Python 的 8 种常用抽样方法_Python数据之道的博客-CSDN博客

如何实现分层抽样, 参考:

怎么用python分层抽样? - 知乎

scikit-learn这个库里面有很多抽样工具sklearn.model_selection里面的KFold就是一个分层抽样工具,但是不保证每层中不同标签的比例与总体保持一致,用sklearn.model_selection中的StratifiedKFold抽样就可以保持标签比例一致。

代码示例:

python四种抽样方法的使用:随机抽样、聚类抽样、系统抽样、分层抽样_呆萌的代Ma的博客-CSDN博客_python分层随机抽样

医疗数据应用, 参考:

https://www.cnblogs.com/cgmcoding/p/13588581.html

sklearn.model_selection.StratifiedShuffleSplit 主要用于数据不均匀的时候,比如在医疗数据当中得癌症的人比不得癌症的人少很多,此交叉验证对象是StratifiedKFold和ShuffleSplit的合并,返回分层的随机折叠。折叠是通过保留每个类别的样品百分比来进行的

sklearn.model_selection.StratifiedShuffleSplit(n_splits=10, *, test_size=None, train_size=None, random_state=None)

参数用法的K折交叉法基本一样,都是通过构建StratifiedShuffleSplit对象,然后再通过for循环和split函数进行拆分,返回的是对应的索引

官网文档参考:

https://scikit-learn.org/stable/modules/cross_validation.html#stratified-shuffle-split

StratifiedGroupKFold是一个交叉验证方案,结合了StramentedKFold和GroupKFold。这个想法是尝试在每次拆分中保留类的分布,同时将每个组保持在单个拆分中。当您的数据集不平衡时,这可能很有用,因此仅使用 GroupKFold 可能会产生不平衡的拆分

定额抽样data.sample

13、python对数据进行随机抽样、按比例、分层抽样_UP Lee的博客-CSDN博客_python 分层抽样

上采样

随机上采样

使用类RandomOverSampler, 随机过度采样可用于重复某些样本,平衡数据集之间的样本数

from imblearn.over_sampling import RandomOverSampler

ros = RandomOverSampler(random_state=0)

X_resampled, y_resampled = ros.fit_resample(X, y)

from collections import Counter

print(sorted(Counter(y_resampled).items()))

[(0, 4674), (1, 4674), (2, 4674)]

from sklearn.svm import LinearSVC

clf = LinearSVC()

clf.fit(X_resampled, y_resampled) # doctest : +ELLIPSIS

    sampler = RandomOverSampler(random_state=0)

    # model = make_pipeline(sampler, svm1).fit(train_data, train_data_lable)

    X_res, y_res = sampler.fit_resample(train_data, train_data_lable)

    print('Original dataset shape %s' % Counter(train_data_lable))

    print('Resampled dataset shape %s' % Counter(y_res))

    svm1.fit(X_res, y_res)

其中RandomOverSampler函数:

通过bootstrap方法采样.

参数sampling_strategy默认值'auto'= 'not majority':对除多数类以外的所有类重新采样;

插值采样:

from sklearn.datasets import fetch_openml

df_adult, y_adult = fetch_openml(

    'adult', version=2, as_frame=True, return_X_y=True)

df_adult.head() 

df_resampled, y_resampled = ros.fit_resample(df_adult, y_adult)

df_resampled.head()

下采样

参考官方文档

3. Under-sampling — Version 0.9.1

原型生成技术将减少目标类中的样本数量,但剩余的样本是从原始集合中生成而不是选择的。

与原型生成算法相反,原型选择算法将从原始集合S中选择样本。

RandomUnderSampler是一种快速简便的方法来平衡数据,方法是为目标类随机选择数据子集:

from imblearn.under_sampling import RandomUnderSampler

rus = RandomUnderSampler(random_state=0)

X_resampled, y_resampled = rus.fit_resample(X, y)

print(sorted(Counter(y_resampled).items()))

[(0, 64), (1, 64), (2, 64)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值