独家 | 一文教你如何处理不平衡数据集(附代码)

简介: 本文作者用python代码示例解释了3种处理不平衡数据集的可选方法,包括数据层面上的2种重采样数据集方法和算法层面上的1个集成分类器方法。

翻译:张玲

校对:吴金迪

文章来源:微信公众号 数据派THU

本文约1500字,建议阅读5分钟。


本文作者用python代码示例解释了3种处理不平衡数据集的可选方法,包括数据层面上的2种重采样数据集方法和算法层面上的1个集成分类器方法。

分类是机器学习最常见的问题之一,处理它的最佳方法是从分析和探索数据集开始,即从探索式数据分析(Exploratory Data Analysis, EDA)开始。除了生成尽可能多的数据见解和信息,它还用于查找数据集中可能存在的任何问题。在分析用于分类的数据集时,类别不平衡是常见问题之一。

什么是数据不平衡(类别不平衡)?

数据不平衡通常反映了数据集中类别的不均匀分布。例如,在信用卡欺诈检测数据集中,大多数信用卡交易类型都不是欺诈,仅有很少一部分类型是欺诈交易,如此以来,非欺诈交易和欺诈交易之间的比率达到50:1。本文中,我将使用来自Kaggle的信用卡欺诈交易数据数据集,你可以从这里下载。

这里

https://www.kaggle.com/mlg-ulb/creditcardfraud

首先,我们先绘制类分布图,查看不平衡情况。

image.png
image.png

如你所见,非欺诈交易类型数据数量远远超过欺诈交易类型。如果我们在不解决这个类别不平衡问题的情况下训练了一个二分类模型,那么这个模型完全是有偏差的,稍后我还会向你演示它影响特征相关性的过程并解释其中的原因。

现在,我们来介绍一些解决类别不平衡问题的技巧。

一、 重采样(过采样和欠采样)

image.png

这听起来很直接。欠采样就是一个随机删除一部分多数类(数量多的类型)数据的过程,这样可以使多数类数据数量可以和少数类(数量少的类型)相匹配。一个简单实现代码如下:

# Shuffle the Dataset.

shuffled_df = credit_df.sample(frac=1,random_state=4)

 

# Put all the fraud class in a separate dataset.

fraud_df = shuffled_df.loc[shuffled_df['Class'] == 1]



#Randomly select 492 observations from the non-fraud (majority class)

non_fraud_df=shuffled_df.loc[shuffled_df['Class']== 0].sample(n=492,random_state=42)



# Concatenate both dataframes again

normalized_df = pd.concat([fraud_df, non_fraud_df])



#plot the dataset after the undersampling

plt.figure(figsize=(8, 8))

sns.countplot('Class', data=normalized_df)

plt.title('Balanced Classes')

plt.show()

对多数类进行欠采样

对数据集进行欠采样之后,我重新画出了类型分布图(如下),可见两个类型的数量相等。

image.png

平衡数据集(欠采样)

第二种重采样技术叫过采样,这个过程比欠采样复杂一点。它是一个生成合成数据的过程,试图学习少数类样本特征随机地生成新的少数类样本数据。对于典型的分类问题,有许多方法对数据集进行过采样,最常见的技术是SMOTE(Synthetic Minority Over-sampling Technique,合成少数类过采样技术)。简单地说,就是在少数类数据点的特征空间里,根据随机选择的一个K最近邻样本随机地合成新样本。

image.png

来源

为了用python编码,我调用了imbalanced-learn 库(或imblearn),实现SMOTE的代码如下:

imbalanced-learn

https://imbalanced-learn.readthedocs.io/en/stable/index.html

from imblearn.over_sampling import SMOTE



# Resample the minority class. You can change the strategy to 'auto' if you are not sure.

sm = SMOTE(sampling_strategy='minority', random_state=7)



# Fit the model to generate the data.

oversampled_trainX,oversampled_trainY=sm.fit_sample(credit_df.drop('Class', axis=1), credit_df['Class'])

oversampled_train=pd.concat([pd.DataFrame(oversampled_trainY), pd.DataFrame(oversampled_trainX)], axis=1)

oversampled_train.columns = normalized_df.columns

还记得我说过不平衡的数据会影响特征相关性吗?让我向您展示处理不平衡类问题前后的特征相关性。

重采样之前:

下面的代码用来绘制所有特征之间的相关矩阵:


# Sample figsize in inches

fig, ax = plt.subplots(figsize=(20,10))         

# Imbalanced DataFrame Correlation

corr = credit_df.corr()

sns.heatmap(corr, cmap='YlGnBu', annot_kws={'size':30}, ax=ax)

ax.set_title("Imbalanced Correlation Matrix", fontsize=14)

plt.show()

image.png

重采样之后:

image.png

请注意,现在特征相关性更明显了。在解决不平衡问题之前,大多数特征并没有显示出相关性,这肯定会影响模型的性能。除了会关系到整个模型的性能,特征性相关性还会影响ML模型的性能,因此修复类别不平衡问题非常重要。

会关系到整个模型的性能

二、 集成方法(采样器集成)

在机器学习中,集成方法会使用多种学习算法和技术,以获得比单独使用其中一个算法更好的性能(是的,就像一个民主投票系统)。当使用集合分类器时,bagging方法变得流行起来,它通过构建多个分类器在随机选择的不同数据集上进行训练。在scikit-learn库中,有一个名叫“BaggingClassifier”的集成分类器,然而这个分类器不能训练不平衡数据集。当训练不平衡数据集时,这个分类器将会偏向多数类,从而创建一个有偏差的模型。

为了解决这个问题,我们可以使用imblearn库中的BalancedBaggingClassifier。它允许在训练集成分类器中每个子分类器之前对每个子数据集进行重采样。

BalancedBaggingClassifier

