使用一个与其他分类器进行上/下采样

时间:2018-11-29 17:35:20

标签: python machine-learning scikit-learn multiclass-classification

我有一个数据集(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个标签。对?我想我需要为每个标签应用上/下采样方法,而不是一开始就做一次。如何为每个标签使用重采样?

1 个答案:

答案 0 :(得分:1)

根据评论中的讨论,您可以执行以下操作:

OneVsRestClassifier

代码说明

  • 步骤1:y将创建OneVsRestClassifier的多个列。每个标签一个,其中该标签为正,其他所有标签均为负。

  • 第2步:对于每个标签,pipe将克隆提供的pipe估算器并将单个数据传递给它。

  • 步骤3:

    a。 y的每个副本将获得一个不同版本的SMOTEENN,该版本将被传递到其中的pipe,因此将进行不同的采样以平衡那里的类。

    b。 clfclf)的第二部分将为您提供每个标签所需的平衡数据集。

  • 步骤4:在预测期间,采样部分将关闭,因此数据将按原样到达imblearn.pipeline。 sklearn管道不处理该部分,所以这就是为什么我使用String total_value= driver.findElement(By.id("items_total")).getText();

希望这会有所帮助。