2016-10-30 10 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) 

と同様に実行が、それはで失敗します。うまく

estimator.fit(X_train, y_train, 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 

答えて

5

解決策:https://www.kaggle.com/c/otto-group-product-classification-challenge/forums/t/13755/xgboost-early-stopping-and-other-issues early_stooping_roundsとwatchlist/eval_setの両方を渡す必要があります。残念ながら、これはウォッチリストの変数がパイプラインにのみ適用される前処理ステップを必要とするため、私にとっては機能しません。このステップを手動で適用する必要があります。

+3

この回答を受け入れないと良いと思います。あなたの質問は、基本的には「私はスケーリンパイプラインでどのように[x]を行うのですか?」とあなたがリンクしている答えはスクリーンパイプラインを使用していません。そして、あなたはあなたの答えで、あなたがそれのために "これはあなたのために働かない"ということを認めました。誰かがパイプラインでこれを行う方法の答えに沿って来たら、それが受け入れられる方が良いでしょう。 –

1

早期停止ラウンドでは、引数eval_setによって指定された検証セットを常に指定する必要があります。コード内のエラーを修正する方法は次のとおりです。

関連する問題