Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有不平衡二进制数据集的ML_Python_Scikit Learn_Dataset_Resampling_Oversampling - Fatal编程技术网

Python 具有不平衡二进制数据集的ML

Python 具有不平衡二进制数据集的ML,python,scikit-learn,dataset,resampling,oversampling,Python,Scikit Learn,Dataset,Resampling,Oversampling,我想解决一个问题: -具有2个类的不平衡数据集 -一个等级使另一个等级相形见绌(923对38) -f1\当数据集按原样用于训练和测试时,在0.6-0.65范围内的宏观分数 昨天在做这个课题的研究时,我自学了重采样,特别是SMOTE算法。它似乎对我的训练分数产生了奇迹般的效果,因为在用它们平衡数据集后,我的分数从~0.6上升到~0.97。我应用它的方式如下: 开始时,我已将测试集从其余数据中分离出来(占整个数据的10%) 我仅在列车组上应用了SMOTE(等级平衡618与618) 我在训练集上训练

我想解决一个问题: -具有2个类的不平衡数据集 -一个等级使另一个等级相形见绌(923对38) -f1\当数据集按原样用于训练和测试时,在0.6-0.65范围内的宏观分数

昨天在做这个课题的研究时,我自学了重采样,特别是SMOTE算法。它似乎对我的训练分数产生了奇迹般的效果,因为在用它们平衡数据集后,我的分数从~0.6上升到~0.97。我应用它的方式如下:

  • 开始时,我已将测试集从其余数据中分离出来(占整个数据的10%)

  • 我仅在列车组上应用了SMOTE(等级平衡618与618)

  • 我在训练集上训练了一个RandomForestClassifier,并实现了f1_macro=0.97

  • 使用测试集进行测试时,f1_宏观分数保持在~0.6-0.65范围内

我假设发生的是,测试集中的坚持数据包含观察值,这与火车集中少数族裔的预撞击观察值大不相同,火车集中少数族裔的预撞击观察值最终使模型能够很好地识别火车集中的案例,但却使模型与测试集中的这些异常值失去了平衡


处理这个问题的常用策略是什么?根据常识,我应该尝试捕获列车组中少数族裔的一个非常有代表性的样本,但我认为sklearn没有任何自动化工具允许这种情况发生?

您的假设是正确的。你的机器学习模型基本上过度拟合了你的训练数据,训练数据在一个类中重复了相同的模式,因此,模型学习了该模式,并忽略了测试数据中的其他模式。这意味着该模型在野外不会表现良好

如果SMOTE不起作用,您可以通过测试不同的机器学习模型进行实验。Random forest通常在这类数据集上表现良好,因此请尝试通过修剪或调整超参数来调整rf模型。另一种方法是在训练模型时指定类权重。您还可以尝试惩罚模型,当错误分类少数类时,该模型会增加额外的成本

您也可以尝试欠采样,因为您已经测试过过采样。但很可能你的欠采样也会遇到同样的问题。请尝试简单的过采样,而不是SMOTE,以查看结果如何变化


另一种更高级的方法是批处理。把你所有的少数派班级和同等数量的少数派班级的参赛作品都拿出来训练一个模特。在你的多数班的所有批次中继续这样做,最终你将拥有多个机器学习模型,然后你可以一起使用这些模型进行投票。

你的假设是正确的。你的机器学习模型基本上过度拟合了你的训练数据,训练数据在一个类中重复了相同的模式,因此,模型学习了该模式,并忽略了测试数据中的其他模式。这意味着该模型在野外不会表现良好

如果SMOTE不起作用,您可以通过测试不同的机器学习模型进行实验。Random forest通常在这类数据集上表现良好,因此请尝试通过修剪或调整超参数来调整rf模型。另一种方法是在训练模型时指定类权重。您还可以尝试惩罚模型,当错误分类少数类时,该模型会增加额外的成本

您也可以尝试欠采样,因为您已经测试过过采样。但很可能你的欠采样也会遇到同样的问题。请尝试简单的过采样,而不是SMOTE,以查看结果如何变化


另一种更高级的方法是批处理。把你所有的少数派班级和同等数量的少数派班级的参赛作品都拿出来训练一个模特。在你的多数班的所有批次中继续这样做,最终你将拥有多个机器学习模型,然后你可以一起使用这些模型进行投票。

嗨,拉贾特,谢谢你的评论。你能让我知道,即使在用SMOTE重新采样少数类之前,我从主数据中搁置测试集,这样做是否正确吗?在以后的培训工作中,我将使用CV进行gridsearch,其中CV还将从训练集中分离出自己的验证集。通过这种方式,我总是会在测试集中保留一些数据,这些数据可能包含一个在训练集或验证集中不存在的模式。您必须保留数据以进行测试,否则您将永远无法监控模型的性能。是的,测试集中可能有模式,但这就是机器学习的目的。它必须在有点不同的集合上进行概括和预测,而且该模型从未见过,否则它将是机器记忆,而不是机器学习。有几种方法可以按更好的比例分割数据,因为随机分割可能会导致60%的少数类进入测试集,这也是不好的,所以请寻找这种技术Shi Rajat,感谢您的评论。你能让我知道,即使在用SMOTE重新采样少数类之前,我从主数据中搁置测试集,这样做是否正确吗?在以后的培训工作中,我将使用CV进行gridsearch,其中CV还将从训练集中分离出自己的验证集。通过这种方式,我总是会在测试集中保留一些数据,这些数据可能包含一个在训练集或验证集中不存在的模式。您必须保留数据以进行测试,否则您将永远无法监控模型的性能。是的,测试集中可能有模式,但这就是机器学习的目的。它必须在集合w上推广和预测