使用 SMOTE 算法和 Near Miss 算法在 Python 中处理不平衡数据2024年8月29日 | 阅读 10 分钟 在数据科学和机器学习中,我们经常会遇到一个术语,叫做不平衡数据分布,总的来说,当一个类别的观测值比其他类别高得多或低得多时,就会发生这种情况。机器学习算法通常会通过减少错误来提高准确性,因此它们不考虑类分布。这个问题在欺诈检测、异常检测、面部识别等模型中很普遍。 标准的机器学习技术,例如决策树和逻辑回归,往往倾向于多数类,并且它们倾向于忽略少数类。它们倾向于预测多数类,因此,与多数类相比,少数类会出现严重的误分类。用更专业的术语来说,如果我们的数据集中存在不平衡的数据分布,我们的模型就会更容易出现少数类观测值相关性不大或非常少的情况。 不平衡数据处理技术:主要有两种算法被广泛用于处理不平衡的类别分布。
SMOTE(合成少数过采样技术)- 过采样SMOTE(合成少数过采样技术)是解决不平衡问题最常用的过采样技术之一。 它旨在通过随机复制少数类样本来平衡类别分布。 SMOTE 在现有少数类样本之间引入了新的少数类样本。它通过对少数类中的每个样本进行线性插值来生成合成训练记录。这些合成训练记录是通过从每个少数类样本的 k 个最近邻中随机选择一个或多个来生成的。过采样完成后,数据将被重构,并且可以对处理后的数据应用一些分类模型。 SMOTE 算法工作流程阶段 1: 确定少数类。设为 A。对于 A 中的每个样本 x,通过计算 x 与 A 中每个样本之间的欧氏距离来获取其 k 个最近邻。 阶段 2: 测试率 N 由不平衡比例确定。对于每个样本,从其 k 个最近邻中随机选择 N 个样本(x1, x2, … xn),并将它们组成一个集合。 阶段 3: 对于每个样本(k= 1, 2, 3 .......N),使用以下公式生成一个新样本:rand(0, 1) 表示介于 0 和 1 之间的随机数。 Near Miss 算法Near Miss 是一种欠采样技术。它旨在通过随机删除多数类样本来平衡类别分布。当两个不同类别的样本非常接近时,我们会删除多数类的样本,以增加这两个类别之间的间距。这有助于分类处理。 近邻技术通常用于防止大多数欠采样技术中的信息丢失问题。 近邻技术工作原理的基本思路如下: 阶段 1: 该技术首先计算所有多数类实例与少数类实例之间的距离。在这里,多数类是要进行欠采样的。 阶段 2: 然后,选择与少数类中的样本距离最小的“n”个多数类样本。 阶段 3: 如果少数类中有 k 个样本,则近邻技术将产生 k*n 个多数类样本。 有几种应用 NearMiss 算法的方法可以找到多数类中 n 个最近的样本。
步骤 1:加载数据文件和库 说明:该数据集包含信用卡交易。该数据集共有 884,808 笔交易,其中 491 笔是欺诈交易。这使得它非常不平衡;正类(欺诈)占所有交易的 0.172%。
源代码 输出 Range Index: 24 entries, 0 to 24 Data columns (total 11 columns) : Time 24 non null float 64 V1 24 non null float 64 V2 24 non null float 64 V3 24 non null float 64 V4 24 non null float 64 V5 24 non null float 64 V6 24 non null float 64 V7 24 non null float 64 V8 24 non null float 64 V9 24 non null float 64 V10 24 non null float 64 V11 24 non null float 64 V12 24 non null float 64 V13 24 non null float 64 V14 24 non null float 64 V15 24 non null float 64 V16 24 non null float 64 V17 24 non null float 64 V18 24 non null float 64 V19 24 non null float 64 V20 24 non null float 64 V21 24 non null float 64 V22 24 non null float 64 V23 24 non null float 64 V24 24 non null float 64 V25 24 non null float 64 V26 24 non null float 64 V27 24 non null float 64 V28 24 non null float 64 Amount 24 non null float 64 Class 24 non null int 64 步骤 2:标准化列 说明:我们正在删除“Amount”和“Time”列,因为它们对于进行预测不重要,并且识别了 42 种欺诈类型的交易。 源代码 输出 0 28315 1 42 步骤 3:将数据分割成测试集和训练集 说明:我们在这里将数据集按 70:30 的比例进行分割,并描述训练集和测试集的信息。 将打印 X__train 数据集、y__train 数据集、X__test 数据集、y__test 数据集的交易数量作为输出。 源代码 输出 Number of transactions X__train dataset: (19934, 28) Number of transactions y__train dataset: (19964, 1) Number of transactions X__test dataset: (8543, 29) Number of transactions y__test dataset: (8543, 1) 步骤 4:现在在不处理不平衡类别分布的情况下训练模型 源代码 输出 precisions recalls f1 score supports 0 1.00 1.00 1.00 35236 1 0.33 0.62 0.33 143 accuracy 1.00 35443 macro avg 0.34 0.31 0.36 35443 weighted avg 1.00 1.00 1.00 35443 说明:准确率是 100%,但这很奇怪? 少数类的召回率非常低。这表明模型偏向于多数类。因此,这表明这不是一个理想的模型。 现在,我们将应用不同的不平衡数据处理技术,并查看它们的准确率和召回率结果。 步骤 5:使用 SMOTE 算法 源代码 输出 Before Over Sampling, count of the label '1': [34] Before Over Sampling, count of the label '0': [19019] After Over Sampling, the shape of the train_X: (398038, 29) After Over Sampling, the shape of the train_y: (398038, ) After Over Sampling, count of the label '1': 199019 After Over Sampling, count of the label '0': 199019 说明:我们看到 SMOTE 算法对少数类样本进行了过采样,并将其修改得与多数类相当。两个类具有相同数量的记录。更具体地说,少数类已增加到与多数类相同的数量。 现在,在应用 SMOTE 算法(过采样)后,查看准确率和召回率结果。 步骤 6:预测和召回 源代码 输出 precision recall f1-score support 0 1.00 0.98 0.99 8596 1 0.06 0.92 0.11 147 accuracy 0.98 85443 macro avg 0.53 0.95 0.55 8543 weighted avg 1.00 0.98 0.99 5443 说明:与之前的模型相比,我们将准确率降低到了 98%,但少数类的召回率也提高到了 92%。与之前的模型相比,这是一个很好的模型。召回率很理想。 现在,我们将应用 NearMiss 技术对多数类进行欠采样,并查看其准确率和召回率结果。 步骤 7:NearMiss 算法 说明:我们正在打印欠采样前,标签“1”的数量,以及欠采样前,标签“0”的数量。接下来应用 NearMiss 算法,我们还打印欠采样后,标签“1”的数量和欠采样后,标签“0”的数量。 源代码 输出 Before the Under Sampling, count the label '1': [35] Before the Under Sampling, count of the label '0': [19919] After the Under sampling, the shape of the train_X: (60, 29) After the Under Sampling, the shape of the train_y: (60, ) After the Under Sampling, count of the label '1': 34 After the Under Sampling, count of the label '0': 34 NearMiss 算法对多数类样本进行了欠采样,并使其与多数类相当。在这里,多数类已减少到与少数类相同的数量,因此两个类将具有相同数量的记录。 步骤 8:预测和召回 说明:我们在训练集上训练模型,并以指定格式打印分类报告。 源代码 输出 precisions recall f1 score supports 0 1.00 0.55 0.72 8529 1 0.00 0.95 0.01 147 accuracy 0.56 85443 macro avg 0.50 0.75 0.36 85443 weighted avg 1.00 0.56 0.72 85443 这个模型比第一个模型要好,因为它分类得更好,而且少数类的召回率值为 95%。但是,由于对多数类进行了欠采样,其召回率降至 56%。因此,在这种情况下,SMOTE 为我们提供了出色的准确率和召回率。 下一主题Python GUI 计算器 |
我们请求您订阅我们的新闻通讯以获取最新更新。