Machine learning 结合重采样和特定算法解决类不平衡问题

Machine learning 结合重采样和特定算法解决类不平衡问题,machine-learning,scikit-learn,multilabel-classification,imbalanced-data,imblearn,Machine Learning,Scikit Learn,Multilabel Classification,Imbalanced Data,Imblearn,我正在处理一个多标签文本分类问题(目标标签总数为90)。数据分布具有长尾和大约1900k条记录。目前,我正在研究一个大约10万条记录的小样本,这些记录具有类似的目标分布 一些算法提供了处理类不平衡的功能,如PAC、LinearSVC。目前,我也在做SMOTE来生成除多数和随机欠采样外的所有样本,以抑制多数类的不平衡 同时使用算法参数和IMBREARN管道处理类不平衡是否正确 feat_pipeline = FeatureUnion([('text', text_pipeline)]) esti

我正在处理一个多标签文本分类问题(目标标签总数为90)。数据分布具有长尾和大约1900k条记录。目前,我正在研究一个大约10万条记录的小样本,这些记录具有类似的目标分布

一些算法提供了处理类不平衡的功能,如PAC、LinearSVC。目前,我也在做SMOTE来生成除多数和随机欠采样外的所有样本,以抑制多数类的不平衡

同时使用算法参数和IMBREARN管道处理类不平衡是否正确

feat_pipeline = FeatureUnion([('text', text_pipeline)])

estimators_list = [
                   ('PAC',PassiveAggressiveClassifier(max_iter=5000,random_state=0,class_weight='balanced')),
                   ('linearSVC', LinearSVC(class_weight='balanced'))
                  ]
estimators_ensemble = StackingClassifier(estimators=estimators_list, 
                                         final_estimator=LogisticRegression(solver='lbfgs',max_iter=5000))
ovr_ensemble = OneVsRestClassifier(estimators_ensemble)

classifier_pipeline = imblearnPipeline([
        ('features', feat_pipeline),
        ('over_sampling', SMOTE(sampling_strategy='auto')), # resample all classes but the majority class;
        ('under_sampling',RandomUnderSampler(sampling_strategy='auto')), # resample all classes but the minority class;
        ('ovr_ensemble', ovr_ensemble)
    ])
同时使用算法参数和IMBREARN管道处理类不平衡是否正确

让我们花一分钟来思考这可能意味着什么,以及它是否真的有意义

处理类不平衡的特定算法(或算法设置)自然期望数据中存在一些实际的不平衡

现在,如果您已经人为地平衡了数据(使用SMOTE、多数类欠采样等),那么您的算法最终将面临的是一个平衡的数据集,而不是一个不平衡的数据集。不用说,这些算法无法“知道”他们看到的最终数据中的这种平衡是人为的;因此,从他们的角度来看,没有不平衡——因此不需要任何特殊的配方

所以,这并不是说这样做是错误的,但在这种情况下,这些特定的算法/设置实际上是没有用处的,因为它们在处理类不平衡方面不会提供任何额外的功能

引用一个(完全不同的问题,但总体思路是横向的):

深度神经网络领域仍然(非常)年轻,而且它确实还没有建立其“最佳实践”指南;再加上一个事实,多亏了一个令人惊叹的社区,开源实现中有各种各样的工具可用,而且你可以很容易地发现自己处于(无可否认是诱人的)混合状态,仅仅因为它们碰巧可用。我不一定要说这就是你们在这里试图做的事情——我只是敦促你们在结合可能不是为了一起工作而设计的想法时要更加谨慎


如果你的问题是:“我应该同时使用这两种方法吗?”那么(简单的)答案是:如果有效,那么就这样做。。。如果它不尝试其他东西。如果你只使用了1900k样本中的100k,那么你就有足够的样本作为测试集了。@TravisJ事实上,基于第一原理,不这样做是有原因的;见下面的答案