2016-10-30 15 views
4

Как и для How to pass a parameter to only one part of a pipeline object in scikit learn? Я хочу передать параметры только одной части трубопровода. Как правило, он должен работать нормально, как:Параметры настройки прохода Sklearn для xgboost в трубопроводе

estimator = XGBClassifier() 
pipeline = Pipeline([ 
     ('clf', estimator) 
    ]) 

и выполнен как

pipeline.fit(X_train, y_train, clf__early_stopping_rounds=20) 

но он терпит неудачу с:

/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 

В то время как

estimator.fit(X_train, y_train, early_stopping_rounds=20) 

работает просто отлично.

ответ

5

Это решение: https://www.kaggle.com/c/otto-group-product-classification-challenge/forums/t/13755/xgboost-early-stopping-and-other-issues и early_stooping_rounds, и список наблюдения/eval_set необходимо передать. К сожалению, это не работает для меня, так как переменные в списке наблюдения потребуют шаг предварительной обработки, который применяется только в конвейере/мне нужно будет применить этот шаг вручную.

+3

Я думаю, было бы лучше, если бы вы не приняли этот ответ. Ваш вопрос в основном «как я [x] в конвейере sklearn», и ответ, на который вы ссылаетесь, не использует конвейер sklearn. и вы даже говорите в своем ответе, что вы согласились, что из-за этого вы «это не сработаете». Если кто-то придумал ответ, как это сделать в трубопроводе, было бы лучше, чтобы это было принято. –

1

Для ранних раундов остановки вы всегда должны указывать набор валидаций, заданный аргументом eval_set. Вот как можно исправить ошибку в коде.

pipeline.fit(X_train, y_train, clf__early_stopping_rounds=20, clf__eval_set=[(test_X, test_y)]) 

 Смежные вопросы

  • Нет связанных вопросов^_^