https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=10&isMul=1&isNew=1&lang=zh_CN&token=89565677#imblearn.ensemble.BalancedBaggingClassifier



因此,BalancedBaggingClassifier除了需要和Scikit Learn BaggingClassifier相同的参数以外,还需要2个参数sampling_strategy和replacement来控制随机采样器的执行。下面是具体的执行代码:



from imblearn.ensemble import BalancedBaggingClassifier

from sklearn.tree import DecisionTreeClassifier

 

#Create an object of the classifier.

bbc = BalancedBaggingClassifier(base_estimator=DecisionTreeClassifier(),

                                sampling_strategy='auto',

                                replacement=False,

                                random_state=0)

 

y_train = credit_df['Class']

X_train = credit_df.drop(['Class'], axis=1, inplace=False)

 

#Train the classifier.

bbc.fit(X_train, y_train)

preds = bbc.predict(X_train)

使用集合采样器训练不平衡数据集

这样,您就可以训练一个分类器来处理类别不平衡问题,而不必在训练前手动进行欠采样或过采样。

总之,每个人都应该知道,建立在不平衡数据集上的ML模型会难以准确预测稀有点和少数点,整体性能会受到限制。因此,识别和解决这些点的不平衡对生成模型的质量和性能是至关重要的。

原文标题:

How to fix an Unbalanced Dataset

编辑:王菁

校对:龚力

译者简介

张玲,在岗数据分析师,计算机硕士毕业。从事数据工作,需要重塑自我的勇气,也需要终生学习的毅力。但我依旧热爱它的严谨,痴迷它的艺术。数据海洋一望无境,数据工作充满挑战。感谢数据派THU提供如此专业的平台,希望在这里能和最专业的你们共同进步!

翻译组招募信息

工作内容:将选取好的外文前沿文章准确地翻译成流畅的中文。如果你是数据科学/统计学/计算机专业的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友,数据派翻译组欢迎你们加入!

你能得到:提高对于数据科学前沿的认知,提高对外文新闻来源渠道的认知,海外的朋友可以和国内技术应用发展保持联系,数据派团队产学研的背景为志愿者带来好的发展机遇。

其他福利:和来自于名企的数据科学工作者,北大清华以及海外等名校学生共同合作、交流。

目录
相关文章
|
6月前
|
机器学习/深度学习 Python
拯救数据不平衡:imbalanced-learn库详解
当你的数据像翘翘板一样严重倾斜时,该如何挽救你的机器学习模型?本文详解imbalanced-learn库的四大绝招,帮你轻松应对数据不平衡问题,提升模型性能。
|
机器学习/深度学习 算法 数据挖掘
实战Scikit-Learn:处理不平衡数据集的策略
【4月更文挑战第17天】本文探讨了Scikit-Learn处理不平衡数据集的策略,包括重采样(过采样少数类如SMOTE,欠采样多数类如RandomUnderSampler)、修改损失函数(如加权损失函数)、使用集成学习(如随机森林、AdaBoost)以及选择合适的评估指标(精确率、召回率、F1分数)。这些方法有助于提升模型对少数类的预测性能和泛化能力。
1145 1
|
机器学习/深度学习 PyTorch 算法框架/工具
数据平衡与采样:使用 DataLoader 解决类别不平衡问题
【8月更文第29天】在机器学习项目中,类别不平衡问题非常常见,特别是在二分类或多分类任务中。当数据集中某个类别的样本远少于其他类别时,模型可能会偏向于预测样本数较多的类别,导致少数类别的预测性能较差。为了解决这个问题,可以采用不同的策略来平衡数据集,包括过采样(oversampling)、欠采样(undersampling)以及合成样本生成等方法。本文将介绍如何利用 PyTorch 的 `DataLoader` 来处理类别不平衡问题,并给出具体的代码示例。
2770 2
|
11月前
|
API C语言 开发者
AscendC从入门到精通系列(五)调用基于工程开发AscendC算子
单算子API调用方式是通过C语言API直接调用已编译的自定义算子。首先,需基于AscendC算子工程完成算子的定义与实现,并通过编译脚本部署。编译后,生成的头文件和动态库支持在应用程序中直接调用算子,包括初始化AscendCL、申请资源、数据传输、计算workspace、执行算子、同步等待及资源释放等步骤。编译算子调用程序时,需正确配置CMakeLists.txt,确保头文件和动态库的路径正确。
|
存储 人工智能 移动开发
HTML5 游戏开发实战 | 五子棋
五子棋是一种家喻户晓的棋类游戏,它的多变吸引了无数的玩家。本章首先实现单机五子棋游戏(两人轮流下),而后改进为人机对战版。整个游戏棋盘格数为 15×15,单击鼠标落子,黑子先落。在每次下棋子前,程序先判断该处有无棋子,有则不能落子,超出边界不能落子。任何一方有横向、竖向、斜向、反斜向连到 5 个棋子则胜利。
23957 8
HTML5 游戏开发实战 | 五子棋
|
SQL 分布式计算 大数据
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(一)
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(一)
195 0
|
网络协议 Shell Linux
debian11安装配置记录
debian11安装配置记录
439 0
|
机器学习/深度学习 数据采集 人工智能
ERP系统中的人工智能与机器学习应用:提升企业智能化管理
【7月更文挑战第29天】 ERP系统中的人工智能与机器学习应用:提升企业智能化管理
1843 0
|
Java 测试技术 Maven
在Java项目中集成单元测试与覆盖率工具
在Java项目中集成单元测试与覆盖率工具
|
机器学习/深度学习 数据可视化 算法
R语言聚类分析、因子分析、主成分分析PCA农村农业相关经济指标数据可视化|数据分享
R语言聚类分析、因子分析、主成分分析PCA农村农业相关经济指标数据可视化|数据分享