linux中python如何调用matlab的数据_特征锦囊:如何在Python中处理不平衡数据

40c49500a05f7906c71277d0ab315b09.png

今日锦囊

特征锦囊:如何在Python中处理不平衡数据

? Index

1、到底什么是不平衡数据

2、处理不平衡数据的理论方法

3、Python里有什么包可以处理不平衡样本

4、Python中具体如何处理失衡样本

印象中很久之前有位朋友说要我写一篇如何处理不平衡数据的文章,整理相关的理论与实践知识(可惜本人太懒了,现在才开始写),于是乎有了今天的文章。失衡样本在我们真实世界中是十分常见的,那么我们在机器学习(ML)中使用这些失衡样本数据会出现什么问题呢?如何处理这些失衡样本呢?以下的内容希望对你有所帮助!

? 到底什么是不平衡数据

失衡数据发生在分类应用场景中,在分类问题中,类别之间的分布不均匀就是失衡的根本,假设有个二分类问题,target为y,那么y的取值范围为0和1,当其中一方(比如y=1)的占比远小于另一方(y=0)的时候,就是失衡样本了。

那么到底是需要差异多少,才算是失衡呢,根本Google Developer的说法,我们一般可以把失衡分为3个程度:

  • 轻度:20-40%
  • 中度:1-20%
  • 极度:<1%

一般来说,失衡样本在我们构建模型的时候看不出什么问题,而且往往我们还可以得到很高的accuracy,为什么呢?假设我们有一个极度失衡的样本,y=1的占比为1%,那么,我们训练的模型,会偏向于把测试集预测为0,这样子模型整体的预测准确性就会有一个很好看的数字,如果我们只是关注这个指标的话,可能就会被骗了。

? 处理不平衡数据的理论方法

在我们开始用Python处理失衡样本之前,我们先来了解一波关于处理失衡样本的一些理论知识,前辈们关于这类问题的解决方案,主要包括以下:

  • 从数据角度:通过应用一些欠采样or过采样技术来处理失衡样本。欠采样就是对多数类进行抽样,保留少数类的全量,使得两类的数量相当,过采样就是对少数类进行多次重复采样,保留多数类的全量,使得两类的数量相当。但是,这类做法也有弊端,欠采样会导致我们丢失一部分的信息,可能包含了一些重要的信息,过采样则会导致分类器容易过拟合。当然,也可以是两种技术的相互结合。
  • 从算法角度:算法角度的解决方案就是可以通过对每类的训练实例给予一定权值的调整。比如像在SVM这样子的有参分类器中,可以应用grid search(网格搜索)以及交叉验证(cross validation)来优化C以及gamma值。而对于决策树这类的非参数模型,可以通过调整树叶节点上的概率估计从而实现效果优化。

此外,也有研究员从数据以及算法的结合角度来看待这类问题,提出了两者结合体的AdaOUBoost(adaptive over-sampling and undersampling boost)算法,这个算法的新颖之处在于自适应地对少数类样本进行过采样,然后对多数类样本进行欠采样,以形成不同的分类器,并根据其准确度将这些子分类器组合在一起从而形成强大的分类器,更多的请参考:

AdaOUBoost:https://dl.acm.org/doi/10.1145/1743384.1743408

? Python里有什么包可以处理不平衡样本

这里介绍一个很不错的包,叫 imbalanced-learn,大家可以在电脑上安装一下使用。

官方文档:https://imbalanced-learn.readthedocs.io/en/stable/index.html

pip install -U imbalanced-learn

05940df990a92d8ed52d118596ba61d2.png

使用上面的包,我们就可以实现样本的欠采样、过采样,并且可以利用pipeline的方式来实现两者的结合,十分方便,我们下一节来简单使用一下吧!

? Python中具体如何处理失衡样本

