【问题标题】:Random Forest with GridSearchCV - Error on param_grid带有 GridSearchCV 的随机森林 - param_grid 上的错误
【发布时间】:2016-04-25 15:41:09
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

    标签: python scikit-learn random-forest grid-search


    【解决方案1】:

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    【解决方案2】:

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

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

    ['分类器', '分类器__引导', '分类器__class_weight', '分类器__标准', '分类器__max_depth', '分类器__max_features', '分类器__max_leaf_nodes', '分类器__min_impurity_split', '分类器__min_samples_leaf', '分类器__min_samples_split', '分类器__min_weight_fraction_leaf', '分类器__n_estimators', '分类器__n_jobs', '分类器__oob_score', '分类器__random_state', '分类器__详细', '分类器__warm_start', '脚步', 'tfidf', 'tfidf__analyzer', 'tfidf__binary', 'tfidf__decode_error', 'tfidf__dtype', 'tfidf__encoding', 'tfidf__input', 'tfidf__小写', 'tfidf__max_df', 'tfidf__max_features', 'tfidf__min_df', 'tfidf__ngram_range', 'tfidf__norm', 'tfidf__预处理器', 'tfidf__smooth_idf', 'tfidf__stop_words', 'tfidf__strip_accents', 'tfidf__sublinear_tf', 'tfidf__token_pattern', 'tfidf__tokenizer', 'tfidf__use_idf', 'tfidf__词汇']

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

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

    ['随机森林分类器', 'randomforestclassifier__bootstrap', '随机森林分类器__class_weight', '随机森林分类器__标准', '随机森林分类器__max_depth', 'randomforestclassifier__max_features', '随机森林分类器__max_leaf_nodes', '随机森林分类器__min_impurity_split', '随机森林分类器__min_samples_leaf', '随机森林分类器__min_samples_split', '随机森林分类器__min_weight_fraction_leaf', 'randomforestclassifier__n_estimators', '随机森林分类器__n_jobs', 'randomforestclassifier__oob_score', 'randomforestclassifier__random_state', '随机森林分类器__详细', 'randomforestclassifier__warm_start', '脚步', '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__预处理器', 'tfidfvectorizer__smooth_idf', 'tfidfvectorizer__stop_words', 'tfidfvectorizer__strip_accents', 'tfidfvectorizer__sublinear_tf', 'tfidfvectorizer__token_pattern', 'tfidfvectorizer__tokenizer', 'tfidfvectorizer__use_idf', 'tfidfvectorizer__词汇']

    【讨论】:

      【解决方案3】:

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

      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"]}
      

      【讨论】:

      • 谢谢你,它有效!有道理,我不知道这个
      猜你喜欢
      • 2021-08-07
      • 2020-11-22
      • 2016-10-26
      • 2013-12-03
      • 2013-04-25
      • 2017-09-24
      • 2015-05-10
      • 2018-09-03
      • 2021-05-29
      相关资源
      最近更新 更多