Machine learning 在不平衡数据上建立模型可以吗?

Machine learning 在不平衡数据上建立模型可以吗?,machine-learning,scikit-learn,imbalanced-data,Machine Learning,Scikit Learn,Imbalanced Data,背景- 我正在处理的数据集是高度不平衡的,类的数量是543。数据以日期为界。在研究了5年的数据之后,我知道这种不平衡是固有的,而且是持续的。模型将获得的测试数据也将受到日期范围的限制,并且它也将具有类似的不平衡性 数据不平衡的原因是不同的消费量、产品的受欢迎程度。处理不平衡会对企业造成不公平 问题- 在这种情况下,可以继续在不平衡数据上构建模型吗 该模型将每月根据新数据进行重新培训,每月用于预测一次。根据您试图建模的内容,这样做可能正确,也可能不正确 在不平衡的数据集上进行训练通常会使您的模型过

背景- 我正在处理的数据集是高度不平衡的,类的数量是543。数据以日期为界。在研究了5年的数据之后,我知道这种不平衡是固有的,而且是持续的。模型将获得的测试数据也将受到日期范围的限制,并且它也将具有类似的不平衡性

数据不平衡的原因是不同的消费量、产品的受欢迎程度。处理不平衡会对企业造成不公平

问题- 在这种情况下,可以继续在不平衡数据上构建模型吗


该模型将每月根据新数据进行重新培训,每月用于预测一次。

根据您试图建模的内容,这样做可能正确,也可能不正确

在不平衡的数据集上进行训练通常会使您的模型过度拟合那些出现频率更高的元素,这会导致在最好的情况下偏向于那些元素,或者在最坏的情况下不理解代表性不足的样本。如果您试图对某些信息的自然发生进行建模,那么不平衡的数据集本质上已经应用了先验概率,因此可能需要产生偏差。在这些情况下,比如说,每个类的元素数量是实际信息的一部分。然而,这种偏差也可以人工(非)建模,例如通过应用分类的比例因子(例如通过类权重)等。为了避免这种偏差,诸如Xgboost(或在更普通的情况下为Adaboost)或只是随机林之类的boosting和集成方法工作得相对较好。如果您有时间,k-fold交叉验证可以帮助进一步减少错误

为了确保每个样本都有足够的代表性,您可以选择对代表性不足的类进行过采样,或对代表性过高的类进行过采样。为了确定正确的可能性,请确保捕获先验分布,并使用它来塑造后验分布。如果样本数量较少,数据扩充可能会对您有所帮助;根据您的情况,合成数据生成可能是一种很好的方法。你可以试着,比如说,只在代表性不足的样本上训练一个GAN,然后用它来产生更多——就像你的想法一样:首先在所有可用数据上训练GAN,然后改变鉴别器损失,迫使GAN伪造和识别代表性不足的类。如果不进入深度学习领域,像ADASYN或ADASYN这样的技术可能会起作用。这两者都可以在构建于scikit learn的Python包中获得


最后,仔细选择损失指标可能会有所帮助。您可以在论文中找到更多(和更详细)的信息,例如。

根据您试图建模的内容,这样做可能正确,也可能不正确

在不平衡的数据集上进行训练通常会使您的模型过度拟合那些出现频率更高的元素,这会导致在最好的情况下偏向于那些元素,或者在最坏的情况下不理解代表性不足的样本。如果您试图对某些信息的自然发生进行建模,那么不平衡的数据集本质上已经应用了先验概率,因此可能需要产生偏差。在这些情况下,比如说,每个类的元素数量是实际信息的一部分。然而,这种偏差也可以人工(非)建模,例如通过应用分类的比例因子(例如通过类权重)等。为了避免这种偏差,诸如Xgboost(或在更普通的情况下为Adaboost)或只是随机林之类的boosting和集成方法工作得相对较好。如果您有时间,k-fold交叉验证可以帮助进一步减少错误

为了确保每个样本都有足够的代表性,您可以选择对代表性不足的类进行过采样,或对代表性过高的类进行过采样。为了确定正确的可能性,请确保捕获先验分布,并使用它来塑造后验分布。如果样本数量较少,数据扩充可能会对您有所帮助;根据您的情况,合成数据生成可能是一种很好的方法。你可以试着,比如说,只在代表性不足的样本上训练一个GAN,然后用它来产生更多——就像你的想法一样:首先在所有可用数据上训练GAN,然后改变鉴别器损失,迫使GAN伪造和识别代表性不足的类。如果不进入深度学习领域,像ADASYN或ADASYN这样的技术可能会起作用。这两者都可以在构建于scikit learn的Python包中获得


最后,仔细选择损失指标可能会有所帮助。您可以在论文中找到更多(和更详细)的信息,例如。

您所说的分类比例因子是什么意思?这是否类似于课堂权重。客户要求避免使用深度学习。而且,失衡程度太高。一类有大约20k个观测值,另一类有大约50个观测值。目标变量中几乎所有的类都是这样。@learnToCode My bad,我没有想到仅仅使用统计方法。已经有评论建议使用引导和集成方法;有一些答案。你已经看过包裹了吗?像SMOTE这样的生成性技术可能适合你。我曾尝试使用SMOTE及其其他变体,但问题是,当我使用过采样时,我有543个类,最大频率的类有20k个观测值。因此,在过采样之后,所有类将有20k个样本,即543x20k个样本。这将极大地增加数据量,老实说,当我尝试这样做时,环境崩溃了(我在Azure云上工作),我看到了。为了减少样本总数,您是否也尝试过对过多的类进行欠采样?在任何情况下,由弱学习者组成的集成方法可能只是一种可行的方法,因为您不一定需要知道每个时间点的所有样本才能进行合作