为了更好滴理解,我们引入一个数据集,来自于UCI机器学习存储库的营销活动数据集。(数据集大家可以自己去官网下载:https://archive.ics.uci.edu/ml/machine-learning-databases/00222/  下载bank-additional.zip 或者到公众号后台回复关键字“bank”来获取吧。)

我们在完成imblearn库的安装之后,就可以开始简单的操作了(其余更加复杂的操作可以直接看官方文档),以下我会从4方面来演示如何用Python处理失衡样本,分别是:

? 1、随机欠采样的实现

? 2、使用SMOTE进行过采样

? 3、欠采样和过采样的结合(使用pipeline)

? 4、如何获取最佳的采样率?

??? 那我们开始吧!
# 导入相关的库(主要就是imblearn库)
from collections import Counter
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

from sklearn.svm import SVC
from sklearn.metrics import classification_report, roc_auc_score
from numpy import mean

# 导入数据
df = pd.read_csv(r'./data/bank-additional/bank-additional-full.csv', ';') # '';'' 为分隔符
df.head()

b86776c76115953c94530b189743c06c.png

数据集是葡萄牙银行的某次营销活动的数据,其营销目标就是让客户订阅他们的产品,然后他们通过与客户的电话沟通以及其他渠道获取到的客户信息,组成了这个数据集。

关于字段释义,可以看下面的截图:

6d1b1201b03421853abcc28b8e3803e4.png

我们可以大致看看数据集是不是失衡样本:

df['y'].value_counts()/len(df)

#no     0.887346
#yes    0.112654
#Name: y, dtype: float64

可以看出少数类的占比为11.2%,属于中度失衡样本

# 只保留数值型变量(简单操作)
df = df.loc[:,
['age', 'duration', 'campaign', 'pdays',
       'previous', 'emp.var.rate', 'cons.price.idx',
       'cons.conf.idx', 'euribor3m', 'nr.employed','y']]
# target由 yes/no 转为 0/1
df['y'] = df['y'].apply(lambda x: 1 if x=='yes' else 0)
df['y'].value_counts()

#0    36548
#1     4640
#Name: y, dtype: int64
? 1、随机欠采样的实现

欠采样在imblearn库中也是有方法可以用的,那就是 under_sampling.RandomUnderSampler,我们可以使用把方法引入,然后调用它。可见,原先0的样本有21942,欠采样之后就变成了与1一样的数量了(即2770),实现了50%/50%的类别分布。

# 1、随机欠采样的实现
# 导入相关的方法
from imblearn.under_sampling import RandomUnderSampler

# 划分因变量和自变量
X = df.iloc[:,:-1]
y = df.iloc[:,-1]

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.40)

# 统计当前的类别占比情况
print("Before undersampling: ", Counter(y_train))

# 调用方法进行欠采样
undersample = RandomUnderSampler(sampling_strategy='majority')

# 获得欠采样后的样本
X_train_under, y_train_under = undersample.fit_resample(X_train, y_train)

# 统计欠采样后的类别占比情况
print("After undersampling: ", Counter(y_train_under))

# 调用支持向量机算法 SVC
model=SVC()

clf = model.fit(X_train, y_train)
pred = clf.predict(X_test)
print("ROC AUC score for original data: ", roc_auc_score(y_test, pred))

clf_under = model.fit(X_train_under, y_train_under)
pred_under = clf_under.predict(X_test)
print("ROC AUC score for undersampled data: ", roc_auc_score(y_test, pred_under))

# Output:
#Before undersampling:  Counter({0: 21942, 1: 2770})
#After undersampling:  Counter({0: 2770, 1: 2770})
#ROC AUC score for original data:  0.603521152028
#ROC AUC score for undersampled data:  0.829234085179

? 2、使用SMOTE进行过采样

过采样技术中,SMOTE被认为是最为流行的数据采样算法之一,它是基于随机过采样算法的一种改良版本,由于随机过采样只是采取了简单复制样本的策略来进行样本的扩增,这样子会导致一个比较直接的问题就是过拟合。因此,SMOTE的基本思想就是对少数类样本进行分析并合成新样本添加到数据集中。

算法流程如下:

(1)对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其k近邻。

(2)根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn。

(3)对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本。

f6ab3437a4cda6deaa71cb4464528420.png

# 2、使用SMOTE进行过采样
# 导入相关的方法
from imblearn.over_sampling import SMOTE

# 划分因变量和自变量
X = df.iloc[:,:-1]
y = df.iloc[:,-1]

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.40)

# 统计当前的类别占比情况
print("Before oversampling: ", Counter(y_train))

# 调用方法进行过采样
SMOTE = SMOTE()

# 获得过采样后的样本
X_train_SMOTE, y_train_SMOTE = SMOTE.fit_resample(X_train, y_train)

# 统计过采样后的类别占比情况
print("After oversampling: ",Counter(y_train_SMOTE))

# 调用支持向量机算法 SVC
model=SVC()

clf = model.fit(X_train, y_train)
pred = clf.predict(X_test)
print("ROC AUC score for original data: ", roc_auc_score(y_test, pred))

clf_SMOTE= model.fit(X_train_SMOTE, y_train_SMOTE)
pred_SMOTE = clf_SMOTE.predict(X_test)
print("ROC AUC score for oversampling data: ", roc_auc_score(y_test, pred_SMOTE))

