分类数据不均衡的简单处理
下采样
随机选择类别较多的数据与类别较少的数据一致。
# X特征,y类别
X = data.ix[:, data.columns != 'Class']
y = data.ix[:, data.columns == 'Class']
# 小类别数据个数
number_records_fraud = len(data[data.Class == 1])
# 小类别数据索引
fraud_indices = np.array(data[data.Class == 1].index)
# 大类别数据索引
normal_indices = data[data.Class == 0].index
# 从大类别索引中随机选择,个数与小类别数据个数相同
random_normal_indices = np.random.choice(normal_indices, number_records_fraud, replace = False)
random_normal_indices = np.array(random_normal_indices)
# 合并小类别索引与下采样的大类别索引
under_sample_indices = np.concatenate([fraud_indices,random_normal_indices])
# 根据索引取数据
under_sample_data = data.iloc[under_sample_indices,:]
# 取出特征与类别
X_undersample = under_sample_data.ix[:, under_sample_data.columns != 'Class']
y_undersample = under_sample_data.ix[:, under_sample_data.columns == 'Class']
下采样会丢失信息,如何减少信息的损失呢?
- 第一种方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。
- 第二种方法叫做BalanceCascade,利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。
- 第三种方法是利用KNN试图挑选那些最具代表性的大众样本,叫做NearMiss。
过采样
SMOTE
利用小众样本在特征空间的相似性来生成新样本。对于小众样本xi∈Smin,从它属于小众类的K近邻中随机选取一个样本点xi,生成一个新的小众样本xnew:xnew=xi+(x^−xi)×δ,其中δ∈[0,1]是随机数。
# imbalance-learn
from imblearn.over_sampling import SMOTE
features_train, features_test, labels_train, labels_test = train_test_split(features,
labels,
test_size=0.2,
random_state=0)
oversampler=SMOTE(random_state=0)
os_features,os_labels=oversampler.fit_sample(features_train,labels_train)
SMOTE为每个小众样本合成相同数量的新样本,这带来一些潜在的问题:一方面是增加了类之间重叠的可能性,另一方面是生成一些没有提供有益信息的样本。为了解决这个问题,出现两种方法:Borderline-SMOTE与ADASYN。
评价标准的选择
-
混淆矩阵:将要预测的数据分到表里来显示正确的预测,并了解其不正确的预测类型。
-
精度:(准确率/命中率)一种分类准确性的处理法。精度是一个不适用于不平衡的数据集的绩效指标。
-
召回率:又称“查全率”,一种分类完整性的处理方法。
-
F1分数(F-score):精度和召回率的加权平均。
-
kappa(Cohen’s kappa):根据数据集合中数据的不平衡点来标准化分类精度。
-
ROC曲线:类似于精度和召回率,准确性被分为敏感性和特异性,并且可以基于这些值的平衡阈值来进行选择。