- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想用 2 个类进行分类。当我在没有 SMOTE 的情况下进行分类时我得到(10 次交叉验证的平均值):
Precision Recall f-1
0,640950987 0,815410434 0,714925374
当我使用 smote 时:(以 200% 和 k = 5 对少数类进行过采样)(还有 10 个交叉验证,这意味着我的测试和训练集中有合成数据。
Precision Recall f-1
0,831024643 0,783434343 0,804894232
如您所见,效果很好。
但是,当我在验证数据(没有任何合成数据,也没有用于构建合成数据点)上测试这个经过训练的模型时
Precision Recall f-1
0,644335755 0,799044453 0,709791138
这太糟糕了。我使用随机决策森林进行分类。
有没有人知道为什么会发生这种情况以及解决此问题的解决方案?也欢迎任何关于我可以尝试获得更多见解的额外测试的有用提示。
更多信息:我不接触多数类(Class)。我在 Python 中使用 scikit-learn 和 this algorithm 工作对于 SMOTE。
测试数据(具有合成数据)的混淆矩阵:
验证集中的混淆矩阵(没有得到任何合成数据,也没有被用作创建合成数据的基础):
编辑: 我读到问题可能在于创建了 Tomek 链接。因此I wrote some code to remove the Tomek links .尽管这不会提高分类分数。
Edit2: 我读到问题可能在于重叠太多。对此的解决方案是更智能的合成样本生成算法。因此我实现了
ADASYN: Adaptive Synthetic Sampling Approach for Imbalanced Learning
.我的实现可以找到here .它的表现比 smote 差。
最佳答案
重叠可能是原因。如果给定您拥有的变量,类之间存在重叠,则 SMOTE 将生成影响可分离性的合成点。正如您所指出的,可以生成 Tomek 链接以及其他损害分类的点。我建议您尝试 SMOTE 的其他变体,例如 Safe-SMOTE 或 Bordeline-SMOTE。您可以在以下位置找到他们的描述:
http://link.springer.com/chapter/10.1007/11538059_91
http://link.springer.com/chapter/10.1007/978-3-642-01307-2_43
关于python - 使用 SMOTE 时验证集性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17088051/
在imblearn , smote.fit_sample() 和 smote.fit_resample() 之间有什么区别,我们什么时候应该使用一个而不是另一个? 最佳答案 fit_sample 替换
鉴于我有一个类不平衡问题,我正在应用 SMOTE(DMwR 包)。但是,我有三个类(class)结果而不是两个。 该函数正确地对少数类进行了过采样,但我没有遵循多数/中间类的行为(即,所有类别都包含不
我刚刚使用 DMwR 包中包含的 Smote 在数据集中完成了过采样。 我的数据集由两个类组成。原始分布是 12 vs 62。因此,我编写了此过采样代码: newData <- SMOTE(Score
我刚刚使用 DMwR 包中包含的 Smote 在数据集中完成了过采样。 我的数据集由两个类组成。原始分布是 12 vs 62。因此,我编写了此过采样代码: newData <- SMOTE(Score
我正在使用 SMOTE 函数对稀疏数据集进行过采样,其中包含大约 98% 的 0 和 2% 的 1。我使用了以下代码 from imblearn.over_sampling import SMOTE
我正在尝试在 Python 中使用 imblearn 包中的 SMOTE,但我的数据有很多缺失值,并且出现以下错误: ValueError: Input contains NaN, infinity
我有一个不平衡的数据集,其中包含一个分类因变量和连续且分类的特征变量。我知道 DMwR 包中的 SMOTE 函数只能处理连续的特征。是否有可以像 Chawla 描述的那样处理分类和连续特征的包 in
我想我在下面的代码中遗漏了一些东西。 from sklearn.model_selection import train_test_split from imblearn.over_sampling
我正在尝试使用 SMOTE 来处理二进制分类中的不平衡类数据,我所知道的是:如果我们使用,例如 sm = SMOTE(ratio = 1.0, random_state=10) Before Over
我正在做文本分类,并且我有非常不平衡的数据,例如 Category | Total Records Cate1 | 950 Cate2 | 40 Cate3 | 10 现在我想对
我正在 Weka 中研究一个二元分类问题,数据集高度不平衡(一个类别 90%,另一个类别 10%)。我首先将 SMOTE ( http://www.cs.cmu.edu/afs/cs/project/
我正在尝试使用带有 SMOTE 的 FilteredClassifier 在 WEKA 上运行 5 倍交叉验证。 据我所知,我应该在每个 CV 折叠中应用 SMOTE 以获得我的 CV 错误。 有谁有
我有一个多类数据集,我想对其使用 SMOTE,但我面临着 ValueError: "sampling_strategy" can be a float only when the type oftar
我想用 2 个类进行分类。当我在没有 SMOTE 的情况下进行分类时我得到(10 次交叉验证的平均值): Precision Recall f-1 0,6409509
我有一个包含大约 130000 条记录的数据集。记录分为两类目标变量,0和1。1只占总比例的0.09%。 我在 Windows 10 上的 R-3.5.1 中运行我的分析。我使用 SMOTE 算法来处
我正在尝试按如下方式实现逻辑回归: 但是我无法得到好的预测,因为我的类输出 1 在我的数据中代表性不足。因此,我正在尝试将 SMOTE 算法应用于我的训练集以获得更好的结果。但是我收到消息错误: Er
我正在使用 Keras 和 Bert (HuggingFace) 构建多类文本分类模型,但我的数据集非常不平衡。我使用了 Sklearn 的 SMOTE 来为欠平衡类生成额外的样本(我总共有 45 个
我想同时应用交叉验证和过采样。 我从这段代码中得到以下错误: from sklearn.pipeline import Pipeline, make_pipeline imba_pipeline =
我需要将 smote-algorithm 应用到数据集,但无法让它工作。 示例: x <- c(12,13,14,16,20,25,30,50,75,71) y <- c(0,0,1,1,1,1,1,
我有一个不平衡的数据集,当我尝试使用 SMOTEENN 来平衡他时,多数类的数量减少了一半 我尝试使用提供的所有选项更改“sampling_strategy”参数,但没有帮助 from imblear
我是一名优秀的程序员,十分优秀!