# Output:
#Before oversampling:  Counter({0: 21980, 1: 2732})
#After oversampling:  Counter({0: 21980, 1: 21980})
#ROC AUC score for original data:  0.602555700614
#ROC AUC score for oversampling data:  0.844305732561

? 3、欠采样和过采样的结合(使用pipeline)

那如果我们需要同时使用过采样以及欠采样,那该怎么做呢?其实很简单,就是使用 pipeline来实现。

#  3、欠采样和过采样的结合(使用pipeline)
# 导入相关的方法
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline

# 划分因变量和自变量
X = df.iloc[:,:-1]
y = df.iloc[:,-1]

#  定义管道
model = SVC()
over = SMOTE(sampling_strategy=0.4)
under = RandomUnderSampler(sampling_strategy=0.5)
steps = [('o', over), ('u', under), ('model', model)]
pipeline = Pipeline(steps=steps)

# 评估效果
scores = cross_val_score(pipeline, X, y, scoring='roc_auc', cv=5, n_jobs=-1)
score = mean(scores)
print('ROC AUC score for the combined sampling method: %.3f' % score)

# Output:
#ROC AUC score for the combined sampling method: 0.937

? 4、如何获取最佳的采样率?

在上面的栗子中,我们都是默认经过采样变成50:50,但是这样子的采样比例并非最优选择,因此我们引入一个叫 最佳采样率的概念,然后我们通过设置采样的比例,采样网格搜索的方法去找到这个最优点。

# 4、如何获取最佳的采样率?
# 导入相关的方法
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline

# 划分因变量和自变量
X = df.iloc[:,:-1]
y = df.iloc[:,-1]

# values to evaluate
over_values = [0.3,0.4,0.5]
under_values = [0.7,0.6,0.5]
for o in over_values:
  for u in under_values:
    # define pipeline
    model = SVC()
    over = SMOTE(sampling_strategy=o)
    under = RandomUnderSampler(sampling_strategy=u)
    steps = [('over', over), ('under', under), ('model', model)]
    pipeline = Pipeline(steps=steps)
    # evaluate pipeline
    scores = cross_val_score(pipeline, X, y, scoring='roc_auc', cv=5, n_jobs=-1)
    score = mean(scores)
    print('SMOTE oversampling rate:%.1f, Random undersampling rate:%.1f , Mean ROC AUC: %.3f' % (o, u, score))
    

# Output:    
#SMOTE oversampling rate:0.3, Random undersampling rate:0.7 , Mean ROC AUC: 0.938
#SMOTE oversampling rate:0.3, Random undersampling rate:0.6 , Mean ROC AUC: 0.936
#SMOTE oversampling rate:0.3, Random undersampling rate:0.5 , Mean ROC AUC: 0.937
#SMOTE oversampling rate:0.4, Random undersampling rate:0.7 , Mean ROC AUC: 0.938
#SMOTE oversampling rate:0.4, Random undersampling rate:0.6 , Mean ROC AUC: 0.937
#SMOTE oversampling rate:0.4, Random undersampling rate:0.5 , Mean ROC AUC: 0.938
#SMOTE oversampling rate:0.5, Random undersampling rate:0.7 , Mean ROC AUC: 0.939
#SMOTE oversampling rate:0.5, Random undersampling rate:0.6 , Mean ROC AUC: 0.938
#SMOTE oversampling rate:0.5, Random undersampling rate:0.5 , Mean ROC AUC: 0.938

从结果日志来看,最优的采样率就是过采样0.5,欠采样0.7。

最后,想和大家说的是没有绝对的套路,只有合适的套路,无论是欠采样还是过采样,只有合适才最重要。还有,欠采样的确会比过采样“省钱”哈(从训练时间上很直观可以感受到)。

? References

[1] SMOTE算法 https://www.jianshu.com/p/13fc0f7f5565

[2] How to deal with imbalanced data in Python

往 期 锦 囊

特征锦囊:特征无量纲化的常见操作方法

特征锦囊:怎么进行多项式or对数的数据变换?

特征锦囊:常用的统计图在Python里怎么画?

特征锦囊:怎么去除DataFrame里的缺失值?

特征锦囊:怎么把被错误填充的缺失值还原?

特征锦囊:怎么定义一个方法去填充分类变量的空值?

特征锦囊:怎么定义一个方法去填充数值变量的空值?

特征锦囊:怎么把几个图表一起在同一张图上显示?

特征锦囊:怎么把画出堆积图来看占比关系?

特征锦囊:怎么对满足某种条件的变量修改其变量值?

特征锦囊:怎么通过正则提取字符串里的指定内容?

特征锦囊:如何利用字典批量修改变量值?

特征锦囊:如何对类别变量进行独热编码?

