web-dev-qa-db-ja.com

GridSearchCVを使用したランダムフォレスト-param_gridでのエラー

GridSearchCVを使用してランダムフォレストモデルを作成しようとしていますが、param_gridに関連するエラーが発生します:"ValueError:無効なパラメーターmax_features for estimator Pipeline。 "。私はドキュメントを分類しているので、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)

17
OAK

パイプラインの名前付きステップにパラメーターを割り当てる必要があります。あなたの場合は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"]}
23
Kevin

get_params() を、推定器だけでなくfinalパイプラインオブジェクトで実行してみてください。このようにして、グリッドパラメータのall使用可能なパイプアイテムniqueキーを生成します。

_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_spf'_class_min_imp_min_imp_class_sample_min_leaf_class_min_imp_min_slim_s_class_minf '、' classifier__n_estimators '、' classifier__n_jobs '、' classifier__oob_score '、' classifier__random_state '、' classifier__verbose '、' classifier__warm_start '、' steps '、' tfidf '、' tfidf__analyzer '、' t'code_fid_fid_aryd'ary'df't_typed'ary'df't 'tfidf__encoding'、 'tfidf__input'、 'tfidf__lowercase'、 'tfidf__max_df'、 'tfidf__max_features'、 'tfidf__min_df'、 'tfidf__ngram_range'、 'tfidf__df'_fid_fid_fid_fid_fid_fid_fid_fid_fdf__df's_fidf__df's_fid_tfd_fid_fdf_tfd_tfd_tfd_fd_tfd '、' tfidf__token_pattern '、' tfidf__tokenizer '、' tfidf__use_idf '、' tfidf__vocabulary ']

これは、パイプラインの短い make_pipeline() 構文を使用していて、パイプアイテムのラベルを気にしない場合に特に便利です。

_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'、 '手順'、 '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'、 'tfidfv ectorizer__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']

7
mork