【问题标题】:Sklearn pass fit() parameters to xgboost in pipelineSklearn 在管道中将 fit() 参数传递给 xgboost
【发布时间】:2017-03-12 19:00:45
【问题描述】:

类似于How to pass a parameter to only one part of a pipeline object in scikit learn? 我只想将参数传递给管道的一部分。通常,它应该可以正常工作:

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)

工作得很好。

【问题讨论】:

    标签: python scikit-learn pipeline xgboost keyword-argument


    【解决方案1】:

    我最近使用以下步骤为 Xgboost 使用 eval metric 和 eval_set 参数。

    1。使用预处理/特征转换步骤创建管道:

    这是由前面定义的管道制成的,其中包括 xgboost 模型作为最后一步。

    pipeline_temp = pipeline.Pipeline(pipeline.cost_pipe.steps[:-1])  
    

    2。适合此管道

    X_trans = pipeline_temp.fit_transform(X_train[FEATURES],y_train)
    

    3。通过将转换应用于测试集来创建您的 eval_set

    eval_set = [(X_trans, y_train), (pipeline_temp.transform(X_test), y_test)]
    

    4。将您的 xgboost 步骤重新添加到管道中

     pipeline_temp.steps.append(pipeline.cost_pipe.steps[-1])
    

    5。通过传递参数来适应新管道

    pipeline_temp.fit(X_train[FEATURES], y_train,
                 xgboost_model__eval_metric = ERROR_METRIC,
                 xgboost_model__eval_set = eval_set)
    

    6。如果您愿意,请保留管道。

    joblib.dump(pipeline_temp, save_path)
    

    【讨论】:

    • 这似乎是所有发布的答案中最好的解决方案。
    • 这不适用于 scikit-learn 的 0.23.2 版本
    • 嘿@ucsky,你能建议上面代码的哪个特定部分不起作用吗?
    【解决方案2】:

    对于早期停止轮次,您必须始终指定由参数 eval_set 给出的验证集。以下是如何修复代码中的错误。

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

    【讨论】:

      【解决方案3】:

      这是解决方案: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 都需要通过。不幸的是,这对我不起作用,因为监视列表中的变量需要一个仅在管道中应用的预处理步骤/我需要手动应用此步骤。

      【讨论】:

      • 我认为如果你不接受这个答案会更好。您的问题基本上是“我如何在 sklearn 管道中执行 [x]”,而您链接到的答案不使用 sklearn 管道。您甚至在回答中说您因此接受了“这对您不起作用”。如果有人确实提出了如何在管道中执行此操作的答案,那么最好接受。
      猜你喜欢
      • 2021-09-25
      • 2021-03-19
      • 1970-01-01
      • 2017-11-26
      • 2021-08-23
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      相关资源
      最近更新 更多