如何对多标签分类问题执行网格搜索?

How to perform Grid Search on a multi-label classification problem?

我正在学习 Scikit-Learn,我正在尝试对多标签分类问题执行网格搜索。这是我写的:

from sklearn.model_selection import GridSearchCV

param_grid = [
    {'randomforestclassifier__n_estimators': [3, 10, 30], 'randomforestclassifier__max_features': [2, 4, 5, 8]},
    {'randomforestclassifier__bootstrap': [False], 'randomforestclassifier__n_estimators': [3, 10], 'randomforestclassifier__max_features': [2, 3, 4]}
]

rf_classifier = OneVsRestClassifier(
    make_pipeline(RandomForestClassifier(random_state=42))
)
grid_search = GridSearchCV(rf_classifier, param_grid=param_grid, cv=5, scoring = 'f1_micro')
grid_search.fit(X_train_prepared, y_train)

然而,当我 运行 它时,我得到以下错误:

ValueError: Invalid parameter randomforestclassifier for estimator 
OneVsRestClassifier(estimator=Pipeline(steps=[('randomforestclassifier',
RandomForestClassifier(random_state=42))])). Check the list of available parameters 
with `estimator.get_params().keys()`.

我也尝试 运行 grid_search.estimator.get_params().keys() 命令,但我只得到一个参数列表,其中包含我编写的参数,因此我不确定我应该做什么。

您能否建议问题所在以及我如何才能 运行 正确地进行网格搜索?

您可以像在 rf_classifier 是一个 Pipeline 对象时那样定义 param_grid。引用 Pipeline 的文档

The purpose of the pipeline is to assemble several steps that can be cross-validated together while setting different parameters. For this, it enables setting parameters of the various steps using their names and the parameter name separated by a '__'.

在您的情况下,rf_classifierOneVsRestClassifier 实例。因此,在为 RFC 设置参数之前,您需要能够访问管道实例,您可以通过 OneVsRestClassifier estimator 的参数进行访问,如下所示:

param_grid = [
    {'estimator__randomforestclassifier__n_estimators': [3, 10, 30], 
     'estimator__randomforestclassifier__max_features': [2, 4, 5, 8]
    },
    {'estimator__randomforestclassifier__bootstrap': [False], 
     'estimator__randomforestclassifier__n_estimators': [3, 10], 
     'estimator__randomforestclassifier__max_features': [2, 3, 4]
    }
]