大家好,欢迎来到IT知识分享网。
在实施分类算法时,数据类别的结构具有重要意义。具体来说,每个潜在输出的观察数量之间是否平衡会严重影响你的预测性能。
如下图所示:
如图,我们正在处理一个数据集,该数据集具有三个不同的类,我们正在尝试借助线性支持向量机算法进行预测。在左上图中,黄色类显然占据了其他类,而其他类的决策边界几乎无法识别。随着我们不断向未充分代表的类添加更多观察,决策边界发生了巨大变化。因此,当试图对少数群体进行预测时,我们需要找到避免被多数群体误导的方法。
安装imblearn
在开始使用不平衡数据之前,我们必须安装imblearn。一般来说,有两种方法可以在Python中安装软件包:通过pip install和conda install。或者,你也可以克隆GitHub存储库。
# installing imblearn using pippip install -U imbalanced-learn # installing imblearn using conda conda install -c conda-forge imbalanced-learn
数据
在安装了imblearn及其依赖项后,我们可以开始处理不平衡数据。本文将使用信用欺诈(Credit Fraud)数据集。
# installing imblearn using pip pip install -U imbalanced-learn # installing imblearn using conda conda install -c conda-forge imbalanced-learn
上面的代码将导致以下输出:
使用非公开的降维技术对V1到V28进行了匿名化。唯一命名的变量是交易时间,金额,以及表明交易是否具有欺诈性的变量(0:不欺诈,1:欺诈)。由于大多数交易都不是欺诈性的,我们正在处理严重不平衡的数据集。让我们假设不平衡,以了解使用imblearn的需要:
# taking a closer look at the class variable sns.countplot('Class', data = df) plt.title('No Fraud (0) vs. Fraud (1)')
上面的代码块将产生以下条形图:
正如预期的那样,绝大多数交易都不是欺诈性的。因此,构建可靠的分类器以用于平衡数据集上可能使用的技术,相同的技术来检测欺诈性事务,这肯定会导致非常糟糕的性能。
过采样
解决不平衡数据问题的一种常见方法是过采样。过采样是指旨在增加数据集中代表性不足的类的实例数的各种方法。在我们的案例中,这些技术将增加我们数据中的欺诈交易数量(通常为50:50)。你可能会问为什么一开始就会这样做,如果不平衡实例数,大多数分类算法将主要关注多数类。因此,看起来你的算法实现了很好的结果,而实际上,它总是在预测大多数。
随机朴素的过采样
最简单的方法是从少数类中随机选择观察并将它们添加到数据集中,直到我们在多数类和少数类之间取得平衡。由于这是相对简单的,因此不一定必须使用imblearn,而是可以使用NumPy随机选择观察。
在imblearn中,在将数据拆分为x(除了类之外的所有变量)和y(类)之后,我们会执行以下操作:
# imports from imblearn.over_sampling import RandomOverSampler # random oversampling ros = RandomOverSampler(random_state=0) X_resampled, y_resampled = ros.fit_resample(x, y) # using Counter to display results of naive oversampling from collections import Counter print(sorted(Counter(y_resampled).items()))
此代码块的结果具有等量的欺诈性和非欺诈性交易。更具体地说,y将有284,315个欺诈性和284,315个非欺诈性观察。现在,不使用原始的不平衡数据,而是使用这个增强数据集来训练分类算法。
随机朴素过采样的一个问题是它只是重复已有的数据。因此,虽然分类算法暴露于来自少数群体的更多观察,但他们不会更多地了解如何区分欺诈性和非欺诈性观察。与旧数据相比,新数据不包含有关欺诈性交易特征的更多信息。
合成少数过采样技术(SMOTE)
使用随机朴素过采样的更高级替代方法是合成少数过采样技术(SMOTE)。虽然SMOTE仍然对少数群体进行过度抽样,但它并不依赖于重复使用以前存在的观察结果。相反,SMOTE根据数据中的观察结果创建新的(合成)观测值。SMOTE是如何做到的?本文整理了一个虚构的数据集:
正如你所看到的,在这个虚构的数据集中,有比正方形更多的三角形。现在,为了训练更准确的分类器,我们想利用SMOTE对方块进行过采样。首先,SMOTE找到少数群体中每个成员的k个最近邻点。让我们想象一下这个正方形并假设k等于三:
在上面的数据集中,我们已经确定了橙色方块的三个最近邻点。现在,根据需要多少过采样,这些最近样点中的一个或多个将用于创建新的观测值。出于解释的目的,让我们假设我们将使用三个最近样点中的两个来创建新的观察。下一步也是最后一步是通过随机选择连接观测点与最近邻点的线上的点来创建新的观测值:
虚线表示橙色方块与其绿色最近邻点之间的连接。两个红色方块表示由SMOTE添加到数据集中的新观察结果。
与传统的随机朴素过采样相比,SMOTE的主要优势在于,通过创建合成观测而不是重复使用现有观测,你的分类器不太可能过拟合。同时,你应始终确保SMOTE创建的观察结果是切合实际的。SMOTE用于创建新观测的技术仅在合成观测是现实的并且可以在现实中观察时才有帮助。
在完成理论之后,是时候在imblearn中实现SMOTE了:
# importing SMOTE from imblearn.over_sampling import SMOTE # applying SMOTE to our data and checking the class counts X_resampled, y_resampled = SMOTE().fit_resample(x, y) print(sorted(Counter(y_resampled).items()))
运行上面的代码块将输出一个类计数,证明两个类中的观察量相等。
自适应合成(ADASYN)
Adaptive Synthetic(ADASYN)提供了使用SMOTE的替代方法。让我们一步一步地完成算法。
首先,ADASYN计算少数与多数观测的比率
接下来,ADASYN计算要生成的合成少数数据的总数:
这里,G是要生成的合成少数数据的总数,ß表示少数与多数观测的比率。因此,ß= 1意味着在使用ADASYN后两个类别中的观察数量相同。
第三,ADASYN为每个少数观测值找到k-最近邻居并计算r值:
rᵢ值衡量了邻近地区多数阶层的主导地位。rᵢ越高,大多数班级越占优势,邻点学习分类器越困难。让我们计算一些虚构的少数观察的rᵢ:
三个突出的少数观察者的五个最近邻点属于多数阶层。因此,该观察的r等于3/5。
在实际计算将要创建的合成观测数量之前,ADASYN将所有少数观测的r值标准化,使其总和为1。
接下来,ADASYN计算在每个邻域中生成的合成观测数:
由于Gᵢ是使用相应的rᵢ值计算的,因此ADASYN将在邻域中创建更多的综合观测值,其中多数与少数观测的比率更高。因此,分类器将有更多的观察结果可以在这些困难的领域中学习。
最后,ADASYN生成综合观测:
可以观察类似于SMOTE的邻点的线性组合来实现这一点,或者利用更先进的技术,例如在三个少数观察之间绘制平面并随机选择该平面上的点。
ADASYN的主要优势在于其适应性:通过将综合观测的数量基于多数观测与少数观测的比例,ADASYN更加重视数据中更具挑战性的区域。
与SMOTE一样,在讨论了理论之后,是时候查看代码了:
# importing ADASYN from imblearn.over_sampling import ADASYN # applying ADASYN X_resampled, y_resampled = ADASYN().fit_resample(x, y) print(sorted(Counter(y_resampled).items()))
正如你所看到的,imblearn的语法很容易记忆,并且类似于sklearn的语法。因此,如果你习惯于使用sklearn的语法,则不必花费太多精力将imblearn包含在你的机器学习工作流程中。
SMOTE扩展
与大多数算法一样,SMOTE有几种扩展。这些旨在通过增加SMOTE特征或减少其弱点来改善SMOTE。可以在imblearn中找到的SMOTE扩展示例包括:
- BorderlineSMOTE:BorderlineSMOTE不是在所有少数观测之间进行过采样,而是旨在增加与大多数观测相关的少数观测数量。这里的目标是允许分类器能够更清楚地区分这些边界观察。
- SVMSMOTE:顾名思义,SVMSMOTE利用支持向量机算法生成靠近多数类和少数类之间边界的新的少数观测。
以下是imblearn中BorderlineSMOTE的示例代码:
# BorderlineSMOTEfrom imblearn.over_sampling import BorderlineSMOTE X_resampled, y_resampled = BorderlineSMOTE().fit_resample(x, y)print(sorted(Counter(y_resampled).items()))
结论
处理不平衡的数据可能极具挑战性。然而,imblearn提供了一种巧妙的方法,将不平衡的技术融入sklearn的机器学习工作流程中。通过首先了解这些技术然后利用它们,不平衡的数据应该变得不那么令人生畏了。除了过度采样之外,还有其他几种攻击少数群体的方法,例如欠采样或两者的组合。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/76019.html