在多标签分类中将参数传递给较低级别​​的 XGBoost 估计器

Pass parameters to lower-level XGBoost estimators in multilabel classification

我有一个多标签分类问题,我想为每个标签(总共 4 个)训练一个 XGBoost 模型;然后,由于 sklearn.multioutput.MultiOutputClassifier (link),我结合了四个 XGBoost 估计器。

此外,由于 RandomizedSearchCV,我想对 XGBoost 的超参数进行随机搜索。

下面有一些可重现的代码可以解释我的意图。

import xgboost as xgb
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.multioutput import MultiOutputClassifier
from sklearn.datasets import make_multilabel_classification

# create dataset
X, y = make_multilabel_classification(n_samples=3000, n_features=50, n_classes=4, n_labels=1,
                                      allow_unlabeled=False, random_state=42)

# Split dataset into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

# hyper-parameters space for the random search
random_grid = {
    'n_estimators': [200, 300, 400], 
    'learning_rate': [0.05, 0.1, 0.2],
    'max_depth': [3, 4, 5],
    'min_child_weight': [1, 3]
}

xgb_estimator = xgb.XGBClassifier(objective='binary:logistic')
xgb_model = MultiOutputClassifier(xgb_estimator)

# random search instance
xgb_random_search = RandomizedSearchCV(
    estimator=xgb_model, param_distributions=random_grid,
    scoring=['accuracy'], refit='accuracy', n_iter=2, cv=3, verbose=True, random_state=1234, n_jobs=2
)

# fit the random search
xgb_random_search.fit(X_train, y_train)

但是,此代码给出了以下(总结的)错误:

ValueError: Invalid parameter n_estimators for estimator MultiOutputClassifier.
    Check the list of available parameters with `estimator.get_params().keys()`

事实上,在 运行 错误消息建议的代码行之后,我意识到我正在将 random_grid 中的超参数传递给 MultiOutputClassifier 调用 xgb_model 而不是 XGBoost 称为 xgb_estimator,它是 "lower-level" 估计器(因为它是 xgb_model 中的 "contained")。

问题是:如何将 random_grid 中的超参数传递给 "lower-level" XGBoost 估计器?我觉得一些 **kwargs 操作是可能的,但经过一些试验后我没有找到使用它们的方法。

如果你运行xgb_model.get_params(),你会发现参数的名称都是以estimator__(双下划线)为前缀的。所以你的参数 space 应该看起来像

random_grid = {
    'estimator__n_estimators': [200, 300, 400], 
    'estimator__learning_rate': [0.05, 0.1, 0.2],
    'estimator__max_depth': [3, 4, 5],
    'estimator__min_child_weight': [1, 3]
}

这与 PipelineColumnTransformer 等其他 sklearn 嵌套模型一致。