【问题标题】:How would I create a SMOTE pipeline step for text classification, when the resampling method does not work with text?当重采样方法不适用于文本时,如何为文本分类创建 SMOTE 管道步骤?
【发布时间】:2017-09-21 18:52:51
【问题描述】:

我有一个多标签分类问题和一个巨大的类不平衡问题,因此我想使用 SMOTE 创建一个管道步骤,但由于 X 基本上是文本,Y 是所述标签的 1 和 0 数组,我不能以这种方式插入 SMOTE(),因为它既需要适配又需要转换。

pipeline = Pipeline([
    ('smote', SMOTE()), 
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()), 
    ('ss', StandardScaler(with_mean=False)), 
    ('clf', model),
])

【问题讨论】:

  • 我认为 SMOTE 带有它自己的 Pipeline 子类,可能值得研究(至少作为示例),但 smote 不会出现在 vecttfidf 之后?
  • 是的,SMOTE 有自己的管道,必须使用。除此之外,SMOTE 将在您的model 之前出现。需要更多信息,例如您正在关注哪个教程、一些数据示例等
  • 您对 SMOTE 的看法是绝对正确的,我并没有特别关注教程,只是对我的 X 进行文本分类,这只是一堆文本中的文章,而 y 是标签或主题对于这篇文章。管道插入 GridSearchCV,这是我遇到问题的地方,因为 SMOTE 的管道子类不具备可插入 Gridsearch 的管道的适配和转换。
  • 也许你想看看 sklearn.preprocessing.FunctionTransformer,不过我不确定它是否会返回新的 Ys

标签: python scikit-learn pipeline text-classification topic-modeling


【解决方案1】:

请记住:不平衡学习包适用于多类项目,但不适用于多标签项目,如果使用它会抛出错误消息。

from imblearn.pipeline import Pipeline 

text_pipeline = Pipeline([('vect', CountVectorizer(tokenizer=tokenize, 
                                  ngram_range=(1,2),
                                  max_df=0.75)), 
                          ('tfidf', TfidfTransformer(sublinear_tf=True))])
pipeline = Pipeline([('features', FeatureUnion([('text_pipeline', text_pipeline)])),
                     ('clf', MultiOutputClassifier(LogisticRegression(solver='saga',
                                                                      multi_class='auto',
                                                                      max_iter=500,
                                                                      class_weight='balanced',
                                                                      n_jobs=-1, random_state=FIXED_SEED)))])

【讨论】:

  • 您能否添加一些来源来支持您的陈述?它会给你的答案带来更多价值。
  • @Corentin 抱歉,我应该这样做。数据集是图 8 中的一个灾难消息,它是高度不平衡的,是一个多类、多标签的分类任务。经过一些清理后,剩余的英文消息被映射到一组目标类别标签。我想使用 imblearn 管道,例如
  • @Corentin,这是一个代码示例(ups,丑陋的格式)...from imblearn.pipeline import Pipeline pipeline = Pipeline([ ('features', FeatureUnion([ ('text_pipeline', Pipeline([ ('vect', CountVectorizer(tokenizer=tokenize, ngram_range=(1,2), max_df=0.75)), ('tfidf', TfidfTransformer(sublinear_tf=True)), ])) ])), ('clf', MultiOutputClassifier(LogisticRegression(solver='saga', multi_class='auto', max_iter=500, class_weight='balanced', n_jobs=-1, random_state=FIXED_SEED))) ])
【解决方案2】:

当前版本的不平衡学习带有它自己的pipeline。您应该能够将其合并到您的 sklearn 管道中。您只需在 sklearn 导入后添加此行,确保它覆盖之前导入的管道的 sklearn 版本,并像使用 sklearn 管道一样使用它。

from imblearn.pipeline import Pipeline

【讨论】:

    猜你喜欢
    • 2018-12-02
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多