簡體   English   中英

Sklearn 將 fit() 參數傳遞給管道中的 xgboost

[英]Sklearn pass fit() parameters to xgboost in pipeline

類似於如何在 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)

工作得很好。

對於提前停止輪次,您必須始終指定參數 eval_set 給出的驗證集。 以下是修復代碼中錯誤的方法。

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

這是解決方案: https ://www.kaggle.com/c/otto-group-product-classification-challenge/forums/t/13755/xgboost-early-stopping-and-other-issues early_stooping_rounds 和觀察名單/ eval_set 需要通過。 不幸的是,這對我不起作用,因為監視列表中的變量需要一個僅在管道中應用的預處理步驟/我需要手動應用此步驟。

我最近使用以下步驟為 Xgboost 使用 eval 指標和 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM