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实现中文转换url编码的方法
Jun 14 Python
SVM基本概念及Python实现代码
Dec 27 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
python字符串和常用数据结构知识总结
May 21 Python
Django利用cookie保存用户登录信息的简单实现方法
May 27 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
python scrapy重复执行实现代码详解
Dec 28 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
用Python进行websocket接口测试
Oct 16 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 Python
解决jupyter notebook启动后没有token的坑
Apr 24 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
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
js实现拖拽功能
2017/03/01 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
校园创业策划书
2014/01/14 职场文书
特色冷饮店创业计划书
2014/01/28 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
运动会通讯稿300字
2015/07/20 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL