Python 将参数传递给多标签分类中的低层XGBoost估计量
我有一个多标签分类问题,我想为每个标签训练一个XGBoost模型(总共4个);然后,由于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
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()`