29

我正在尝试使用 GridSearchCV 创建一个随机森林模型,但出现与 param_grid 有关的错误:“ValueError: Invalid parameter max_features for estimator Pipeline。使用 `estimator.get_params().keys()" 检查可用参数列表。我正在对文档进行分类,因此我也在将 tf-idf 矢量化器推到管道中。这是代码:

from sklearn import metrics
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, f1_score, accuracy_score, precision_score, confusion_matrix
from sklearn.pipeline import Pipeline

 #Classifier Pipeline
pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('classifier', RandomForestClassifier())
])
# Params for classifier
params = {"max_depth": [3, None],
              "max_features": [1, 3, 10],
              "min_samples_split": [1, 3, 10],
              "min_samples_leaf": [1, 3, 10],
              # "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}

# Grid Search Execute
rf_grid = GridSearchCV(estimator=pipeline , param_grid=params) #cv=10
rf_detector = rf_grid.fit(X_train, Y_train)
print(rf_grid.grid_scores_)

我无法弄清楚为什么会显示错误。当我使用 GridSearchCV 运行决策树时,也会发生同样的情况。(Scikit-learn 0.17)

4

3 回答 3

33

您必须将参数分配给管道中的命名步骤。在你的情况下classifier。尝试添加 classifier__到参数名称。 样品管道

params = {"classifier__max_depth": [3, None],
              "classifier__max_features": [1, 3, 10],
              "classifier__min_samples_split": [1, 3, 10],
              "classifier__min_samples_leaf": [1, 3, 10],
              # "bootstrap": [True, False],
              "classifier__criterion": ["gini", "entropy"]}
于 2016-01-20T01:58:14.217 回答
17

尝试get_params()在您的最终管道对象上运行,而不仅仅是估算器。这样,它将为网格参数生成所有可用的管道项唯一键。

sorted(pipeline.get_params().keys())

['classifier','classifier__bootstrap','classifier__class_weight','classifier__criterion','classifier__max_depth', 'classifier__max_features', 'classifier__max_leaf_nodes', 'classifier__min_impurity_split', 'classifier__min_samples_leaf', 'classifier__min_samples_split', 'classifier__min_weight_fraction_leaf', 'classifier__n_estimators', 'classifier__n_jobs', 'classifier__oob_score', 'classifier__random_state', 'classifier__verbose', 'classifier__warm_start', 'steps', 'tfidf ','tfidf__analyzer','tfidf__binary','tfidf__decode_error','tfidf__dtype','tfidf__encoding','tfidf__input','tfidf__lowercase','tfidf__max_df','tfidf__max_features','tfidf__min_df','tfidf__ngram_range','tfidf__ngram_range', 'tfidf__预处理器','tfidf__smooth_idf','tfidf__stop_words','tfidf__strip_accents','tfidf__sublinear_tf','tfidf__token_pattern','tfidf__tokenizer','tfidf__use_idf','tfidf__vocabulary']

当您使用make_pipeline()Piplines 的简短语法时,这特别有用,您不必为管道项的标签而烦恼:

pipeline = make_pipeline(TfidfVectorizer(), RandomForestClassifier())
sorted(pipeline.get_params().keys())

['randomforestclassifier','randomforestclassifier__bootstrap','randomforestclassifier__class_weight','randomforestclassifier__criterion','randomforestclassifier__max_depth', 'randomforestclassifier__max_features', 'randomforestclassifier__max_leaf_nodes', 'randomforestclassifier__min_impurity_split', 'randomforestclassifier__min_samples_leaf', 'randomforestclassifier__min_samples_split', 'randomforestclassifier__min_weight_fraction_leaf', 'randomforestclassifier__n_estimators', 'randomforestclassifier__n_jobs', 'randomforestclassifier__oob_score', 'randomforestclassifier__random_state', 'randomforestclassifier__verbose', 'randomforestclassifier__warm_start', 'steps', 'tfidfvectorizer ','tfidfvectorizer__analyzer','tfidfvectorizer__binary','tfidfvectorizer__decode_error','tfidfvectorizer__dtype','tfidfvectorizer__encoding','tfidfvectorizer__input','tfidfvectorizer__lowercase', 'tfidfvectorizer__max_df', 'tfidfvectorizer__max_features', 'tfidfvectorizer__min_df', 'tfidfvectorizer__ngram_range', 'tfidfvectorizer__norm', 'tfidfvectorizer__preprocessor', 'tfidfvectorizer__smooth_idf', 'tfidfvectorizer__stop_words', 'tfidfvectorizer__strip_accents', 'tfidfvectorizer__sublinear_tf', 'tfidfvectorizer__token_pattern', 'tfidfvectorizer__tokenizer', ' tfidfvectorizer__use_idf', 'tfidfvectorizer__vocabulary']tfidfvectorizer__stop_words','tfidfvectorizer__strip_accents','tfidfvectorizer__sublinear_tf','tfidfvectorizer__token_pattern','tfidfvectorizer__tokenizer','tfidfvectorizer__use_idf','tfidfvectorizer__vocabulary']tfidfvectorizer__stop_words','tfidfvectorizer__strip_accents','tfidfvectorizer__sublinear_tf','tfidfvectorizer__token_pattern','tfidfvectorizer__tokenizer','tfidfvectorizer__use_idf','tfidfvectorizer__vocabulary']

于 2017-01-16T13:24:21.647 回答
0

我在使用 randomsearchcv 时遇到了同样的错误,所以我调整了详细参数,并得到了结果

于 2022-01-04T15:15:27.100 回答