我正在尝试使用XGBoost,并将eval_metric
优化为auc
(如所述here)。
当直接使用分类器时,这很好,但当我试图将其用作pipeline时失败。
向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
错误:TypeError: before_fit() got an unexpected keyword argument 'classifier__eval_metric'
关于xgboost的版本:xgboost.__version__
显示0.6pip3 freeze | grep xgboost
显示xgboost==0.6a2
。
错误是因为在管道中使用时,估计器名称与其参数之间使用了一个下划线。应该是两个下划线。
从documentation of Pipeline.fit()中,我们可以看到提供合适参数的正确方法:
因此,在您的情况下,正确的用法是:
(注意name和param之间有两个下划线)
当目标是优化时,我建议使用sklearn包装器和GridSearchCV
看起来像
也可以使用交叉验证技术
你得到了最好的参数和最好的分数
相关问题 更多 >
编程相关推荐