目录
失衡的程度
不平衡数据即类别之间的分布不均匀
一般多少比例为严重不平衡, 参考:
根据少数类占比, 可对类别不平衡情况进行划分
轻度:20-40%
中度:1-20%
极度:<1%
分层抽样
分层比例/定额抽样原理, 参考:
(比例)分层抽样是概率抽样的一种,是指先分层再按总体群种中各层的比例随机抽样。定额抽样是非概率抽样的一种,是指分层并事先设定各层的主观配额比例,再进行抽样。举例:调查某高中学生的作息状况,该校高中1000人,高一350人,高二330人,高三320人。比例分层抽样:抽样100,高一35人,高二33人,高三32人。定额抽样(主观因素:调查者可能认为高三作息问题更严重,因此将更多配额事先给了高三):抽样100,高一30人,高二30人,高三40人。
定额抽样缺点是有偏差, 但此处不是为了估计发病比例, 而是为了根据特征训练模型, 所以应该没有影响.
分层抽样也有非比例分层抽样, 参考:
分层抽奖分为等比例抽样和不等比例抽样;
不等比例抽样即非比例抽样,是说从某一层抽取样本的比例要大于其他层。但是每层内部被抽到的概率仍然是均等的,随机的。
并且分层抽样属于概率抽样。大类都属于了,下面的分支自然也属于。
找了些代码, 都只有通用的均衡分层抽样, 不等比例的也许可以利用数据集分割函数手动分割. (最后仔细看一下官方文档)
分层抽样示例
各种抽样方法的示例
基于 Python 的 8 种常用抽样方法_Python数据之道的博客-CSDN博客
如何实现分层抽样, 参考:
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)] |