gpt4 book ai didi

python - 在 SciKit-Learn 中使用 XGBoost 的交叉验证进行网格搜索和提前停止

转载 作者:太空狗 更新时间:2023-10-29 21:06:37 26 4
gpt4 key购买 nike

我是 sci-kit learn 的新手,一直在尝试对 XGBoost 进行超参数调整。我的目标是使用早停和网格搜索来调整模型参数,并使用早停来控制树的数量并避免过度拟合。

因为我在网格搜索中使用交叉验证,所以我希望在早期停止条件中也使用交叉验证。到目前为止,我的代码如下所示:

import numpy as np
import pandas as pd
from sklearn import model_selection
import xgboost as xgb

#Import training and test data
train = pd.read_csv("train.csv").fillna(value=-999.0)
test = pd.read_csv("test.csv").fillna(value=-999.0)

# Encode variables
y_train = train.price_doc
x_train = train.drop(["id", "timestamp", "price_doc"], axis=1)

# XGBoost - sklearn method
gbm = xgb.XGBRegressor()

xgb_params = {
'learning_rate': [0.01, 0.1],
'n_estimators': [2000],
'max_depth': [3, 5, 7, 9],
'gamma': [0, 1],
'subsample': [0.7, 1],
'colsample_bytree': [0.7, 1]
}

fit_params = {
'early_stopping_rounds': 30,
'eval_metric': 'mae',
'eval_set': [[x_train,y_train]]
}

grid = model_selection.GridSearchCV(gbm, xgb_params, cv=5,
fit_params=fit_params)
grid.fit(x_train,y_train)

我遇到的问题是“eval_set”参数。我知道这需要预测变量和响应变量,但我不确定如何使用交叉验证数据作为提前停止标准。

有谁知道如何解决这个问题?谢谢。

最佳答案

您可以将 early_stopping_rounds 和 eval_set 作为额外的 fit_params 传递给 GridSearchCV,这实际上会起作用。但是,GridSearchCV 不会更改不同折叠之间的 fit_params,因此您最终会在所有折叠中使用相同的 eval_set,这可能不是您所说的 CV 的意思。

model=xgb.XGBClassifier()
clf = GridSearchCV(model, parameters,
fit_params={'early_stopping_rounds':20,\
'eval_set':[(X,y)]},cv=kfold)

经过一些调整后,我发现集成 early_stopping_rounds 和 sklearn API 的最安全方法是自己实现一个 early_stopping 机制。如果您使用 n_rounds 作为要调整的参数执行 GridSearchCV,则可以做到这一点。然后,您可以随着 n_rounds 的增加观察不同模型的 mean_validation_score。然后您可以为提前停止定义自定义启发式。它不会节省评估所有可能的 n_rounds 所需的计算时间

我认为这也是一种比使用单个拆分保留更好的方法。

关于python - 在 SciKit-Learn 中使用 XGBoost 的交叉验证进行网格搜索和提前停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43866284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com