2016-10-30 3 views
4

Ähnlich wie How to pass a parameter to only one part of a pipeline object in scikit learn? Ich möchte Parameter an nur einen Teil einer Pipeline übergeben. Normalerweise sollte es funktionieren wie:Sklearn pass passen Parameter zu xgboost in Pipeline

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

und ausgeführt wie

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

aber es funktioniert nicht mit:

/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 

Während ein

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

funktioniert gut.

Antwort

5

Dies ist die Lösung: https://www.kaggle.com/c/otto-group-product-classification-challenge/forums/t/13755/xgboost-early-stopping-and-other-issues sowohl early_stooping_rounds als auch die Watchlist/eval_set müssen übergeben werden. Leider funktioniert das nicht für mich, da die Variablen auf der Watchlist einen Vorverarbeitungsschritt erfordern würden, der nur in der Pipeline angewendet wird. Ich müsste diesen Schritt manuell anwenden.

+3

Ich denke, es wäre besser, wenn Sie diese Antwort nicht akzeptiert. Ihre Frage ist im Grunde "wie mache ich [x] in einer sklearn-Pipeline" und die Antwort, auf die Sie verlinken, verwendet keine sklearn-Pipeline. und du sagst sogar in deiner Antwort, dass du deswegen akzeptiert hast, dass "das nicht funktioniert". Wenn jemand mit einer Antwort darauf gekommen wäre, wie man das in einer Pipeline macht, wäre es besser, dass das akzeptiert wird. –

1

Für die frühen Stopp-Runden müssen Sie immer die Validierungsmenge angeben, die durch das Argument eval_set angegeben wird. Hier ist, wie der Fehler in Ihrem Code behoben werden kann.

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