Python 将参数传递给多标签分类中的低层XGBoost估计量

Python 将参数传递给多标签分类中的低层XGBoost估计量,python,scikit-learn,xgboost,multilabel-classification,hyperparameters,Python,Scikit Learn,Xgboost,Multilabel Classification,Hyperparameters,我有一个多标签分类问题,我想为每个标签训练一个XGBoost模型(总共4个);然后,由于sklearn.multioutput.MultiOutputClassifier(),我组合了四个XGBoost估计器 另外,由于RandomizedSearchCV,我想对XGBoost的超参数执行随机搜索 下面是一些可复制的代码,解释了我的意图 import xgboost as xgb from sklearn.model_selection import train_test_split, Rand

我有一个多标签分类问题,我想为每个标签训练一个XGBoost模型(总共4个);然后,由于
sklearn.multioutput.MultiOutputClassifier
(),我组合了四个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)
但是,该代码给出了以下(总结)错误:

事实上,在运行错误消息建议的代码行之后,我意识到我正在将
随机网格中的超参数传递给名为
xgb\u模型
多输出分类器
,而不是名为
xgb\u估计器的XGBoost
,后者是“较低级别”估计器(因为它是“包含的”)在
xgb\u型号中


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

如果运行
xgb\u model.get\u params()
,您会发现参数的名称都是在
估计器
前面加上的(双下划线)。所以你的参数空间应该是

随机网格={
‘估计量’:[200300400],
“估计学习率”:[0.05,0.1,0.2],
“估计器最大深度”:[3,4,5],
“估计器最小儿童权重”:[1,3]
}

这与其他sklearn嵌套模型一致,如
Pipeline
ColumnTransformer

我不知道sklearn的嵌套模型。这样更简单!谢谢出于好奇:这是做这类事情的推荐方法吗?还是可以使用类似于
**kwargs
的东西并将超参数传递给XGBoost?我不确定如何使用**kwargs来实现这一点。IIRC,您确实可以使用kwargs将信息传递给xgboost的
fit
方法,请参阅GridSearch的文档和
**fit_params
ValueError: Invalid parameter n_estimators for estimator MultiOutputClassifier.
    Check the list of available parameters with `estimator.get_params().keys()`