如何在管道中使用多个输入要素和关联的提取器?

时间:2014-11-13 01:54:35

标签: scikit-learn

我正在使用Scikit-learn进行分类任务。我有一个数据集,其中每个观察包括两个单独的文本字段。我想设置一个管道,其中每个文本字段通过其自己的TfidfVectorizer并行传递,并且TfidfVectorizer对象的输出传递给分类器。我的目标是能够使用GridSearchCV优化两个TfidfVectorizer对象的参数以及分类器的参数。

管道可能描述如下:

Text 1 -> TfidfVectorizer 1 --------|
                                    +---> Classifier
Text 2 -> TfidfVectorizer 2 --------|

我理解如何在不使用管道的情况下执行此操作(仅通过创建TfidfVectorizer对象并从那里开始工作),但如何在管道内进行设置?

感谢您的帮助,

罗布。

1 个答案:

答案 0 :(得分:3)

使用PipelineFeatureUnion类。您案例的代码如下所示:

pipeline = Pipeline([
  ('features', FeatureUnion([
    ('c1', Pipeline([
      ('text1', ExtractText1()),
      ('tf_idf1', TfidfVectorizer())
    ])),
    ('c2', Pipeline([
      ('text2', ExtractText2()),
      ('tf_idf2', TfidfVectorizer())
    ]))
  ])),
  ('classifier', MultinomialNB())
])

您可以使用<estimator1>__<estimator2>__<parameter>语法参考参数,对整个结构进行网格搜索。例如,features__c1__tf_idf1__min_df引用图表中min_df的{​​{1}}参数。