针对类不平衡结合重采样和特定算法
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(完全不同的问题,但总体思路是横向的):
深度神经网络领域仍然(非常)年轻,确实还没有建立其“最佳实践”指南;再加上一个事实,多亏了一个了不起的社区,在开源实现中有各种可用的工具,你很容易发现自己陷入(诚然诱人的)混杂的位置,只是因为它们碰巧可用。我不一定说这就是你在这里尝试做的事情 - 我只是敦促在结合可能无法一起工作的想法时更加谨慎......
【讨论】:
以上是关于针对类不平衡结合重采样和特定算法的主要内容,如果未能解决你的问题,请参考以下文章