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实现无证书加密解密实例
Oct 27 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
详解python发送各类邮件的主要方法
Dec 22 Python
wxpython实现图书管理系统
Mar 12 Python
python实现字符串和字典的转换
Sep 29 Python
Python中GIL的使用详解
Oct 03 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 Python
python blinker 信号库
May 04 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
我的php学习笔记(毕业设计)
2012/02/21 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
Python networkx包的实现
2020/02/14 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
闪闪的红星观后感
2015/06/08 职场文书
埃及王子观后感
2015/06/16 职场文书
寒假致家长的一封信
2015/10/10 职场文书
社会心理学学习心得体会
2016/01/22 职场文书