如何在 FeatureUnion 中对 scikit 转换器进行特征选择

Posted

技术标签:

【中文标题】如何在 FeatureUnion 中对 scikit 转换器进行特征选择【英文标题】:How to feature-select scikit transformers within FeatureUnion 【发布时间】:2021-12-09 12:31:44 【问题描述】:

我有一个机器学习分类任务,它从各种固定长度向量表示的串联中进行训练。如何在 scikit-learn 中执行自动特征选择或网格搜索或任何其他已建立的技术来为我的数据找到最佳的转换器组合?

以这个文本分类流程为例:

model = Pipeline([
   ('vectorizer', FeatureUnion(transformer_list=[
      ('word-freq', TfidfVectorizer()),        # vocab-size dimensional
      ('doc2vec', MyDoc2VecVectorizer()),      # 32 dimensional (custom transformer)
      ('doc-length', MyDocLengthVectorizer()), # 1 dimensional (custom transformer)
      ('sentiment', MySentimentVectorizer()),  # 3 dimensional (custom transformer)
      ...                                      # possibly many other transformers
   ])),
   ('classifier', SVC())
])

我怀疑这可能属于scikit slep002 请求的dynamic-pipeline 功能。如果可以,中途怎么处理?

【问题讨论】:

【参考方案1】:

虽然不太能够“选择最好的(全部或全部)转换器特性子集”,但我们可以使用 scikit 的 feature selectiondimensionality reduction 模块来“选择/简化跨所有转换器的最佳特征子集”作为分类前的额外步骤:

model = Pipeline([
   ('vectorizer', FeatureUnion(transformer_list=[...])),
   ('feature_selector', GenericUnivariateSelect(
      mode='percentile',
      param=0.20,          # hyper-tunable parameter
   )),
   ('classifier', SVC())
])

在特征发现上下文中(即:找到最佳表达信号),这种技术比挑选变压器更强大。然而,在架构发现环境中(即:找到最佳管道布局和转换器的使用),这个问题似乎仍然悬而未决..

【讨论】:

以上是关于如何在 FeatureUnion 中对 scikit 转换器进行特征选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FeatureUnion 构建参数网格?

如何使用管道和 FeatureUnion 添加功能

如何使用 sklearn Pipeline 和 FeatureUnion 选择多个(数字和文本)列进行文本分类?

Python机器学习库sciki-earn实践

从 FeatureUnion + Pipeline 中获取功能名称

featureUnion vs columnTransformer?