1

我正在研究一个多标签文本分类问题(目标标签总数 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)
    ])
4

1 回答 1

2

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

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

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

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

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

引用我的一个较旧的答案(完全不同的问题,但总体思路是水平的):

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

于 2020-04-22T18:02:31.867 回答