python数据预处理 :样本分布不均的解决(过采样和欠采样)


Posted in Python onFebruary 29, 2020

何为样本分布不均:

样本分布不均衡就是指样本差异非常大,例如共1000条数据样本的数据集中,其中占有10条样本分类,其特征无论如何你和也无法实现完整特征值的覆盖,此时属于严重的样本分布不均衡。

为何要解决样本分布不均:

样本分部不均衡的数据集也是很常见的:比如恶意刷单、黄牛订单、信用卡欺诈、电力窃电、设备故障、大企业客户流失等。

样本不均衡将导致样本量少的分类所包含的特征过少,很难从中提取规律,即使得到分类模型,也容易产生过度依赖于有限的数量样本而导致过拟合问题,当模型应用到新的数据上时,模型的准确性和健壮性将会很差。

样本分布不均的解决方法:

过采样 通过增加分类中样本较少的类别的采样数量来实现平衡,最直接的方法是简单复制小样本数据,缺点是如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。

欠采样 通过减少分类中多数类样本的数量来实现样本均衡,最直接的方法是随机去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类中的一些重要信息。

设置权重 对不同样本数量的类别赋予不同的权重(通常会设置为与样本量成反比)

集成方法 每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。这种方法类似于随机森林。缺点是,比较吃计算资源,费时。

python代码:

# 生成不平衡分类数据集
from collections import Counter
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=3000, n_features=2, n_informative=2,
              n_redundant=0, n_repeated=0, n_classes=3,
              n_clusters_per_class=1,
              weights=[0.1, 0.05, 0.85],
              class_sep=0.8, random_state=2018)
Counter(y)
# Counter({2: 2532, 1: 163, 0: 305})

# 使用RandomOverSampler从少数类的样本中进行随机采样来增加新的样本使各个分类均衡
from imblearn.over_sampling import RandomOverSampler
 
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_sample(X, y)
sorted(Counter(y_resampled).items())
# [(0, 2532), (1, 2532), (2, 2532)]

# SMOTE: 对于少数类样本a, 随机选择一个最近邻的样本b, 然后从a与b的连线上随机选取一个点c作为新的少数类样本
from imblearn.over_sampling import SMOTE
 
X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X, y)
 
sorted(Counter(y_resampled_smote).items())
# [(0, 2532), (1, 2532), (2, 2532)]

# ADASYN: 关注的是在那些基于K最近邻分类器被错误分类的原始样本附近生成新的少数类样本
from imblearn.over_sampling import ADASYN

X_resampled_adasyn, y_resampled_adasyn = ADASYN().fit_sample(X, y)
 
sorted(Counter(y_resampled_adasyn).items())
# [(0, 2522), (1, 2520), (2, 2532)]

# RandomUnderSampler函数是一种快速并十分简单的方式来平衡各个类别的数据: 随机选取数据的子集.
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_sample(X, y)
 
sorted(Counter(y_resampled).items())
# [(0, 163), (1, 163), (2, 163)]

# 在之前的SMOTE方法中, 当由边界的样本与其他样本进行过采样差值时, 很容易生成一些噪音数据. 因此, 在过采样之后需要对样本进行清洗. 
# 这样TomekLink 与 EditedNearestNeighbours方法就能实现上述的要求.
from imblearn.combine import SMOTEENN
smote_enn = SMOTEENN(random_state=0)
X_resampled, y_resampled = smote_enn.fit_sample(X, y)
 
sorted(Counter(y_resampled).items())
# [(0, 2111), (1, 2099), (2, 1893)]

from imblearn.combine import SMOTETomek
smote_tomek = SMOTETomek(random_state=0)
X_resampled, y_resampled = smote_tomek.fit_sample(X, y)
 
sorted(Counter(y_resampled).items())
# [(0, 2412), (1, 2414), (2, 2396)]

# 使用SVM的权重调节处理不均衡样本 权重为balanced 意味着权重为各分类数据量的反比
from sklearn.svm import SVC 
svm_model = SVC(class_weight='balanced')
svm_model.fit(X, y)

# # EasyEnsemble 通过对原始的数据集进行随机下采样实现对数据集进行集成.
# EasyEnsemble 有两个很重要的参数: (i) n_subsets 控制的是子集的个数 and (ii) replacement 决定是有放回还是无放回的随机采样.
from imblearn.ensemble import EasyEnsemble
ee = EasyEnsemble(random_state=0, n_subsets=10)
X_resampled, y_resampled = ee.fit_sample(X, y)
sorted(Counter(y_resampled[0]).items())
# [(0, 163), (1, 163), (2, 163)]

# BalanceCascade(级联平衡)的方法通过使用分类器(estimator参数)来确保那些被错分类的样本在下一次进行子集选取的时候也能被采样到. 同样, n_max_subset 参数控制子集的个数, 以及可以通过设置bootstrap=True来使用bootstraping(自助法).
from imblearn.ensemble import BalanceCascade
from sklearn.linear_model import LogisticRegression
bc = BalanceCascade(random_state=0,
          estimator=LogisticRegression(random_state=0),
          n_max_subset=4)
X_resampled, y_resampled = bc.fit_sample(X, y)
 
sorted(Counter(y_resampled[0]).items())
# [(0, 163), (1, 163), (2, 163)]

# BalancedBaggingClassifier 允许在训练每个基学习器之前对每个子集进行重抽样. 简而言之, 该方法结合了EasyEnsemble采样器与分类器(如BaggingClassifier)的结果.
from sklearn.tree import DecisionTreeClassifier
from imblearn.ensemble import BalancedBaggingClassifier
bbc = BalancedBaggingClassifier(base_estimator=DecisionTreeClassifier(),
                ratio='auto',
                replacement=False,
                random_state=0)
bbc.fit(X, y)

以上这篇python数据预处理 :样本分布不均的解决(过采样和欠采样)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
Python计算斗牛游戏概率算法实例分析
Sep 26 Python
python基础教程项目三之万能的XML
Apr 02 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
Jun 26 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
Pytorch中.new()的作用详解
Feb 18 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
python实现门限回归方式
Feb 29 #Python
Python3.9又更新了:dict内置新功能
Feb 28 #Python
python实现logistic分类算法代码
Feb 28 #Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 #Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 #Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 #Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 #Python
You might like
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
php HandlerSocket的使用
2011/05/02 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
python针对excel的操作技巧
2018/03/13 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
python实现简单遗传算法
2020/09/18 Python
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
测试时代收集的软件测试面试题
2013/09/25 面试题
EJB面试题
2015/07/28 面试题
J2EE系统只能是基于web
2015/09/08 面试题
高中毕业生的个人自我评价
2014/02/21 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
2014年电厂工作总结
2014/12/04 职场文书
法人身份证明书
2015/06/18 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server