【问题标题】:scikit-learn FeatureUnion gridsearch over subsets of featuresscikit-learn FeatureUnion 对特征子集的网格搜索
【发布时间】:2016-08-30 12:30:17
【问题描述】:

如何在 scikit learn 中使用 FeatureUnion,以便 Gridsearch 可以选择性地处理其部分?

下面的代码工作并设置了一个 FeatureUnion,它带有一个用于单词的 TfidfVectorizer 和一个用于字符的 TfidfVectorizer。

在进行 Gridsearch 时,除了测试定义的参数空间之外,我还想只测试带有 ngram_range 参数的“vect__wordvect”(没有用于字符的 TfidfVectorizer),并且也只测试带有小写参数 True 和 False,另一个 TfidfVectorizer 被禁用。

编辑:基于 maxymoo 建议的完整代码示例。

如何做到这一点?

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.datasets import fetch_20newsgroups

# setup the featureunion
wordvect = TfidfVectorizer(analyzer='word')
lettervect = CountVectorizer(analyzer='char')
featureunionvect = FeatureUnion([("lettervect", lettervect), ("wordvect", wordvect)])

# setup the pipeline
classifier = LogisticRegression(class_weight='balanced')
pipeline = Pipeline([('vect', featureunionvect), ('classifier', classifier)])

# gridsearch parameters 
parameters = {
            'vect__wordvect__ngram_range': [(1, 1), (1, 2)],  # commenting out these two lines
            'vect__lettervect__lowercase': [True, False],     # runs, but there is no parameterization anymore
            'vect__transformer_list': [[('wordvect', wordvect)],
                                        [('lettervect', lettervect)],
                                        [('wordvect', wordvect), ('lettervect', lettervect)]]}
gs_clf = GridSearchCV(pipeline, parameters)

# data
newsgroups_train = fetch_20newsgroups(subset='train', categories=['alt.atheism', 'sci.space'])

# gridsearch CV
gs_clf = GridSearchCV(pipeline, parameters)
gs_clf = gs_clf.fit(newsgroups_train.data, newsgroups_train.target)
for score in gs_clf.grid_scores_:
    print "gridsearch scores: ", score

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    FeatureUnion 有一个名为transformer_list 的参数,您可以使用它进行网格搜索;因此,在您的情况下,您的网格搜索参数将变为

    parameters = {'vect__wordvect__ngram_range': [(1, 1), (1, 2)],
                  'vect__lettervect__lowercase': [True, False],
                  'vect__transformer_weights': [{"lettervect":1,"wordvect":0}, 
                                                {"lettervect":0,"wordvect":1}, 
                                                {"lettervect":1,"wordvect":1}]}
    

    【讨论】:

    • vect__transformer_list 后缺少一个 '。即使在修复它之后,我也得到: 'vect__transformer_list': [[('wordvec':wordvec)], ^ SyntaxError: invalid syntax
    • transformer_list 上的文档非常稀少,我不明白如何在 scikit learn 0.17.1 上修复/调整您的代码
    • 对不起,我的回答中有很多奇怪的错别字,我已经修复了,现在可以了吗?
    • transformser_list 没有什么神秘之处,它只是覆盖了 FeatureUnion 的主要参数
    • 我对代码进行了更改以给出一个完整的示例。仅当我还注释掉所有 featureunion 参数时才有效,但使用我得到的参数: ValueError: Invalid parameter wordvect for estimator FeatureUnion(n_jobs=1, transformer_list=[('lettervect', [...] 检查可用列表带有estimator.get_params().keys()的参数。
    猜你喜欢
    • 2020-07-23
    • 2015-11-19
    • 2014-07-12
    • 2016-06-30
    • 2016-06-23
    • 2016-11-30
    • 2016-08-09
    • 2017-03-27
    • 2019-01-12
    相关资源
    最近更新 更多