我有一个数据集(tf-idf加权词),其中包含多个我尝试预测的类。我的课不平衡。我想通过sklearn的OneVsRestClassifier将One vs.rest分类方法与某些分类器(例如,多项朴素贝叶斯)一起使用。
此外,我想使用不平衡学习包(最有可能是上采样和下采样的组合之一)来增强我的数据。使用不平衡学习的通常方法是:
from imblearn.combine import SMOTEENN
smote_enn = SMOTEENN(random_state=0)
X_resampled, y_resampled = smote_enn.fit_resample(X, y)
我现在有了一个数据集,每个标签的案件数大致相同。然后,我将对重新采样的数据使用分类器。
from sklearn.multiclass import OneVsRestClassifier
from sklearn.naive_bayes import MultinomialNB
ovr = OneVsRestClassifier(MultinomialNB())
ovr.fit(X_resampled, y_resampled)
但是:现在每个标签贴合时都会出现巨大的不平衡,因为我总共有超过50个标签。对?我想我需要为每个标签应用上/下采样方法,而不是一开始就做一次。如何为每个标签使用重采样?
答案 0 :(得分:1)
根据评论中的讨论,您可以执行以下操作:
OneVsRestClassifier
代码说明:
步骤1:y
将创建OneVsRestClassifier
的多个列。每个标签一个,其中该标签为正,其他所有标签均为负。
第2步:对于每个标签,pipe
将克隆提供的pipe
估算器并将单个数据传递给它。
步骤3:
a。 y
的每个副本将获得一个不同版本的SMOTEENN
,该版本将被传递到其中的pipe
,因此将进行不同的采样以平衡那里的类。
b。 clf
(clf
)的第二部分将为您提供每个标签所需的平衡数据集。
步骤4:在预测期间,采样部分将关闭,因此数据将按原样到达imblearn.pipeline
。 sklearn管道不处理该部分,所以这就是为什么我使用String total_value= driver.findElement(By.id("items_total")).getText();
。
希望这会有所帮助。