我有一个多标签分类问题,我想为每个标签训练XGBoost模型(总共4个);然后,由于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
而不是名为xgb_estimator
的XGBoost, “较低级别”的估算器(因为xgb_model
中“包含”)。
问题是:如何将random_grid
中的超参数传递给“下层” XGBoost估算器?我觉得可以通过某些**kwargs
操作来实现,但是经过一番尝试之后,我仍然没有找到使用它们的方法。
如果运行xgb_model.get_params()
,则会发现参数名称都以estimator__
开头(双下划线)。因此您的参数空间应类似于
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]
}
与其他sklearn嵌套模型,例如Pipeline
和ColumnTransformer
一致。