⼀⽂教你如何处理不平衡数据集(附代码)
作者 | Will Badr
译者 | 张玲
编辑 | 吴⾦迪
出品 | 数据派THU(ID:DatapiTHU)
本⽂⽤python代码⽰例解释了3种处理不平衡数据集的可选⽅法,包括数据层⾯上的2种重采样数据集⽅法和算法层⾯上的1个集成分类器⽅法。
分类是机器学习最常见的问题之⼀,处理它的最佳⽅法是从分析和探索数据集开始,即从探索式数据分析(Exploratory Data Analysis, EDA)开始。除了⽣成尽可能多的数据见解和信息,它还⽤于查找数据集中可能存在的任何问题。在分析⽤于分类的数据集时,类别不平衡是常见问题之⼀。
跑得快技巧什么是数据不平衡(类别不平衡)?
数据不平衡通常反映了数据集中类别的不均匀分布。例如,在信⽤卡欺诈检测数据集中,⼤多数信⽤卡交易类型都不是欺诈,仅有很少⼀部分类型是欺诈交易,如此以来,⾮欺诈交易和欺诈交易之间的⽐率达到50:1。本⽂中,我将使⽤来⾃Kaggle的信⽤卡欺诈交易数据数据集,你可以从这⾥下载。
这⾥
/mlg-ulb/creditcardfraud
⾸先,我们先绘制类分布图,查看不平衡情况。
如你所见,⾮欺诈交易类型数据数量远远超过欺诈交易类型。如果我们在不解决这个类别不平衡问题的情况下训练了⼀个⼆分类模型,那么这个模型完全是有偏差的,稍后我还会向你演⽰它影响特征相关性的过程并解释其中的原因。
现在,我们来介绍⼀些解决类别不平衡问题的技巧,你可以在这⾥找到完整代码的notebook。
这⾥
⼀、 重采样(过采样和⽋采样)
这听起来很直接。⽋采样就是⼀个随机删除⼀部分多数类(数量多的类型)数据的过程,这样可以使多数类数据数量可以和少数类(数量少的类型)相匹配。⼀个简单实现代码如下:
# Shuffle the Datat.
中国风音乐
shuffled_df = credit_df.sample(frac=1,random_state=4)diy贺卡
乐的四字成语
# Put all the fraud class in a parate datat.
fraud_df = shuffled_df.loc[shuffled_df['Class'] == 1]
#Randomly lect 492 obrvations from the non-fraud (majority class)
non_fraud_df=shuffled_df.loc[shuffled_df['Class']== 0].sample(n=492,random_state=42)biye
# Concatenate both dataframes again
normalized_df = pd.concat([fraud_df, non_fraud_df])
伊留申设计局#plot the datat after the undersampling
plt.figure(figsize=(8, 8))
plt.title('Balanced Class')
缚的读音plt.show()
对多数类进⾏⽋采样
wps全选对数据集进⾏⽋采样之后,我重新画出了类型分布图(如下),可见两个类型的数量相等。
平衡数据集(⽋采样)
第⼆种重采样技术叫过采样,这个过程⽐⽋采样复杂⼀点。它是⼀个⽣成合成数据的过程,试图学习少数类样本特征随机地⽣成新的少数类样本数据。对于典型的分类问题,有许多⽅法对数据集进⾏过采样,最常见的技术是SMOTE(Synthetic Minority Over-sampling Technique,合成少数类过采样技术)。简单地说,就是在少数类数据点的特征空间⾥,根据随机选择的⼀个K最近邻样本随机地合成新样本。
来源
为了⽤python编码,我调⽤了imbalanced-learn 库(或imblearn),实现SMOTE的代码如下:imbalanced-learn
from imblearn.over_sampling import SMOTE
# Resample the minority class. You can change the strategy to 'auto' if you are not sure.