针对类不平衡结合重采样和特定算法

Posted

技术标签:

【中文标题】针对类不平衡结合重采样和特定算法【英文标题】:Combine resampling and specific algorithms for Class Imbalance 【发布时间】:2020-08-05 19:13:30 【问题描述】:

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

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

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

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)
    ])

【问题讨论】:

如果您的问题是:“我应该同时使用...吗?”那么(简单的)答案是:如果它有效,那么就去做......如果它不尝试别的东西。如果您只使用 1900k 样本中的 100k,那么您有足够的测试集。 @TravisJ 实际上有理由不这样做,基于第一原则;见下方答案 【参考方案1】:

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

让我们花点时间思考一下这可能意味着什么,以及它是否真的有意义。

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

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

所以,这样做并不是错误,但在这种情况下,这些特定的算法/设置实际上没有用,因为它们不会有任何额外的东西关于处理类不平衡的提议。

引用older answer of mine(完全不同的问题,但总体思路是横向的):

深度神经网络领域仍然(非常)年轻,确实还没有建立其“最佳实践”指南;再加上一个事实,多亏了一个了不起的社区,在开源实现中有各种可用的工具,你很容易发现自己陷入(诚然诱人的)混杂的位置,只是因为它们碰巧可用。我不一定说这就是你在这里尝试做的事情 - 我只是敦促在结合可能无法一起工作的想法时更加谨慎......

【讨论】:

以上是关于针对类不平衡结合重采样和特定算法的主要内容,如果未能解决你的问题,请参考以下文章

类不平衡问题与SMOTE过采样算法

1.7 非平衡数据的处理方法大全

熊猫结合了滚动和重采样

过采样类不平衡训练/测试拆分“发现样本数量不一致的输入变量”解决方案?

音频重采样实现原理

图像重采样(CPU和GPU)