sklearn models 参数调优 GridSearchCV

数据挖掘 scikit-学习 文本分类 网格搜索
2022-02-19 21:56:17

数据框:

id    review                                              name         label
1     it is a great product for turning lights on.        Ashley       1
2     plays music and have a good sound.                  Alex         1
3     I love it, lots of fun.                             Peter        0

目的是对文本进行分类;如果评论是关于产品的功能(例如打开灯、音乐)label=1,否则label=0

我正在运行几个 sklearn 模型,看看哪一个效果最好:

# Naïve Bayes:
text_clf_nb = Pipeline([('tfidf', TfidfVectorizer()), ('clf', MultinomialNB())])

# Linear Support Vectors Classifier:
text_clf_lsvc = Pipeline([('tfidf', TfidfVectorizer()), ('clf', LinearSVC(loss='hinge',
              penalty='l2', max_iter = 50))])

# SGDClassifier
text_clf_sgd = Pipeline([('tfidf', TfidfVectorizer()), ('clf', SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3,                                                    random_state=42,max_iter=50, tol=None))])

#Random Forest
text_clf_rf = Pipeline([('tfidf', TfidfVectorizer()), ('clf', RandomForestClassifier())])

#neural network MLPClassifier
text_clf_mlp = Pipeline([('tfidf', TfidfVectorizer()), ('clf', MLPClassifier())])

问题:如何使用 GridSearchCV 调整模型?到目前为止我所拥有的:

from sklearn.model_selection import GridSearchCV
parameters = {'vect__ngram_range': [(1, 1), (1, 2)],'tfidf__use_idf': (True, False),'clf__alpha': (1e-2, 1e-3) }
gs_clf = GridSearchCV(text_clf_nb, param_grid= parameters, cv=2,  scoring='roc_auc', n_jobs=-1)
gs_clf = gs_clf.fit((X_train, y_train))

这会在运行时出现以下错误gs_clf = gs_clf.fit((X_train, y_train))

ValueError: Invalid parameter C for estimator Pipeline(memory=None,
         steps=[('tfidf',
                 TfidfVectorizer(analyzer='word', binary=False,
                                 decode_error='strict',
                                 dtype=<class 'numpy.float64'>,
                                 encoding='utf-8', input='content',
                                 lowercase=True, max_df=1.0, max_features=None,
                                 min_df=1, ngram_range=(1, 1), norm='l2',
                                 preprocessor=None, smooth_idf=True,
                                 stop_words=None, strip_accents=None,
                                 sublinear_tf=False,
                                 token_pattern='(?u)\\b\\w\\w+\\b',
                                 tokenizer=None, use_idf=True,
                                 vocabulary=None)),
                ('clf',
                 MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True))],
         verbose=False). Check the list of available parameters with `estimator.get_params().keys()`.

我将不胜感激任何建议。谢谢。

1个回答

调用内部参数的正确方法Pipeline是使用双下划线,如named_step__parameter_name. 所以我注意到的第一件事是在这一行:

parameters = {'vect__ngram_range': [(1, 1), (1, 2)],'tfidf__use_idf': (True, False),'clf__alpha': (1e-2, 1e-3) }

你在打电话vect__ngram_range,但这应该是tfidf__ngram_range

现在这不是显示的错误,而是好像你在某个地方混合了你的代码,因为C它是 SVM 的参数而不是 MultinomialNB,所以检查你是否真的通过了预期的管道,因为我怀疑你正在通过pipeline那个使 SVM 保持不变,但尝试对 SVM 进行超参数化MultinomialNB

所以检查这本字典是否:

parameters = {'vect__ngram_range': [(1, 1), (1, 2)],'tfidf__use_idf': (True, False),'clf__alpha': (1e-2, 1e-3) }

也正在创建,但用于 SVM(两个具有相同名称parameter

最后,我还将更改这些行:

gs_clf = GridSearchCV(text_clf_nb, param_grid= parameters, cv=2,  scoring='roc_auc', n_jobs=-1)
gs_clf = gs_clf.fit((X_train, y_train))

仅此:

gs_clf = GridSearchCV(text_clf_nb, param_grid= parameters, cv=2,  scoring='roc_auc', n_jobs=-1).fit(X_train, y_train)

为什么将元组传递给 fit 方法令人困惑。