ValueError:使用 GridSearch 参数时估计器 CountVectorizer 的参数模型无效

Posted

技术标签:

【中文标题】ValueError:使用 GridSearch 参数时估计器 CountVectorizer 的参数模型无效【英文标题】:ValueError: Invalid parameter model for estimator CountVectorizer when using GridSearch parameters 【发布时间】:2016-01-03 12:09:35 【问题描述】:

我有一个 sklearn 管道,它使用两种类型的特征进行文本分类:由 CountVectorizer() 和 TfidfTransformer() (TfidfVectorizer()) 生成的标准 tfidf 特征和一些语言特征。我尝试将不同的 ngram 范围传递给 CountVectorizer(),然后使用 GridSearh 找到最佳 n。

这是我的代码:

text_clf = Pipeline([('union', FeatureUnion([
                              ('tfidf', Pipeline([
                                       ('sents', GetItem(key='sent')), 
                                       ('vect', CountVectorizer()),
                                       ('transform', TfidfTransformer())
                               ])),
                              ('LF', Pipeline([
                                     ('features', GetItem(key='features')), 
                                     ('dict_vect', DictVectorizer())
                               ]))],
                               transformer_weights='LF': 0.6, 'tfidf': 0.8
                               )),
                              ('clf', SGDClassifier())
                     ])

parameters = ['union__tfidf__vect__model__ngram_range': ((1, 1), (1, 2), (1, 3), (1, 4)), 
            'clf__alpha': (1e-2, 1e-3, 1e-4, 1e-5), 
            'clf__loss': ('hinge', 'log', 'modified_huber', 'squared_hinge', 'perceptron'), 
            'clf__penalty': ('none', 'l2', 'l1', 'elasticnet'), 
            'clf__n_iter': (3, 4, 5, 6, 7, 8, 9, 10)]

gs_clf = GridSearchCV(text_clf, parameters, cv=5, n_jobs=-1)
gs_clf = gs_clf.fit(all_data, labels)

(我省略了一些似乎与问题无关的行。)

但是它会抛出一个错误:

ValueError: Invalid parameter model for estimator CountVectorizer(analyzer=u'word', binary=False, charset=None,
    charset_error=None, decode_error=u'strict',
    dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content',
    lowercase=True, max_df=1.0, max_features=None, min_df=1,
    ngram_range=(1, 1), preprocessor=None, stop_words=None,
    strip_accents=None, token_pattern=u'(?u)\\b\\w\\w+\\b',
    tokenizer=None, vocabulary=None)

TfidfVectorizer() 也是如此。

如果我将 ngram_range 直接传递给管道中的矢量化器,一切正常: ('vect', CountVectorizer(ngram_range=(1,2)))

谢谢!

【问题讨论】:

【参考方案1】:

错误是因为你有union__tfidf__vect__model__ngram_range,而它应该是union__tfidf__vect__ngram_range。注意它是如何将“模型”称为无效参数的:

ValueError:参数模型无效

另外,作为说明,我认为使用 TfidfVectorizer 会简化事情。

【讨论】:

感谢大卫的帮助!我只是被这篇文章弄糊涂了:***.com/questions/27810855/…【参考方案2】:

vectr__ tfidf__ clfsvm__ 之间确实存在严格的命名关系

pipe_clf_svm = Pipeline([('vectr', CountVectorizer(analyzer=textproc_max, 
                    preprocessor=no_numb_preprocessor, min_df=4)),
                            ('tfidf', tfidfT), 
                                ('clfsvm', clf_svm),])

parameters2 = 'vectr__ngram_range': [(1,1),(1,2),(1,3)],
                  'tfidf__use_idf': (True, False),  #
                    'clfsvm__alpha': (1e-2, 1e-3),

这 3 个 vectr__ tfidf__ clfsvm__ 被命名为别名 如 pipe_clf_svm.named_steps['vectr']

【讨论】:

以上是关于ValueError:使用 GridSearch 参数时估计器 CountVectorizer 的参数模型无效的主要内容,如果未能解决你的问题,请参考以下文章

LightGBM 错误:ValueError:对于提前停止,评估需要至少一个数据集和评估指标

使用 Gridsearch 进行 RFE 排名

重塑 pandas.Df 以在 GridSearch 中使用

在管道/gridSearch 中使用 TFI/DF 和 CountVectorizer

如何使用 GridSearch 保存具有最佳参数的 Keras 模型

使用 Gridsearch 进行超参数搜索,给出不起作用的参数值