Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sklearn将fit()参数传递到xgboost管道中_Python_Scikit Learn_Pipeline_Xgboost_Keyword Argument - Fatal编程技术网

Python Sklearn将fit()参数传递到xgboost管道中

Python Sklearn将fit()参数传递到xgboost管道中,python,scikit-learn,pipeline,xgboost,keyword-argument,Python,Scikit Learn,Pipeline,Xgboost,Keyword Argument,类似于,我只想将参数传递到管道的一部分。通常,它应该工作良好,如: 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

类似于,我只想将参数传递到管道的一部分。通常,它应该工作良好,如:

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)

工作正常。

这是解决方案:早期弯腰和观察名单/评估集都需要通过。不幸的是,这对我不起作用,因为观察列表上的变量需要一个预处理步骤,该步骤只在管道中应用/I需要手动应用该步骤。

对于早期停止循环,您必须始终指定参数eval\u set给出的验证集。下面是如何修复代码中的错误

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

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

1.使用预处理/特征转换步骤创建管道: 这是根据前面定义的管道完成的,其中包括xgboost模型作为最后一步。 2.安装这条管道 3.通过对测试集应用转换来创建评估集 4.将xgboost步骤添加回管道 5.通过传递参数来安装新管道 6.如果愿意,请持久化管道。
我想如果你不接受这个答案会更好。您的问题基本上是“如何在sklearn管道中执行[x]”,您链接到的答案不使用sklearn管道。你甚至在你的回答中说,你接受了“这对你不起作用”,因为这一点。如果有人提出了如何在管道中实现这一点的答案,那么最好接受这个答案。这似乎是发布的所有答案中最好的解决方案。这不适用于scikit learnHey@ucsky的0.23.2版本,您能建议上面代码的哪一部分不起作用吗?
pipeline_temp = pipeline.Pipeline(pipeline.cost_pipe.steps[:-1])  
X_trans = pipeline_temp.fit_transform(X_train[FEATURES],y_train)
eval_set = [(X_trans, y_train), (pipeline_temp.transform(X_test), y_test)]
 pipeline_temp.steps.append(pipeline.cost_pipe.steps[-1])
pipeline_temp.fit(X_train[FEATURES], y_train,
             xgboost_model__eval_metric = ERROR_METRIC,
             xgboost_model__eval_set = eval_set)
joblib.dump(pipeline_temp, save_path)