Sklearn pass fit() parameters to xgboost in pipeline
keyword-argument, pipeline, python, scikit-learn, xgboost
Solution
For the early stopping rounds, you must always specify the validation set given by the argument eval_set. Here is how the error in your code can be fixed.
pipeline.fit(X_train, y_train, clf__early_stopping_rounds=20, clf__eval_set=[(test_X, test_y)])
Problem
Similar to How to pass a parameter to only one part of a pipeline object in scikit learn? I want to pass parameters to only one part of a pipeline. Usually, it should work fine like: ``` estimator = XGBClassifier() pipeline = Pipeline([ ('clf', estimator) ]) ``` and executed like ``` pipeline.fit(X_train, y_train, clf__early_stopping_rounds=20) ``` but it fails with: ``` /usr/local/lib/python3.5/site-packages/sklearn/pipeline.py in fit(self, X, y, **fit_params) 114 """ 115 Xt, yt, fit_params = self._pre_transform(X, y, **fit_params) --> 116 self.steps[-1][-1].fit(Xt, yt, **fit_params) 117 return self 118 /usr/local/lib/python3.5/site-packages/xgboost-0.6-py3.5.egg/xgboost/sklearn.py in fit(self, X, y, sample_weight, eval_set, eval_metric, early_stopping_rounds, verbose) 443 early_stopping_rounds=early_stopping_rounds, 444 evals_result=evals_result, obj=obj, feval=feval, --> 445 verbose_eval=verbose) 446 447 self.objective = xgb_options["objective"] /usr/local/lib/python3.5/site-packages/xgboost-0.6-py3.5.egg/xgboost/training.py in train(params, dtrain, num_boost_round, evals, obj, feval, maximize, early_stopping_rounds, evals_result, verbose_eval, learning_rates, xgb_model, callbacks) 201 evals=evals, 202 obj=obj, feval=feval, --> 203 xgb_model=xgb_model, callbacks=callbacks) 204 205 /usr/local/lib/python3.5/site-packages/xgboost-0.6-py3.5.egg/xgboost/training.py in _train_internal(params, dtrain, num_boost_round, evals, obj, feval, xgb_model, callbacks) 97 end_iteration=num_boost_round, 98 rank=rank, ---> 99 evaluation_result_list=evaluation_result_list)) 100 except EarlyStopException: 101 break /usr/local/lib/python3.5/site-packages/xgboost-0.6-py3.5.egg/xgboost/callback.py in callback(env) 196 def callback(env): 197 """internal function""" --> 198 score = env.evaluation_result_list[-1][1] 199 if len(state) == 0: 200 init(env) IndexError: list index out of range ``` Whereas a ``` estimator.fit(X_train, y_train, early_stopping_rounds=20) ``` works just fine.