除了随机过采样,SMOTE及其变体之外,还有许多方法可以对不平衡数据进行过采样。 在使用scikit-learn的make_classification默认设置生成的分类数据集中,使用交叉操作生成的样本在最相关的指标上胜过SMOTE和随机过采样。
本篇文章的目录如下
- 介绍
- 数据准备
- 随机过采样和SMOTE
- 交叉过采样
- 绩效指标评估
- 结论
介绍
我们中的许多人都会遇到处于使用不平衡数据集的预测模型的情况。
最流行的处理失衡的方法包括:
- 增加未被充分标记的的分类的权重
- 过采样技术
- 欠采样技术
- 过度采样和欠采样的组合
- 调整成本函数
这篇文章将讨论过采样技术,我们将特别研究依赖于在特征空间内插值的SMOTE变体(borderline SMOTE, ADASYN等)如何生成较少的新合成数据。
过度抽样的方法太多了。我们使用简单的单点、两点和均匀交叉操作对合成数据进行过采样,并将评价结果与随机过采样进行比较。一般情况下,将过采样和欠采样结合使用会更好,但是在本演示中,我们为了说明只使用过采样。
数据集准备
我们使用scikit-learn的make_classification函数来创建一个不平衡的数据集,该数据集包含两个类别中的5000个数据点(二进制分类)。目标为0的机会为95%,目标为1的机会为5%。
fromsklearn.datasetsimportmake_classificationimportseabornassnsX, y=make_classification( n_samples=5000, n_classes=2, weights=[0.95, 0.05], flip_y=0) sns.countplot(y) plt.show()
默认情况下,会创建20个特征,下面是X数组中的示例条目。
make_classification中的其余设置为默认设置,下面我们将数据分为训练和测试数据集。
fromsklearn.model_selectionimporttrain_test_splitX_train, X_test, y_train, y_test=train_test_split(X, y)
随机和SMOTE过采样
现在,让我们准备函数以生成数据集,其中可以使用随机过采样和SMOTE对少数类(目标= 1)进行过采样。
fromimblearn.over_samplingimportSMOTE, RandomOverSamplerdefoversample_random(X, y, rows_1, random_state): '''Accepts X and y arrays along with the number ofrequired positively labeled samples (rows_1). Returnsrandomly oversampled positively labeled data.'''X_random, y_random=RandomOverSampler( sampling_strategy={1: rows_1}, random_state=random_state ).fit_resample(X_train, y_train) returnX_random, y_randomdefoversample_smote(X, y, rows_1, k_neighbors, random_state): '''Accepts X and y arrays along with the number ofrequired positively labeled samples (rows_1) and numberof nearest neighbors to consider in the SMOTE algorithm.Returns SMOTE oversampled positively labeled data.'''X_smote, y_smote=SMOTE( sampling_strategy={1: rows_1}, k_neighbors=k_neighbors, random_state=random_state ).fit_resample(X, y) returnX_smote, y_smote
请注意,为了方便进行比较我们使用普通的SMOTE而不是边界SMOTE,ADASYN,SVM-SMOTE等。在下一部分中使用交叉操作生成样本时,我们不会考虑是在边界附近生成样本还是被认为有噪声等。
如果您不熟悉随机过采样和SMOTE,则在网上有很多资源,但是这里有个简短的回顾:
随机过采样涉及从我们尝试过采样的少数类中随机选择数据点,然后将它们作为重复项再次添加回数据集。
随机过采样的插图,较大的气泡代表随机选择用于过采样的数据点,它们在数据集中显示为重复项
SMOTE涉及从少数类中查看样本的最近邻居,并在该样本与从其最近邻居中随机选择的另一个样本之间插入特征值。
SMOTE,红色数据点是插值后综合生成的数据
交叉算子
交叉运算在遗传算法中被广泛使用,它是由有性生殖中发生的遗传物质的交叉驱动的。
该操作相对简单,其中“染色体”中的信息由两个“父母”贡献以生成“孩子”。在我们的用例中,染色体中的信息仅是特征值。
通常以位阵列表示信息以获得更好的性能。
例如:在我们的数据集中,我们有20个特征和5000个样本。在单点交叉操作中,我们可以选择两个“父级”,例如样本#20和样本#1500,并选择一个随机的交叉点,例如第十特征。然后,我们生成一个新的“子级”,即新数据点,该新数据点的第一个父级(样本#20)具有特征1–9,第二个父级(样本#1500)具有特征10–20。
我们将考虑3种交叉操作:
- single-point 单点
- two-point 两点
- uniform 均匀
单点交叉操作是上面所示的示例,其中交叉点之前的要素由一个父级提供,而交叉点之后的要素由另一父级提供。
在两点交叉操作中,父级1贡献第一个交叉点之前的子数据点的特征值,然后父级2贡献其特征值直到第二个交叉点,然后贡献在第二个交叉点之后返回父级1。
通过均匀交叉操作,两个父级中的任何一个都可以为20个要素中的任何一个对子数据点的要素值做出贡献。
下面是我们用来生成交叉样本的函数。还有一个附加参数knn,它过滤掉所有生成的样本,这些样本的最近邻居的目标是0而不是1。默认情况下,此选项设置为False。