特征锦囊:如何把“年龄”字段按照我们的阈值分段?

特征锦囊:如何使用sklearn的多项式来衍生更多的变量?

特征锦囊:如何根据变量相关性画出热力图?

特征锦囊:如何把分布修正为类正态分布?

特征锦囊:怎么找出数据集中有数据倾斜的特征?

特征锦囊:怎么尽可能地修正数据倾斜的特征?

特征锦囊:怎么简单使用PCA来划分数据且可视化呢?

特征锦囊:怎么简单使用LDA来划分数据且可视化呢?

特征锦囊:怎么来管理我们的建模项目文件?

特征锦囊:怎么批量把特征中的离群点给“安排一下”?特征锦囊:彻底了解一下WOE和IV特征锦囊:一文介绍特征工程里的卡方分箱,附代码实现

特征锦囊:今天一起搞懂机器学习里的L1与L2正则化

特征锦囊:金融风控里的WOE前的分箱一定要单调吗?

 ? GitHub传送门 

https://github.com/Pysamlam/Tips-of-Feature-engineering

95c7373ea64c05f2521ddc9c26e53cc2.png

原创不易,如果觉得这种学习方式有用,希望可以帮忙随手转发or点下“在看”,这是对我的极大鼓励!阿里嘎多!?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码安装zabbix遇到的报错集锦

报错1&#xff1a;checking for mysql_config... configure: error: MySQL library not found 解决办法&#xff1a;查找mysql_config #find / -name "mysql_config*" /usr/local/mysql/bin/mysql_config 在配置时将原有的 --with-mysql 改为 --with-mysql/usr/loca…

pso算法c++语言代码,一C++PSO(PSO)算法

收集和变化PSO算法&#xff0c;它可用于参考实施&#xff1a;#include #include #include #include #include #define rand_01 ((float)rand() / (float)RAND_MAX)const int numofdims 30;const int numofparticles 50;using namespace std;//typedef void (*FitnessFunc)(fl…

Hadoop不适合哪些场景 哪些场景适合?

Hadoop设计的目的主要包括下面几个方面&#xff0c;也就是所谓的适用场景&#xff1a; 1&#xff1a;超大文件 可以是几百M&#xff0c;几百T这个级别的文件。 2&#xff1a;流式数据访问 Hadoop适用于一次写入&#xff0c;多次读取的场景&#xff0c;也就是数据复制进去之后&a…

微服务 边界服务_遵循这些实用原则以获取精心设计的微服务边界

