Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

吴金迪校对张玲翻译

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

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

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

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

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

这里

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

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

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

现在,我们来介绍一些解决类别不平衡问题的技巧,你可以在这里找到完整代码的notebook。

这里

https://github.com/wmlba/innovate2019/blob/master/Credit_Card_Fraud_Detection.ipynb

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

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

# 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()

对多数类进行欠采样

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

平衡数据集(欠采样

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

来源

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

为了用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()

重采样之后:

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

会关系到整个模型的性能

https://towardsdatascience.com/why-feature-correlation-matters-a-lot-847e8ba439c4

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

机器学习中,集成方法会使用多种学习算法和技术,以获得比单独使用其中一个算法更好的性能(是的,就像一个民主投票系统)。当使用集合分类器时,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

原文链接:

https://www.kdnuggets.com/2019/05/fix-unbalanced-dataset.html

THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

工程Python数据集重采样过采样/欠采样
141
相关数据
重采样技术

重采样是指根据一类象元的信息内插出另一类象元信息的过程。在遥感中,重采样是从高分辨率遥感影像中提取出低分辨率影像的过程。常用的重采样方法有最邻近内插法(nearest neighbor interpolation)、双线性内插法(bilinear interpolation)和三次卷积法内插(cubic convolution interpolation)。

数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

欠采样技术

欠采样是信号处理学中的一种采样技术,也叫带通采样(bandpass sampling),是一种以低于其奈奎斯特采样定理(采样频率两倍高于被采样频率)的采样率对带通滤波信号进行采样且仍然能够重建信号的技术。

集成方法技术

在统计学和机器学习中,集成方法使用多种学习算法来获得比单独使用任何组成学习算法更好的预测性能。

分类问题技术

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

生成模型技术

在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。 它给观测值和标注数据序列指定一个联合概率分布。 在机器学习中,生成模型可以用来直接对数据建模(例如根据某个变量的概率密度函数进行数据采样),也可以用来建立变量间的条件概率分布。

您好,代码的链接失效了,可以再更新一下吗?谢谢!