如何使用XGboost优化sklearn管道,用于不同的`eval_metric`?

时间:2017-03-14 18:23:04

标签: python scikit-learn classification pipeline xgboost

我尝试使用XGBoost,并将In [4]: {k: {k2: set(v2) if k2=='chr' else v2 for k2, v2 in v.items()} for k, v in d.items()} Out[4]: {128: {'Y': [4.0, 3.5, 3.5], 'X': [0.5, 4.0, 4.0], 'chr': {3}}, 726: {'Y': [2.0, 0.0, 0.0], 'X': [3.5, 3.5, 2.0], 'chr': {2}}} 优化为eval_metric(如here所述)。

这在直接使用分类器时工作正常,但在我尝试将其用作pipeline时失败。

auc参数传递给sklearn管道的正确方法是什么?

示例:

.fit

错误:
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_iris from xgboost import XGBClassifier import xgboost import sklearn print('sklearn version: %s' % sklearn.__version__) print('xgboost version: %s' % xgboost.__version__) X, y = load_iris(return_X_y=True) # Without using the pipeline: xgb = XGBClassifier() xgb.fit(X, y, eval_metric='auc') # works fine # Making a pipeline with this classifier and a scaler: pipe = Pipeline([('scaler', StandardScaler()), ('classifier', XGBClassifier())]) # using the pipeline, but not optimizing for 'auc': pipe.fit(X, y) # works fine # however this does not work (even after correcting the underscores): pipe.fit(X, y, classifier__eval_metric='auc') # fails

关于xgboost的版本:
TypeError: before_fit() got an unexpected keyword argument 'classifier__eval_metric'显示0.6
xgboost.__version__显示pip3 freeze | grep xgboost

2 个答案:

答案 0 :(得分:4)

错误是因为在管道中使用时,在估算器名称及其参数之间使用单个下划线。它应该是两个下划线。

documentation of Pipeline.fit(),我们看到正确的方式提供params in fit:

  

传递给每个步骤的fit方法的参数,其中每个参数名称都带有前缀,使得步骤s的参数p具有键s__p。

所以在你的情况下,正确的用法是:

pipe.fit(X_train, y_train, classifier__eval_metric='auc')

(注意名称和参数之间的两个下划线)

答案 1 :(得分:0)

当目标是优化时,我建议使用sklearn包装器和GridSearchCV

from xgboost.sklearn import XGBClassifier
from sklearn.grid_search import GridSearchCV

看起来像

pipe = Pipeline([('scaler', StandardScaler()), ('classifier', XGBClassifier())])

score = 'roc_auc'
pipe.fit(X, y) 

param = {
 'classifier_max_depth':[1,2,3,4,5,6,7,8,9,10] # just as example
}

gsearch = GridSearchCV(estimator =pipe, param_grid =param , scoring= score)

您还可以使用交叉验证技术

gsearch.fit(X, y)

您将获得最佳的参数和最佳的分数

gsearch.best_params_, gsearch.best_score_