我正在处理一个多标签文本分类问题(总目标标签90个)。数据分布呈长尾,约有190万条记录。目前,我正在处理一个大约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')), # 重采样除多数类之外的所有类别; ('under_sampling',RandomUnderSampler(sampling_strategy='auto')), # 重采样除少数类之外的所有类别; ('ovr_ensemble', ovr_ensemble) ])
回答:
同时使用算法参数和imblearn管道来处理类别不平衡是否正确?
让我们花点时间思考一下这可能意味着什么,以及它是否真的有意义。
用于处理类别不平衡的特定算法(或算法设置)自然期望数据中存在某种实际的不平衡。
现在,如果你已经人为地平衡了数据(使用SMOTE、多数类欠采样等),那么你的算法最终面对的将是一个平衡的数据集,而不是一个不平衡的数据集。不用说,这些算法无法“知道”它们看到的最终数据中的平衡是人为的;因此,从它们的角度来看,没有不平衡——因此不需要任何特殊的处理方法启动。
所以,这样做并不是错误的,但在这种情况下,这些特定算法/设置实际上将没有用,因为它们不会在处理类别不平衡方面提供额外的帮助。
引用我之前的一个旧回答(完全不同的问题,但一般思路具有普遍性):
深度神经网络领域仍然(非常)年轻,确实还没有建立其“最佳实践”指南;再加上一个了不起的社区的支持,有各种各样的工具以开源形式可用,你很容易发现自己处于一种(无疑是诱人的)位置,只是因为它们可用而混合使用这些工具。我并不是说你在这里试图做的是这样——我只是敦促在结合可能并非设计为一起工作的想法时要更加谨慎…