如何使用 MultiOutputClassifier() 和 RandomizedSearchCV() 进行超参数调整?

How to use MultiOutputClassifier() with RandomizedSearchCV() for hyperparameter tuning?

我正在使用来自 scikit-learn 的 MultiOutputClassifier() 包装器来执行多标签分类任务。

clf = MultiOutputClassifier(RandomForestClassifier())

现在我想使用 RandomizedSearchCV 为包装在 MultiOutputClassifier 中的 RandomForestClassifier 找到最佳参数。

参数:

params = {
    'n_estimators': [i for  i in range(50,225,25)],
    'max_depth' : [10,20,30,40,50],
    'max_features' : ['auto', 'sqrt', 'log2']
}

但是当我执行以下操作时:

clf =  RandomizedSearchCV(clf, params, cv=5, return_train_score=False)
clf.fit(X_train, y_train)

出现此错误:

ValueError: Invalid parameter n_estimators for estimator MultiOutputClassifier(estimator=RandomForestClassifier(bootstrap=True,
                                                       ccp_alpha=0.0,
                                                       class_weight=None,
                                                       criterion='gini',
                                                       max_depth=None,
                                                       max_features='auto',
                                                       max_leaf_nodes=None,
                                                       max_samples=None,
                                                       min_impurity_decrease=0.0,
                                                       min_impurity_split=None,
                                                       min_samples_leaf=1,
                                                       min_samples_split=2,
                                                       min_weight_fraction_leaf=0.0,
                                                       n_estimators=100,
                                                       n_jobs=None,
                                                       oob_score=False,
                                                       random_state=42,
                                                       verbose=0,
                                                       warm_start=False),
                      n_jobs=None). Check the list of available parameters with `estimator.get_params().keys()`.

那么有什么方法可以在使用 RandomizedSearchCV 时将这些参数直接传递到包装在 MultiOutputClassifier 中的 RandomForestClassifier 中吗?

您应该将 estimator__ 添加到超参数名称中:

from sklearn.datasets import make_multilabel_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.multioutput import MultiOutputClassifier

X, y = make_multilabel_classification(n_classes=3, random_state=0)

clf = MultiOutputClassifier(RandomForestClassifier())

params = {
    'estimator__n_estimators': [i for i in range(50, 225, 25)],
    'estimator__max_depth': [10, 20, 30, 40, 50],
    'estimator__max_features': ['auto', 'sqrt', 'log2']
}

clf = RandomizedSearchCV(clf, params, cv=5, return_train_score=False)

clf.fit(X, y)

print(clf.best_params_)
# {'estimator__n_estimators': 75,
#  'estimator__max_features': 'sqrt',
#  'estimator__max_depth': 20}