我有一个sklearn管道,使用两种类型的功能进行文本分类:CountVectorizer()生成的标准tfidf功能和TfidfTransformer()(TfidfVectorizer())以及一些语言功能。我尝试将不同的ngrams范围传递给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)))
谢谢!
答案 0 :(得分:2)
错误是因为union__tfidf__vect__model__ngram_range
应为union__tfidf__vect__ngram_range
。注意它如何将“model”称为无效参数:
ValueError:参数模型无效
另外,作为一个注释,我认为使用TfidfVectorizer
可以简化事情。
答案 1 :(得分:0)
在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']