微服务 边界服务by Jake Lumetta杰克卢米塔(Jake Lumetta) 遵循这些实用原则以获取精心设计的微服务边界 (Follow these practical principles to get well-designed microservices boundaries) 如何避免使微服务太小和紧密耦合 (How to avoid making your microservices too …

ShareEntryActivity java.lang.ClassNotFoundException | Android类找不到问题

错误堆栈&#xff1a; Process: com.mci.smagazine, PID: 23265java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mci.smagazine/com.mci.smagazine.apshare.ShareEntryActivity}: java.lang.ClassNotFoundException: com.mci.smagazine.apshare…

阿里Android p6准备,项目经历准备篇——如何准备阿里巴巴P6/P7前端面试

项目经历准备篇——如何准备阿里巴巴P6/P7前端面试在上次的校招文章之后&#xff0c;有很多同学问有没有社招相关的东西可以写一篇&#xff0c;现在它来了。比起校招&#xff0c;社招更加看重项目经历项目经历反应的思考。本文针对的是想进入阿里的P6/P7同学&#xff0c;着重讲…

for in for of区别_Python 第4课:for…in循环黄金搭档之range()函数

乐学趣学Py● 04&#xff1a;for…in循环黄金搭档之range()函数●Python趣味小百科Python中的绘图模块为什么叫Turtle海龟&#xff0c;而不是cat ,dog,bird呢&#xff1f;原来Python引用了麻省理工大学教授开发的logo海龟制图语言,能通过绘图直观地教大家学习编程。实践是最好的…

《游戏设计师修炼之道:数据驱动的游戏设计》一3.8小结

3.8小结 在玩游戏期间使用的数学知识通常相当简单&#xff0c;尽管代码中使用的数学知识可能非常复杂。玩家不希望由于在玩游戏期间不得不处理许多数字而分心&#xff0c;因为他们的大脑必须从控制角色的动作转换到记住数字的含义。许多游戏回避了数字&#xff0c;而是通过像计…

ubuntu下安装配置nfs

sudo apt-get install nfs-kernel-server sudo /nfs_root vim /etc/exports 在这个文件末尾添加 /nfs_root *(rw,sync,no_root_squash) 保存退出 重启nfs服务 sudo /etc/init.d/rpcbind restart sudo /etc/init.d/nfs-kernel-server restart 测试 sudo mount 192.168.2.1:/nf…

使命愿景价值观_为什么在制作产品时应该专注于愿景,价值,风险和先例

使命愿景价值观by Steve史蒂夫(Steve) 为什么在制作产品时应该专注于愿景&#xff0c;价值&#xff0c;风险和先例 (Why you should focus on vision, value, risk, and precedent when making your product) 几周前&#xff0c;产品开发人员John Cutler发表了一篇出色的文章&…

安卓前端布局Android,Android开发的几种常见布局

目前正在从事iOS开发&#xff0c;对于安卓就是大学的时候自学了点&#xff0c;做过几个小的项目&#xff0c;软件外包大赛、计算机设计大赛、移动应用大赛都拿过奖项&#xff0c;呵呵。。。现在回想起来以前大学做的安卓比赛是多么的幼稚。 从现在开始我要从头一步一步回顾安卓…

《Cocos2D权威指南》——3.9 本章小结

3.9 本章小结 本章对Cocos2D中的几个核心类&#xff08;CCNode、CCScene、CCLayer、CCSprite&#xff09;进行了详细介绍&#xff0c;并且通过节点层级图让大家了解到Cocos2D游戏的基本组成&#xff1b;然后介绍了Cocos2D中的单例。通过完善第2章的游戏实例&#xff0c;大家对…

永恒python图片_python 数据词云展示实例(3)- 背景图设置

记录wordcloud库背景图的设置及样板 之前介绍了wordcloud的基本使用wordcloud的基本使用&#xff0c;本文记录一下如何设置背景图。 样图 背景图tim.jpg 生成样图dream.png 样板 from PIL import Image,ImageSequence image Image.open(tim.jpg)#打开背景图 graph np.array(im…

创造的快乐

早上9点半到的图书馆&#xff0c;十点左右才进入状态&#xff0c;上午和下午的一半时间都用来看AMD的GCN架构&#xff0c;看这种官方的文档&#xff0c;和论文一样&#xff0c;只看摘要和图片&#xff0c;没有死磕的精神&#xff0c;很难有收获&#xff0c;结果就是&#xff0c…

python心得-基本概念2

一 编程语言介绍 1.1 机器语言&#xff1a;直接用计算机能理解的二进制指令编写程序&#xff0c;直接控制硬件 1.2 汇编语言&#xff1a;用英文标签取代二进制指令取编写程序&#xff0c;本质也是在直接控制硬件 1.3 高级语言&#xff1a;用人能理解的表达方式去编写程序&#…

初创团队最重要的是什么_我从一家出色的初创公司工作中学到的最重要的教训...

初创团队最重要的是什么by Yan Cui崔燕 我从一家出色的初创公司工作中学到的最重要的教训 (The most important lessons I learned from working at an amazing startup) I recently left Space Ape Games after a wonderful year. I learnt a lot, and worked on some challe…

企业如何杜绝云端数据泄密?

一直以来&#xff0c;云计算所倡导的就是&#xff1a;“我们可以做得更好&#xff0c;更便宜”。云计算带给企业诸多利好&#xff0c;但实施云计算必然会加剧信息泄露风险。当企业打算把所有数据传输云端的时候&#xff0c;首先要考虑的就是数据保护的问题。 使用云服务&#x…

3dmark for android,Android版3DMark首测

听到这个消息估计很多像我一样看腻了3dmark11画面的跑分党及玩家们有些许小失望。 每年的12月影驰都会联合NVIDIA举办盛大的嘉年华&#xff0c;今年在武汉举办的影驰2012电子竞技嘉年华的合作伙伴名单上出现了futumark的身影。Futuremark中国区负责人影驰在当天的平板体验区也提…

HTML 框架

iframe语法: <iframe src"URL"></iframe>该URL指向不同的网页。 Iframe - 设置高度与宽度 height 和 width 属性用来定义iframe标签的高度与宽度。 属性默认以像素为单位, 但是你可以指定其按比例显示 (如&#xff1a;"80%"). 实例 <iframe…

卡方检验python程序_Python从零开始第二章(1)卡方检验(python)

如果我们想确定两个独立分类数据组的统计显着性&#xff0c;会发生什么&#xff1f;这是卡方检验独立性有用的地方。 Chi-Square检验 我们将在1994年查看人口普查数据。具体来说&#xff0c;我们对“性别和“每周工作时间”之间的关系感兴趣。在我们的案例中&#xff0c;每个人…